#include <iostream>
#include <fstream>
#define _WIN32_WINNT 0x501
#include <windows.h>
using namespace std;
HHOOK hKeyboardHook = 0;
LRESULT CALLBACK KeyboardCallback(int code,WPARAM wParam,LPARAM lParam) {
cout << "a key was pressed" << endl;
ofstream myfile;
myfile.open ("hookcheck.txt", ios::ate | ios::app);
myfile << "a key was pressed\n";
myfile.close();
return CallNextHookEx(hKeyboardHook,code,wParam,lParam);
}
int main() {
HWND consoleWindow = GetConsoleWindow();
HINSTANCE hInstCons = (HINSTANCE)GetWindowLong( consoleWindow, GWL_HINSTANCE );
hKeyboardHook = SetWindowsHookEx( WH_KEYBOARD, (HOOKPROC)KeyboardCallback, (HINSTANCE)consoleWindow, GetCurrentThreadId());
MessageBox(NULL, "It is keyboard time!", "Let's Go", MB_OK);
}
循环进行时每次按键的代码应该在控制台上打印消息并创建一个文件,但什么也没有发生。我有什么错吗?
我将引用另一个话题 http://us.generation-nt.com/answer/spy-plus-plus-console-application-help-25981632.html:
控制台窗口完全由 CSRSS 处理,这是一个系统
过程。在进程中安装钩子意味着注入你的DLL
进去。由于CSRSS是如此重要(它对于运行
系统,其中的代码作为 LocalSystem 运行,这是本地系统
超级管理员用户),您不能向其中注入代码。那么你
无法钩住它的任何窗口。
在您的简单控制台应用程序中没有发生真正的窗口消息,因此不必调用您的挂钩,在您的情况下,您甚至没有注入挂钩,而仅使用线程模式挂钩。根据 MSDN 文档,当即将处理消息时会调用它:
应用程序定义或库定义的回调函数与
SetWindowsHookEx 函数。每当系统调用此函数
应用程序调用 GetMessage 或 PeekMessage 函数,然后
是要处理的键盘消息(WM_KEYUP 或 WM_KEYDOWN)。
现在让我向您展示如何开始接听电话:
MessageBox(NULL, _T("It is keyboard time!"), _T("Let's Go"), MB_OK);
//for(int i=0; i<=10; i++) {
// cout << i << endl;
// Sleep(1000);
//}
Do MessageBox
在关闭它之前开始输入 - 您将开始收到挂钩调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)