作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 C# 项目中,我试图拦截来自另一个程序的鼠标点击,但也只有来自某个 hwnd 的鼠标点击……我读过 here我可以使用 lParam 过滤我的消息,但我没有成功地将它转换为我实际上可以从中获取 Hwnd 的东西。
这是我设置全局鼠标 Hook 的方式:
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;
当使用第一个选项时,hwnd 部分总是为 0,而对于不安全的版本,我什么也得不到...我真的不知道我做错了什么。任何帮助将不胜感激:)
谢谢
最佳答案
由于您正在 Hook 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 位平台上正常工作。
附加链接:
关于c# - 将 IntPtr 转换为 CWPSTRUCT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12877876/
在我的 C# 项目中,我试图拦截来自另一个程序的鼠标点击,但也只有来自某个 hwnd 的鼠标点击……我读过 here我可以使用 lParam 过滤我的消息,但我没有成功地将它转换为我实际上可以从中获取
我是一名优秀的程序员,十分优秀!