понедельник, 17 марта 2014 г.

WinAPI? не, не слышал.

Да, появляются новые технологии. Приходят на смену и таки сменяют. Становится труднее найти людей, знакомых с названием "Философия программирования 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), с обнулением кода ошибки перед каждым вызовом и его получением после вызова, разворачиванием кода ошибки в понятное и информативное сообщение, анализом конкретных нерабочих ситуаций и добавлением новой логики для их обработки.