WinAPI:获取类型化字符
WinAPI: get typed character
我目前正在开发一个名为"Key-O-Meter"的程序。此程序应跟踪在Windows上使用键盘进行的每个输入。跟踪的键将用于在其他时间创建统计信息。不幸的是,我在确定键入了哪个字符时遇到了问题。下面的代码只打印键盘上的字符(即,如果按下 a,则打印"a",但如果按下 shift + "a",则不打印"A")。特殊字符根本不起作用。
有没有比MapVirtualKeyA
更好的 WinAPI 函数来提供此功能?
#include <iostream>
#include <windows.h>
using namespace std;
LRESULT WINAPI lowLevelKeyboardProc(int nCode, WPARAM wParam,
LPARAM lParam);
/**
*
*/
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) {
//add hook
HHOOK hook;
hook = SetWindowsHookEx(WH_KEYBOARD_LL,
(HOOKPROC) lowLevelKeyboardProc, NULL, 0);
//start message loop
MSG message;
while (GetMessage(&message, NULL, 0, 0) != 0) {
TranslateMessage(&message);
DispatchMessage(&message);
}
//disable hook
UnhookWindowsHookEx(hook);
return 0;
}
/**
*
*/
LRESULT WINAPI lowLevelKeyboardProc(int nCode, WPARAM wParam,
LPARAM lParam) {
if (wParam == WM_KEYDOWN) {
//handle normal keydown
PKBDLLHOOKSTRUCT hookStruct = (PKBDLLHOOKSTRUCT) lParam;
char keyChar = MapVirtualKeyA(hookStruct->vkCode, MAPVK_VK_TO_CHAR);
cout << keyChar << endl;
}
return CallNextHookEx(0, nCode, wParam, lParam);
}
MapVirtualKey() 无法知道是否按下了修饰键。你可能想看看ToAscii()或ToUnicode()它们都接受键盘状态作为输入。
键盘状态可以使用 GetKeyboardState() 或 GetAsyncKeyState() 获取
相关文章:
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 复制到矢量无符号字符<非类型化对象的内容>
- WinAPI:获取类型化字符