跳至主要內容

keyboard

chanchaw小于 1 分钟cpp

打印键盘按键

创建控制台应用程序,写入下面代码(完整代码)即可,使用了键盘 hook

// keyboardHook.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <windows.h>
#include <sstream>

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
	if (nCode == HC_ACTION) {
		KBDLLHOOKSTRUCT *pKeyboard = (KBDLLHOOKSTRUCT *)lParam;

		std::ostringstream oss;
		oss << std::hex << pKeyboard->vkCode;
		std::string hexString = oss.str();

		// 打印虚拟键码
		std::cout << "虚拟键十进制: " << pKeyboard->vkCode << ",十六进制:" << hexString;

		// 打印 ASCII 码(如果有)
		if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) {
			BYTE keyboardState[256];
			GetKeyboardState(keyboardState);

			wchar_t buffer[5];
			if (ToUnicode(pKeyboard->vkCode, pKeyboard->scanCode, keyboardState, buffer, 4, 0) == 1) {
				std::wcout << " (ASCII: " << buffer[0] << ")";
			}
		}

		std::cout << std::endl;
	}
	return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int main() {
	HHOOK keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, NULL, 0);

	if (keyboardHook == NULL) {
		std::cerr << "Failed to install hook!" << std::endl;
		return 1;
	}

	std::cout << "Press keys to see their virtual key codes and ASCII values. Press Esc to quit." << std::endl;

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

		// 按下 Esc 键退出
		if (msg.message == WM_KEYDOWN && msg.wParam == VK_ESCAPE) {
			break;
		}
	}

	UnhookWindowsHookEx(keyboardHook);

	return 0;
}