- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经设置了一个 WH_MOUSE
钩子(Hook),一切正常,除了我无法获得传递给我的 HOOKPROC
函数在 C# 中正确翻译。
我的项目由两部分组成,C++ 中的非托管部分执行 Hook 和过滤并通知我的托管代码。
问题是我得到的数据不正确,例如转换 lparam
后奇怪的 X 和 Y 坐标。 X 大多数时候是 0,而 Y 大多数时候是正确的,然后每隔一次点击我得到一个值,比如 X 的 198437245 和 Y 的 -1 等。
请注意,我已经确认了以下内容:
lparam
的值已正确传递到我的 C# 代码(通过托管和非托管部分上的断点进行验证),例如当发生鼠标事件时,它们都是 2420528
。lparam
的值是正确的,因为我可以使用以下方法成功地将它转换为非托管部分中的有效坐标:
POINT pt = reinterpret_cast<MOUSEHOOKSTRUCT*>(lparam)->pt;
int x = pt.x; // correct, e.g. 250
int y = pt.y; // correct, e.g. 400
但是,使用下面的翻译后,X和Y变成了乱码。
这是我的 C++ HOOKPROC
函数:
static LRESULT CALLBACK InternalMouseHookCallback(int code, WPARAM wparam, LPARAM lparam)
{
// filter messages
// ...
// send lparam to C# code
}
这是我在 C# 中翻译 lparam
的方式:
IntPtr lparam = ...; // passed from unmanaged code and confirmed to be the same value
MouseHookStruct mouseData =
(MouseHookStruct)Marshal.PtrToStructure(lparam, typeof(MouseHookStruct));
下面是我如何将 POINT
和 MOUSEHOOKSTRUCT
结构映射到 C#:
[StructLayout(LayoutKind.Sequential)]
public class POINT
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Sequential)]
public class MouseHookStruct
{
public POINT pt;
public IntPtr hwnd;
public uint wHitTestCode;
public IntPtr dwExtraInfo;
}
我做错了什么?
更新
C++ 中的sizeof(MOUSEHOOKSTRUCT)
和 C# 中的 Marshal.SizeOf(typeof(MouseHookStruct))
都打印 20
。
我使用的是 Windows 7 64 位,但 C# 和 C++ 代码均以 32 位编译和运行。
最佳答案
public class POINT
POINT 是原生 winapi 中的一个结构体。您倾向于在 C# 中将其声明为类。但不是什么时候:
public class MouseHookStruct
{
public POINT pt;
// etc...
}
pt
字段现在是一个引用,而不是一个值。编码器将尝试取消对 MOUSEHOOKSTRUCT.pt 的引用,就好像它是一个指针一样。非常值得注意的是,这不会更频繁地产生响亮的爆炸声,顺便说一句,预计会出现 AccessViolationException。可能您不走运,只在辅助显示器上进行过测试。
您必须将其声明为 struct
。
关于c# - 如何在托管代码中正确翻译 WH_MOUSE lparam,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33546319/
我想问一个关于我一直遇到的问题的问题。 我使用以下函数安装了一个 WH_MOUSE Hook : hMouseHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)M
我已经设置了一个 WH_MOUSE 钩子(Hook),一切正常,除了我无法获得传递给我的 HOOKPROC 函数在 C# 中正确翻译。 我的项目由两部分组成,C++ 中的非托管部分执行 Hook 和过
我手上有一些代码可以全局打印鼠标坐标(使用 WH_MOUSE_LL)。我的目标是使用 WH_MOUSE 而不是 WH_MOUSE_LL 因为(根据我的阅读)它更快。我在论坛上读到,当使用 WH_MOU
赫洛斯, 在 WinXP 上,我的应用程序已成功使用全局鼠标 Hook 来检索鼠标位置并单击,即使它没有焦点。该钩子(Hook)位于一个单独的 .dll 中,并且像这样初始化(在 delphi 中):
我在监视鼠标手势的 DLL 中设置了这个全局鼠标 Hook 。 一切正常,但为 WH_MOUSE_LL 设置了一个 Hook ,这是一个低级 Hook ,不需要在外部可注入(inject) DLL 中
我发现 WH_MOUSE 并不总是被调用。问题可能是我使用的是 WH_MOUSE 而不是 WH_MOUSE_LL? 代码: class MouseHook { public: static sig
(我的母语不是英语,我用的是google翻译,然后修改。如果有不对的地方,请原谅我糟糕的英语。) 我的目标是在MS Word中做一个带滚动条的Userform,希望能用鼠标滚轮滚动。 但 VBA 不提
我使用 SetWindowsHookEx() 来捕获 WM_MOUSEMOVE,而不是使用 TrackMouseEvent 来捕获 WM_MOUSELEAVE,但是我的 MouseHook 没有捕获
我是一名优秀的程序员,十分优秀!