如何用c#捕获窗口焦点变化事件

时间:2012-10-11 08:26:09

标签: c# events window focus

我想构建一个应用程序来监视所有正在运行的窗口焦点更改事件。我知道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。

当我发现在所有正在运行的窗口中发生get / lost焦点事件时,我实际上想在我的应用程序中触发事件。我怎样才能使它工作?

感谢。

2 个答案:

答案 0 :(得分:0)

使用Form.ActivedForm.Deactivate事件来确定表单是否丢失或获得焦点。

答案 1 :(得分:0)

如果您真的想进入本地窗口消息的讨厌世界,您应该使用WndProc