0

我的主要方法中有这行代码:

IntPtr hhook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, procDelegate, 0, 0, WINEVENT_OUTOFCONTEXT);

然后我在课堂上有这个:

delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime);

    static void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
    // filter out non-HWND namechanges... (eg. items within a listbox)
    if (idObject != 0 || idChild != 0)
    {
        return;
    }

    SaveImage(Capture(hwnd), hwnd);
    Console.WriteLine("Handle: {0:x8}", hwnd.ToInt32());
}

我对这段代码有一个小问题,很难说清楚,所以请耐心等待。这段代码背后的基本思想是,我想在前台截取当前应用程序的屏幕截图并将其保存到 C 驱动器上的某个位置。到目前为止,我的代码允许我这样做,但它并不总是完全按照我想要的方式工作。问题是,有时当我单击应用程序(因此将其置于前台)时,它会在窗口有时间完全最大化之前拍摄照片。这导致我的屏幕截图文件夹中充满了应用程序背后的桌面屏幕截图。

有没有办法等到窗口完全最大化,然后再调用我的屏幕截图功能?

4

2 回答 2

2

您可以使用SetWindowsHookExwithWH_CALLWNDPROCRET来了解窗口何时WM_PAINT处理。或者,您可以通过在截取屏幕截图之前延迟一点来破解它,从实际的角度来看,这可能是您真正需要的。

于 2013-09-18T19:33:14.433 回答
0

这可能是你要找的吗? http://msdn.microsoft.com/en-us/library/system.windows.uielement.isvisible.aspx

user32.dll 包括 IsWindowVisible http://msdn.microsoft.com/en-us/library/windows/desktop/ms633530(v=vs.85).aspx

于 2013-09-18T19:23:13.590 回答