程序停止在 GetMessage() 函数中工作
Program stopps working at GetMessage() function
我对Hook-Stuff很陌生,我正在尝试学习如何使用它。当我学习新东西时,我通常会从互联网上复制代码,看看它是否有效 - 如果是,我会详细介绍并搜索所有内容。因此,对于我尝试的所有代码,我都有同样的问题。它们停止在GetMessage()
功能上工作。我正在使用Visual Studio - 我调试了它,当它到达功能时,它什么都不做,只是留在它上面。我尝试了几个代码 - 例如这个:
HMODULE lib = LoadLibrary("C:\Users\A\Desktop\Dll1.dll");
if (lib) {
HOOKPROC procedure = (HOOKPROC)GetProcAddress(lib, "_procedure@12");
if (procedure)
hook = SetWindowsHookEx(WH_CALLWNDPROC, procedure, lib, 0);
else
printf("Can't find function in dll!n");
}
else
printf("Can't find dll!n");
if (hook)
printf("Hook installed properly!nn");
MSG message;
while (GetMessage(&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
FreeLibrary(lib);
UnhookWindowsHookEx(hook);
它打印"Hook 安装正确!"并且什么也不做!代码来自 http://www.rohitab.com/discuss/topic/41238-global-hooks-to-intercept-windows-messages/
与鼠标/键盘挂钩不同,窗口过程挂钩在调用窗口过程的挂钩线程的上下文中运行。 它不会像您期望的那样委托回安装挂钩的线程。 这就是为什么在挂接其他进程时,DLL 中必须存在窗口过程挂钩 - DLL 被注入到挂钩进程的地址空间中,然后钩子在将消息传递给窗口过程之前/之后由任何挂钩线程调用。
安装挂钩的程序没有自己的窗口,因此不会收到任何消息。 这就是为什么GetMessage()
无限期地阻止您的应用程序的原因。 您需要向应用程序添加 UI,或者让您的钩子使用 (Post|Send)Message()
或 PostThreadMessage()
手动将其自己的消息发布/发送回您的应用程序,以便取消阻止GetMessage()
。
除非程序创建窗口,否则它不会接收消息,钩子作为挂钩程序的消息循环的一部分传递(这就是为什么在这种情况下钩子函数需要在 DLL 中(。
消息队列特定于创建窗口的线程,发布的消息将始终在创建窗口的线程上接收,这就是Windows的操作方式。
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++中的memset函数工作不正常
- 渲染窗口无法跨多个函数工作
- C++:最大数组值函数工作不正常
- 仅一个功能的链接错误.在同一类和CPP文件中具有相似签名的其他函数工作正常
- 如何让我的构造函数和函数工作,以便我的 main() 能够同时显示字符串和 int 数据
- (c++)无法让 void 函数工作,主.cpp内部的几行也有问题
- 编译器生成的默认构造函数工作 - C++
- 我似乎无法让我的最大长度递归函数工作
- 无法让 SHGetKnownFolderPath() 函数工作
- Qt 5.2无法使qWait函数工作
- 模板作为递归函数工作
- 构造函数工作不正常
- 如何让c风格的字符串函数工作
- 我如何让这个构造函数工作
- C函数工作,c++版本不
- 为什么我的衍生自CRTP函数工作
- 不明白为什么这个C++递归函数工作背后的逻辑
- 对不存在的对象调用成员函数工作正常,c++
- 如何使 cv::setMouseCallback 函数工作