消息循环在这个程序中的作用?还有更多的问题

时间:2012-05-29 08:13:02

标签: c++ winapi hook message-loop

以下代码正常。它在用户按下某个键时发出消息。但是有一些我不知道的事情。 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在这里扮演什么角色?根据doc,它向窗口过程发送一条消息,但即使我排除了这一点,它也不会影响输出。

3 个答案:

答案 0 :(得分:2)

Windows中的所有事件,甚至是示例中使用的低级键盘事件,都是使用正常的消息事件发送的。因此,为了使程序能够感知键盘事件,它必须使用事件循环处理消息。

答案 1 :(得分:2)

如果没有循环,程序将立即退出,并且也会立即删除钩子。你不能注册一个钩子和退出 - 如果有错误的程序在他们之后留下太多被遗忘的钩子,系统将变得一团糟。一旦你的过程终止,钩子就会被安排拆除。

我不记得低级键盘钩子,但许多其他钩子的回调只在GetMessage / PeekMessage内部调用,而不是在其他一些线程上调用,所以只有一个无限循环赢了不够 - 它必须是一个消息循环。

答案 2 :(得分:0)

“Dispatch Message在这里扮演什么角色?根据文档,它向窗口过程发送一条消息,但即使我排除它,它也不会影响输出。”

DispatchMessage是相当无用的cos控制台窗口不会收到很多消息。 只收到消息是窗口失去焦点。