C# 将IntPtr转换为CWP结构

C# 将IntPtr转换为CWP结构,c#,intptr,mouse-hook,C#,Intptr,Mouse Hook,在我的c#项目中,我试图拦截来自另一个程序的鼠标点击,但也只拦截来自某个hwnd的鼠标点击……我读到我可以使用lParam过滤我的消息,但我没有成功地将其转换为可以从中获得hwnd的消息 下面是我如何设置全局鼠标挂钩的: SetWindowsHookEx(WH_MOUSE_LL, s_MouseDelegate, IntPtr.Zero, 0); 然后,我捕获此函数中的消息: private static int MouseHookProc(int nCode, int wParam, Int

在我的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;
}
这里是可能出错的部分…我尝试了两件事:

CWPSTRUCT cwp = (CWPSTRUCT)Marshal.PtrToStructure(lParam, typeof(CWPSTRUCT));
或不安全版本:

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


谢谢

因为您正在挂接
WH\u MOUSE\u LL
lParam
包含指向的指针,而不是(实际上是用于
WH\u 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位平台上正常工作

其他链接:


非常感谢!这解决了我的问题。我还有一个小问题要问。。。UIntPtr dwExtraInfo,它到底包含什么?(与该消息相关的附加信息。)因为我认为它可能是我单击的窗口?但我不认为是因为它也是0。我通过使用获得了我现在单击的窗口的句柄,这是正确的方法吗?@VincentC
dwExtraInfo
似乎是对特定于应用程序的额外信息的引用。@VincentC是的,您可以使用来获取hwnd。尽管最好为or创建一个全局钩子。您可以在此处阅读:
MSLLHOOKSTRUCT mouseLowLevelHook = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam,
    typeof(MSLLHOOKSTRUCT));