WinEvent> EVENT_SYSTEM_FOREGROUND<调用有时会延迟

时间:2017-01-02 14:54:30

标签: c# windows

对于私人项目(在我的Windows PC上),我想知道活动窗口何时发生变化。所以我实现了一个小类设置一个挂钩到WinEvent “EVENT_SYSTEM_FOREGROUND”。前景窗口更改时应触发回调。 (由MS指定)
一般情况下,当我点击打开的窗口时,它会按预期工作 但是,如果我最小化并最大化应用程序,当我最小化窗口时,事件总是调用两次,当 时,没有调用最大化它。所以最后我才知道窗口在它再次变为非活动状态后处于活动状态。

序列可能如下例所示:
//点击Win1
窗口更改为Win1
//点击Win2
窗口改为Win2
//点击Win1
窗口更改为Win1
//最小化任务栏中的Win1 窗口更改为Win1
窗口改为Win2
//在任务栏中最大化Win1 // - >在这里,我希望我得到一个调用,所以我可以对事件做出反应 //最小化任务栏中的Win1 窗口更改为Win1 // - >迟到的 窗口更改为Win2

有人可以解释一下吗?

我的(基本)源代码:
(所有User32-Methods标准地来自user32.dll,常量定义为MSDN中指定的)

internal class WinEventListener
{
    private readonly IntPtr focusChangedWinHook;

    public WinEventListener()
    {
        User32.WinEventDelegate callback = WinEventProc;

        focusChangedWinHook = User32.SetWinEventHook(
            User32.EVENT_SYSTEM_FOREGROUND,
            User32.EVENT_SYSTEM_FOREGROUND,
            IntPtr.Zero,
            callback,
            0,
            0,
            User32.WINEVENT_OUTOFCONTEXT
        );
    }

    ~WinEventListener()
    {
        User32.UnhookWinEvent(focusChangedWinHook);
    }

    void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
    {
        // Doing my stuff after invocation
    }
}

0 个答案:

没有答案