我想构建一个应用程序来监视所有正在运行的 Windows 焦点更改事件。我知道 WM_KILLFOCUS (0x0008) 和 WM_SETFOCUS(0x0007) 并且当窗口失去焦点或获得焦点时,将发送消息。在 spy++ 的帮助下,我得到如下输出:
<00001> 0005069A S WM_SETFOCUS hwndLoseFocus:(null)
<00002> 0005069A R WM_SETFOCUS
<00003> 0005069A S WM_KILLFOCUS hwndGetFocus:(null)
<00004> 0005069A R WM_KILLFOCUS
<00005> 00010096 S WM_SETFOCUS hwndLoseFocus:(null)
<00006> 00010096 R WM_SETFOCUS
我尝试编写以下 c# 代码以使其在我的 winfrom 应用程序中工作:
[StructLayout(LayoutKind.Sequential)]
public struct NativeMessage
{
public IntPtr handle;
public uint msg;
public IntPtr wParam;
public IntPtr lParam;
public uint time;
public System.Drawing.Point p;
}
[DllImport("user32.dll")]
public static extern sbyte GetMessage(out NativeMessage lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax);
NativeMessage msg = new NativeMessage();
sbyte ret;
while ((ret = GetMessage( out msg, IntPtr.Zero, 0, 0)) != -1)
{
if (ret == -1)
{
//-1 indicates an error
}
else
{
if (msg.msg == 0x0008 || msg.msg == 0x0007)
{
this.textBox1.Text = "ret is: " + ret;
}
}
}
不幸的是,我从未收到 WM_KILLFOCUS 和 WM_SETFOCUS 消息。
当我发现所有正在运行的窗口中发生获取/丢失焦点事件时,我实际上想在我的应用程序中触发一个事件。我怎样才能让它工作?
谢谢。