键盘钩子控制台程序
来源:互联网 发布:并发编程艺术 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;}
测试了一下,编译到动态库中后,使用主线程和多线程均可使用。
阅读全文
0 0
- 键盘钩子控制台程序
- 键盘钩子程序
- 键盘钩子程序
- 键盘钩子程序
- 控制台程序安装全局钩子
- win32程序测试键盘钩子
- win32程序测试键盘钩子
- 控制台程序接收键盘消息
- 控制台程序接收键盘消息
- 一个简单的键盘钩子程序
- 一个简单的键盘钩子程序
- 一个简单的键盘钩子程序(ZZZ)
- 一个简单的键盘钩子程序
- 利用键盘钩子开发按键发音程序
- 一个简单的键盘钩子程序
- 一个简单的键盘钩子程序
- 利用键盘钩子开发按键发音程序
- 利用键盘钩子开发按键发音程序
- sql 存储过程 游标 事务
- Android WebRTC 音视频开发总结(一)
- Base64编码解码原理详解
- 在C#中,能放在class Student类前面的关键字包括:abstract、delegate、extern、internal、partial
- 一个前端学习的很好的网站
- 键盘钩子控制台程序
- LeetCode总结
- 使用AngularJS写一个支付倒计时
- myeclipse一直停留在Loading workbench界面上的处理办法
- 安卓复写倒计时
- Qt Charts发布
- maven项目Cannot change version of project facet Dynamic Web Module to 2.5.
- ∑-△ADC工作原理
- android 性能优化