不会进入控制台应用程序上的 Windows GetMessage 循环
does not go inside the Windows GetMessage loop on console application
我想检测C++中的按键,我需要使用Windows系统调用。所以,我做了一些研究,这就是我使用钩子和消息得到的:
#include <Windows.h>
#include <iostream>
#include <sstream>
#include <fstream>
#include <ctime>
using namespace std;
LRESULT CALLBACK LowLevelKeyboardProc(int code, WPARAM wParam, LPARAM lParam) {
if (code == HC_ACTION) {
switch (wParam) {
case WM_KEYDOWN:
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
char c = char(MapVirtualKey(p->vkCode, MAPVK_VK_TO_CHAR));
cout << c << endl;
}
}
return CallNextHookEx(NULL, code, wParam, lParam);
}
int main() {
HHOOK HKeyboard = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0);
MSG msg;
BOOL bRet;
while ((bRet = GetMessage(&msg, NULL, 0, 0)) > 0) {
cout << "bRet = " << bRet << endl; // I want to do something here, but the program doesn't seem to go in here
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(HKeyboard);
return 0;
}
我的问题是为什么我的程序没有进入循环(而是卡在 GetMessage 函数上)?我需要它来设置条件以在几秒钟后终止,那么我应该在哪里放置条件?我知道 GetMessage 函数读取消息,但是当我按下键盘上的键时,它仍然无法进入,并且回调函数工作正常。
事件将发布到活动窗口。控制台窗口由控制台子系统 csrss.exe 拥有,它接收事件,然后将它们转换为字符并将它们放入控制台对象中,这是应用程序的stdin
。
如果要以 Win32 GUI 方式处理事件,则应使用 Win32 窗口(例如 RegisterClass
和 CreateWindow
),而不是控制台窗口。
如果您只希望回调在一段时间内工作,则可以使用可警报的等待,例如 SleepEx
或 MsgWaitForMultipleObjects
,它们接受超时。
这并不奇怪,您的线程队列中实际上没有任何消息,并且您没有窗口,因此也没有窗口队列。
如果要使用从钩子返回的值,请将代码放在钩子回调函数中。
我应该警告您,像这样的钩子在控制台应用程序中不起作用,因为控制台窗口驻留在另一个进程中。 此外,如果您查看 MSDN 页面以获取SetWindowsHookEx
,您会发现 WH_KEYBOARD_LL
只是一个全局钩子,即您必须将钩子处理程序放在 DLL 库中并将钩子注入其他应用程序中。然后,您必须自己处理32/64位问题。
最后一点,当您在处理程序中说cout << c;
时,那将打印在进程的输出文件句柄中,而不是您自己的句柄中。
- OutputDebugString在Windows通用应用程序上的位置?以及如何从OutputDebugString捕获
- Mongodb C驱动程序在Windows上安装失败
- 为什么此C 损坏的程序在Windows和Linux上的行为如此不同
- 程序在Windows中的DLL边界上使用嵌入式Python/C 代码崩溃
- 我的程序在Windows机器上崩溃了,但在Linux上运行良好
- Win32程序在Windows 8上调用GetSaveFileName()或SHBrowseForFolder()时崩溃
- 我的程序在Windows上使用MSVC和G 编译器运行,但在Linux上不运行
- 在Windows 8 metro应用程序上同步两个ppl任务
- 为什么我的程序在Windows上运行良好,但在linux上运行不好
- 如何了解c++应用程序在WINDOWS上运行的时间
- 不会进入控制台应用程序上的 Windows GetMessage 循环
- Qt程序在Windows中的折线绘制上崩溃
- 在 Windows 7 上使用C++程序读取 Windows 注册表
- 从用户模式程序在 Windows 上发送和接收 ARP 数据
- 使用std::thread的C++多线程应用程序在Windows上运行良好,但在Ubuntu上则不然
- 如果应用程序以windows上的管理权限从cmd打开,则会出现访问冲突
- iPad/iPhone应用程序在Windows操作系统上用C++开发
- 在Windows通用应用程序上拖放文件
- 如何通过C++程序在Windows服务器2008/2012上初始化磁盘
- QT应用程序在Windows资源管理器上不起作用?