在我的c#项目中,我试图拦截来自另一个程序的鼠标单击,但是也仅拦截来自某个hwnd的单击。成功地将其投放到我可以从中获得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));


或不安全的版本here

CWPSTRUCT* cp = (CWPSTRUCT*)lParam;


使用第一个选项时,我的hwnd部分始终为0,而​​使用不安全的版本,我什么也没有得到……我真的不知道我在做什么错。任何帮助,将不胜感激 :)

谢谢

最佳答案

由于您钩住WH_MOUSE_LL,因此lParam包含指向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位平台上正常工作。

附加链接:


Hook Overview
SetWindowsHookEx
LowLevelMouseProc callback function

关于c# - 将IntPtr转换为CWPSTRUCT,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12877876/

10-13 04:03