【问题标题】:role of message loop in this program ? and few more questions消息循环在这个程序中的作用?还有几个问题
【发布时间】: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


【解决方案1】:

Windows 中的所有事件,甚至是您的示例中使用的低级键盘事件,都是使用普通消息事件发送的。因此,程序要能够感知键盘事件,就必须使用事件循环处理消息。

【讨论】:

    【解决方案2】:

    如果没有循环,程序会立即退出,钩子也会立即被移除。你不能注册一个钩子并退出——如果有缺陷的程序在它们之后留下太多被遗忘的钩子,系统就会变得一团糟。一旦你的进程终止,钩子就会被安排删除。

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

    【讨论】:

    • @SuhailGupta 这是消息循环的经典模式(顺便说一下,如果您咨询 MSDN,这不是最正确的)。作者可能已经复制粘贴了它,除了有一个消息循环之外没有任何意义。最好始终拥有它,以防您在某个时候开始显示 GUI。
    • DispatchMessage 将这段代码中的消息发送给谁?
    • @SuhailGupta 在这段代码中,没有人知道。无论如何GetMessage 可能没有返回任何消息。
    • 一般转让给谁?
    • “GetMessage 可能没有返回任何消息” 它没有收到我的键盘事件吗?为什么这么说?
    【解决方案3】:

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

    DispatchMessage 非常没用,因为控制台窗口没有收到太多消息。 只有当窗口失去焦点时才会收到消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 2013-03-13
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多