首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么SetWindowsHookEx不能在命令行界面中工作(哪些代码在main()中,而不是dllmain,等等)?

为什么SetWindowsHookEx不能在命令行界面中工作(哪些代码在main()中,而不是dllmain,等等)?
EN

Stack Overflow用户
提问于 2011-03-14 00:30:10
回答 2查看 596关注 0票数 0
代码语言:javascript
运行
复制
#include <stdio.h>
#include <windows.h>

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { 
 printf("Keyboard event, nCode = %d, wParam = %d, lParam = 0x%.8X\n", nCode, wParam, lParam);
 return (LRESULT)NULL;
} 

void main() { 
 HHOOK HookHandle = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, (HINSTANCE) NULL, GetCurrentThreadId());
 printf("Hook handle = 0x%.8X\n", HookHandle);

 MSG message;
 while (GetMessage(&message,NULL,0,0)) {
 TranslateMessage(&message);
 DispatchMessage(&message);
 }

 UnhookWindowsHookEx(HookHandle);
}

预计它会输出类似“键盘事件...”的内容,但它不起作用,无论我输入什么,它总是保持沉默。

编译选项很简单: gcc -o test.exe test.c

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-14 00:53:51

这些钩子中的大多数(如果不是全部)必须注入到目标应用程序中,因此它们必须在DLL中实现。

票数 1
EN

Stack Overflow用户

发布于 2011-03-14 00:56:46

来自KeyboardProc回调函数的文档:

只要应用程序调用GetMessage或PeekMessage函数,并且有键盘消息(WM_KEYUP或WM_KEYDOWN)需要处理,系统就会调用此函数。

控制台应用程序不使用消息队列来处理输入,因此您的钩子永远不会被调用。

您可以尝试使用低级键盘挂钩(WH_KEYBOARD_LL)。即使这是一个全局钩子,您也不需要使用DLL:正如documentation的备注部分所提到的,钩子代码不会被注入到其他进程中。当然,这种方法的问题是,您将获得系统中所有关键事件的通知(不仅仅是程序中的事件)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5290718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档