对于私人项目(在我的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
}
}