0

実行中のすべての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

winfromアプリケーションで機能させるために、次のc#コードを記述しようとしました。

[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 focusイベントが発生したときに、実際にアプリケーションでイベントをトリガーしたいと思います。どうすればそれを機能させることができますか?

ありがとう。

4

2 に答える 2

0

Form.Activedおよびイベントを使用してForm.Deactivate、フォームがフォーカスを失ったかどうかを調べます。

于 2012-10-11T08:37:49.883 に答える
0

本当にネイティブ ウィンドウ メッセージの厄介な世界に入りたい場合は、WndProcを使用する必要があります。

于 2012-10-11T08:40:23.230 に答える