在我的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/