Да, появляются новые технологии. Приходят на смену и таки сменяют. Становится труднее найти людей, знакомых с названием "Философия программирования Windows 95/NT".
Однако, это не повод для такого кода:
Однако, это не повод для такого кода:
public static Image GetImage(IntPtr handle) {
if(handle != IntPtr.Zero) {
User32.SetForegroundWindow(handle);
System.Threading.Thread.Sleep(200);
IntPtr hdcSrc = User32.GetWindowDC(handle);
User32.RECT windowRect = new User32.RECT();
User32.GetWindowRect(handle, ref windowRect);
int width = windowRect.right - windowRect.left;
int height = windowRect.bottom - windowRect.top;
if(handle != IntPtr.Zero) {
User32.SetWindowPos(handle, IntPtr.Zero, 0, 0, width, height, 0);
Thread.Sleep(500);
}
IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height);
IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);
GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);
GDI32.SelectObject(hdcDest, hOld);
GDI32.DeleteDC(hdcDest);
User32.ReleaseDC(handle, hdcSrc);
Image img = Image.FromHbitmap(hBitmap);
GDI32.DeleteObject(hBitmap);
return img;
}
else {
return GetImage(User32.GetDesktopWindow());
}
}
14 вызовов функций WinAPI и ни одной проверки кода ошибки...
Это помимо рекурсивного вызова с передачей GetDesktopWindow и попытками выставить ему SetForegroundWindow и передвинуть его в левый верхний угол. ржупадсталом...
Для managed code такие вызовы WinAPI функций следует выполнять специальным образом, как это показано в "GetLastError and managed code" (не нашел аналогичного описания в самой доке MSDN), с обнулением кода ошибки перед каждым вызовом и его получением после вызова, разворачиванием кода ошибки в понятное и информативное сообщение, анализом конкретных нерабочих ситуаций и добавлением новой логики для их обработки.
Комментариев нет:
Отправить комментарий