3

私のC#プロジェクトでは、別のプログラムからのマウスクリックをインターセプトしようとしていますが、特定のhwndからのものだけです.lParamを使用してメッセージをフィルタリングできることをここで読みましたが、成功していません実際にHwndを取り戻すことができるものにキャストします。

これは、グローバル マウス フックを設定する方法です。

SetWindowsHookEx(WH_MOUSE_LL, s_MouseDelegate, IntPtr.Zero, 0);

次に、この関数でメッセージをキャッチします。

private static int MouseHookProc(int nCode, int wParam, IntPtr lParam)
{
    if (nCode >= 0)
    {
          switch (wParam)
          {
               case WM_LBUTTONDOWN:
                    mouseDown = true;
                    mouseUp = false;
                    break;
               case WM_LBUTTONUP:
                    mouseUp = true;
                    mouseDown = false;
                    break;
          }
     }
     return CallNextHookEx(s_MouseHookHandle, nCode, wParam, lParam);
}

次に、CWPSTRUCT を次のように作成しました。

[StructLayout(LayoutKind.Sequential)]
public struct CWPSTRUCT
{
    public IntPtr lparam;
    public IntPtr wparam;
    public int message;
    public IntPtr hwnd;
}

そして、これがおそらくうまくいかない部分です...私は2つのことを試しました:

CWPSTRUCT cwp = (CWPSTRUCT)Marshal.PtrToStructure(lParam, typeof(CWPSTRUCT));

または、これは私が入手した安全でないバージョンです:

CWPSTRUCT* cp = (CWPSTRUCT*)lParam;

最初のオプションを使用すると、常に hwnd 部分が 0 になり、安全でないバージョンでは何も得られません...ここで何が間違っているのか本当にわかりません。どんな助けでも大歓迎です:)

ありがとう

4

1 に答える 1

4

をフックWH_MOUSE_LLしているので、の代わりにlParamへのポインタが含まれています(これは実際には です)。MSLLHOOKSTRUCTCWPSTRUCTWH_CALLWNDPROC

したがって、次の構造を定義する必要があります。

[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
    public int X;
    public int Y;
}

[StructLayout(LayoutKind.Sequential)]
public struct MSLLHOOKSTRUCT
{
    public POINT pt;
    public int mouseData;
    public int flags;
    public int time;
    public UIntPtr dwExtraInfo;
}

そしてマーシャリングlParamMSLLHOOKSTRUCTます:

MSLLHOOKSTRUCT mouseLowLevelHook = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam,
    typeof(MSLLHOOKSTRUCT));

また、wParamのタイプを からintに変更してIntPtr、64 ビット プラットフォームで適切に動作するようにする必要があります。

追加のリンク:

于 2012-10-14T01:28:40.927 に答える