键盘钩子控制台程序

来源:互联网 发布:并发编程艺术 pdf 编辑:程序博客网 时间:2024/06/05 04:44

鉴于与同事的聊天过程中提到,键盘钩子一定要配合界面程序(MFC之类)才可以使用,并且单线程绝对无法实现。带着这个问题,查了比较多的资料,确实关于控制台实现键盘钩子的资料非常少,大部分都是基于MFC的,甚至有文章说控制台没有消息泵导致无法实现。

在尝试了多种方法后,使用消息循环实现。demo使用单线程即可实现,测试了多线程也可以。

// WindowsHookDemo.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <windows.h>#include <time.h>#include <stdlib.h>#include <iostream>using namespace std;////////////////////////////////////////////////////////////////////////////////////////////////HHOOK g_hHook = NULL;char g_QRcode[33] = { 0 };//键盘回调函数LRESULT __stdcall CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){if (nCode < 0){return CallNextHookEx(g_hHook, nCode, wParam, lParam);}else if (nCode == HC_ACTION){LPKBDLLHOOKSTRUCT p = (LPKBDLLHOOKSTRUCT)lParam;if (wParam == WM_KEYDOWN){if (p->scanCode == 28){PostQuitMessage(0);return 0;}char csCode[8] = { 0 };_ltoa((p->scanCode - 1) % 10, csCode, 10);strncat(g_QRcode, csCode, 1);//char buf[128] = { 0 };//GetKeyNameText(lParam, (LPWSTR)buf, 128);//cout << buf << endl;}}return 0;}/*windows钩子实现*/int STDMETHODCALLTYPE GetQRcode(char* szQRcode){time_t tmBegin = time(NULL); //获取系统当前时间g_hHook = NULL;memset(g_QRcode, 0x00, 33);g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardProc, GetModuleHandle(NULL), 0);MSG msg;while (TRUE){if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){//有消息if (msg.message == WM_QUIT)break;TranslateMessage(&msg);DispatchMessage(&msg);}else{//判断超时(这边可以考虑使用配置文件来控制超时)if (time(NULL) - tmBegin > 8){UnhookWindowsHookEx(g_hHook);return -1;}}}UnhookWindowsHookEx(g_hHook);memcpy(szQRcode, g_QRcode, strlen(g_QRcode));return 0;}int main(){char QRcode[128] = { 0 };GetQRcode(QRcode);cout << QRcode << endl;system("pause");    return 0;}

测试了一下,编译到动态库中后,使用主线程和多线程均可使用。 



原创粉丝点击