【发布时间】:2012-05-29 08:13:02
【问题描述】:
以下代码可以正常工作。当用户按下一个键时,它会发出消息。但有些事情我不知道。 Message Loop here 的作用是什么?我读到调用SetWindowsHookEx(...) 会在windows 中注册一个函数,当注册类型的事件发生时,windows 会自动调用相应的函数。毫无疑问,如果不给消息循环它的空间,我看不到输出。
#include<iostream>
#include <windows.h>
using namespace std;
HINSTANCE hinst = NULL;
static HHOOK handleKeyboardHook = NULL;
static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
void setWinHook() {
handleKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc,NULL, 0);
if(handleKeyboardHook == NULL) {
cout << "is NULL";
} else {
cout << "is not NULL";
}
cout<<("Inside function setWinHook !");
}
static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
cout << ("You pressed a key !\n");
return CallNextHookEx(handleKeyboardHook, nCode, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
handleKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
编辑
是否退出程序(关闭控制台窗口)取消注册钩子?
编辑 2
Dispatch Message 在这里扮演什么角色?根据文档,它会向窗口过程发送一条消息,但即使我排除了它,它也不会影响输出。
【问题讨论】:
-
这似乎是一段未完成的代码,所以我想说消息循环还没有用:)
-
@SirDarius 为什么说它未完成?我猜是因为我没有取消注册钩子?
-
好吧,您的代码中没有使用
setWinHook函数,正如其他评论者所说,空消息循环是一个很好的起点;)
标签: c++ winapi hook message-loop