[英]C: Fastest way to determine, if any key on the keyboard has been pressed
我正在 C 中尋找最快的方法來確定是否按下了鍵盤上的任何鍵。
我不是在尋找如何確定是否按下了特定鍵(在這種情況下, GetAsyncKeyState()
會起作用)。
此外,它需要在后台工作,因此程序窗口沒有焦點(程序將在后台運行)。
編輯:該程序將對每個按鍵做出反應並輸出聲音。 我希望它在每次輸入內容時輸出聲音(例如在 Word 中)。 這也是它需要在后台運行的原因。 我希望它很快,所以我可以最大限度地減少按鍵和聲音輸出之間的延遲。
EDIT2:我正在尋找 Windows Hooks 以外的東西。 雖然它確實可以在后台獲得按鍵,但我正在尋找更快的東西(盡可能少的延遲)。
例如: GetAsyncKeyState()
用於對特定按鍵做出反應,而程序窗口沒有焦點。 我正在尋找類似的東西,但能夠對任何按鍵做出反應,而不是特定的按鍵。
作為評論,您可以使用RegisterRawInputDevices
作為此示例。
GetRawInputData
來獲取輸入數據。示例(刪除了錯誤檢查):
#include <windows.h>
#include <iostream>
using namespace std;
LRESULT CALLBACK WindProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
if (Msg == WM_INPUT)
{
HRAWINPUT hRawInput = (HRAWINPUT)lParam;
RAWINPUT input = { 0 };
UINT size = sizeof(input);
GetRawInputData(hRawInput, RID_INPUT,&input,&size,sizeof(RAWINPUTHEADER));
printf("vkey: %x, flag: %d\n",input.data.keyboard.VKey, input.data.keyboard.Flags);
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
int main()
{
WNDCLASSEX wcx = { 0 };
wcx.cbSize = sizeof(WNDCLASSEX);
wcx.lpfnWndProc = WindProc;
wcx.hInstance = GetModuleHandle(NULL);
wcx.lpszClassName = TEXT("RawInputClass");
RegisterClassEx(&wcx);
HWND hWnd = CreateWindowEx(0, TEXT("RawInputClass"), NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, GetModuleHandle(NULL), NULL);
RAWINPUTDEVICE rid = { 0 };
rid.usUsagePage = 0x01;
rid.usUsage = 0x06; //keyboard
rid.dwFlags = RIDEV_INPUTSINK;
rid.hwndTarget = hWnd;
RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE));
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.