- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试实现 http://www.codeproject.com/KB/threads/winspy.aspx 中的一些代码(子类化部分)到我的项目中,但遇到一些问题,我调试了 dll,似乎当我向 Hook 线程的 hwnd 发送完全相同的消息(或者我认为)时,消息似乎有所不同(我看到这要归功于调试dll 文件直接通过 Visual Studio)。
因此,从一开始,我就为所有 dll 实例共享我的自定义 winregistered mssg。这里我写的是我在这两个项目中使用的内容(从上面的网站下载的一个,以及我当前尝试模仿相同策略的一个)
我首先与所有 dll 实例共享稍后将注册的消息(在 dll 进程 atach 中)..
#pragma data_seg("Shared")UINT WM_HOOKEX = 0;#pragma data_seg()
好的,是时候在 dll 附加时注册它了...
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ if( ul_reason_for_call == DLL_PROCESS_ATTACH ) { g_hInstDll = (HINSTANCE) hModule; ::DisableThreadLibraryCalls( g_hInstDll ); if( WM_HOOKEX==NULL ) WM_HOOKEX = ::RegisterWindowMessage( _T("WM_HOOKEX_RK") ); } return TRUE;}
最后,在我挂接到线程后,我发送消息
hHook = SetWindowsHookEx( WH_CALLWNDPROC,(HOOKPROC)HookProc, g_hInstDll, GetWindowThreadProcessId(plist,NULL) );SendMessage( hwnd,WM_HOOKEX,0,1);
现在,由于 VS dll 调试,我可以检查另一端如何接收此消息,在原始“注入(inject)代码的 3 种方法”项目子类化部分的情况下,参数为
wparam = 1lparam = 23720848
在我的项目中
wparam = 0lparam = 23720824
在调试过程中,似乎在具有相同参数的情况下根本无法识别 WM_HOOKEX!
我真的不明白这一点,我用完全相同的名称注册了 dll 进程附加的钩子(Hook),除了我使用 WM_HOOKEX =::RegisterWindowMessage( _T("WM_HOOKEX_RK") );"与 _T 因为我的项目是 unicode 但我真的怀疑这是否重要。
其他一切都 100% 相同
SendMessage(相同的hwnd,相同的mssg,0,1);
有什么想法为什么我的项目中的另一方看不到带有正确段落的正确消息?
谢谢
最佳答案
第一个问题,你为什么要这样做:
hHook = SetWindowsHookEx( WH_CALLWNDPROC,(HOOKPROC)HookProc,
g_hInstDll, GetWindowThreadProcessId(plist,NULL);
重写为
hHook = SetWindowsHookEx( WH_CALLWNDPROC,HookProc,
g_hInstDll, GetWindowThreadProcessId(plist,NULL));
究竟是什么让您想到处理类型不匹配错误的最佳方法就是强制转换它?您需要修复 HookProc,使其实际上是正确的函数类型。
关于c++ - 如果我使用相同的消息和相同的段落,为什么 wparam 会改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5036777/
在 Delphi 6 中 WPARAM 被声明为已签名: WPARAM = Longint; 在 Delphi 2010 中,WPARAM 被声明为已签名: WPARAM = INT_PTR; 但在
我正在寻找一种将对象(在我的例子中为 vector)作为 WPARAM 传递的方法采用 C++11 风格。 我发现的教程使用了 C 风格的转换或 reinterpret_cast传递一个指向对象的指针
我正在尝试获取由消息的 wParam 属性中返回的整数表示的实际系统消息。有没有办法做到这一点或可以实现这一目标的功能? 最佳答案 这是关于 WndProc 的问题吗?你说的是哪条消息? LRESUL
下面是整体代码: LRESULT WmPointerAPI::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HRES
如果我使用计算机鼠标滚动窗口,我会得到以下 Spy++ 结果: fwKeys: 0, zDelta: -120 我需要通过代码模拟鼠标滚轮事件,所以我像这样使用 PostMessage: Public
出于不相关的原因,我在 C# 应用程序的 WinForm 中捕获 WM_SYSCOMMAND 消息。有时,我的处理程序会收到带有 wParam 0xF063 的 WM_SYSCOMMAND 消息。 文
我目前正在尝试实现 http://www.codeproject.com/KB/threads/winspy.aspx 中的一些代码(子类化部分)到我的项目中,但遇到一些问题,我调试了 dll,似乎当
我有一个来自 WM_KEYDOWN 消息的 pMsg->wParam,我想将它转换成一个 CString。我该怎么做? 我试过下面的代码: TCHAR ch[2]; ch[0] = pMsg->wPa
在处理 What's wrong with this unmanaged code in C#? 中描述的问题时我偶然发现了参数 wParam 及其类型 IntPtr for SendMessage
在查看 RAWINPUT 结构的 MSDN 文档时,它有以下声明: typedef struct tagRAWINPUT { RAWINPUTHEADER header; union {
尝试这样做: 代码: WPARAM wParam = MAKEWPARAM(MK_LBUTTON, MK_RBUTTON, MK_SHIFT, MK_CONTROL, MK_MBUTTON); Pos
我知道 wParam 和 lParam 是(我相信是 32 位)特定于当时正在传递的消息的信息位,但是有什么方法可以分辨每条消息放入这两个消息中的内容吗? 我在某处读到 wParam 是 16 位而
一个标准的窗口过程函数采用这个原型(prototype): LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM l
将值传递给同时接受 WPARAM 和 LPARAM 参数的函数时,我传递其中的哪一个参数是否重要?有人告诉我,如果我使用 Windows x64,我应该使用 WPARAM;这是真的? 最佳答案 发送消
我知道我在这里很懒,我应该自己搜索头文件,但是 LPARAM 和 WPARAM 参数的实际类型是什么?它们是指针,还是四字节整数?我正在编写一些 C# 互操作代码,并希望确保它能够在 x64 系统上运
我需要填充结构的成员: typedef struct SPEVENT { SPEVENTENUM eEventId : 16; SPEVENTLPARAMTYPE el
我有点困惑。当一个文件被拖到一个带有 WS_EX_ACCEPTFILES 标记的窗口上时,它会将一个 PostMessage 放入 WndProc 函数中,该函数将 UINT 消息设置为 WM_DRO
我正在尝试调用 win32api.SendMessage()通过我的 Python 应用程序(即发送应用程序)。 接收应用程序的 API 声明消息的格式为:::SendMessage(, , (WPA
我在 C# 中导入 WinApi 函数、编写回调等 ( example ) 并且总是想知道: 它们是什么意思? LRESULT 作为最后的结果? W参数? L-参数 ? 如何安全地“包裹”它们 WPA
这个问题在这里已经有了答案: How should I pass negative values to SendMessage and Perform when they expect a Nativ
我是一名优秀的程序员,十分优秀!