将IntPtr转换为CWPSTRUCT

时间:2012-10-13 23:18:57

标签: c# intptr mouse-hook

在我的c#项目中,我试图拦截来自另一个程序的鼠标点击,但也只是来自某个hwnd的那些...我已经读过here我可以使用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;
}

这就是它可能出错的部分......我尝试了两件事:

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

或不安全的版本this is where I got it from

CWPSTRUCT* cp = (CWPSTRUCT*)lParam;

当使用第一个选项时,我总是得到0为hwnd部分和不安全的版本我什么都没得到...我真的不知道我在这里做错了什么。任何帮助将不胜感激:)

由于

1 个答案:

答案 0 :(得分:3)

由于您正在挂钩WH_MOUSE_LLlParam包含指向MSLLHOOKSTRUCT而非CWPSTRUCT的指针(实际上是WH_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;
}

并将lParam编组为MSLLHOOKSTRUCT

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

此外,您应该将wParam的类型从int更改为IntPtr,以便它可以在64位平台上正常运行。

其他链接: