簡體   English   中英

C: 最快的方法來確定是否按下了鍵盤上的任何鍵

[英]C: Fastest way to determine, if any key on the keyboard has been pressed

我正在 C 中尋找最快的方法來確定是否按下了鍵盤上的任何鍵。

我不是在尋找如何確定是否按下了特定鍵(在這種情況下, GetAsyncKeyState()會起作用)。

此外,它需要在后台工作,因此程序窗口沒有焦點(程序將在后台運行)。

編輯:該程序將對每個按鍵做出反應並輸出聲音。 我希望它在每次輸入內容時輸出聲音(例如在 Word 中)。 這也是它需要在后台運行的原因。 我希望它很快,所以我可以最大限度地減少按鍵和聲音輸出之間的延遲。

EDIT2:我正在尋找 Windows Hooks 以外的東西。 雖然它確實可以在后台獲得按鍵,但我正在尋找更快的東西(盡可能少的延遲)。

例如: GetAsyncKeyState()用於對特定按鍵做出反應,而程序窗口沒有焦點。 我正在尋找類似的東西,但能夠對任何按鍵做出反應,而不是特定的按鍵。

作為評論,您可以使用RegisterRawInputDevices作為此示例

  1. 創建一個僅消息窗口。
  2. 將 RAWINPUTDEVICE.hwndTarget 設置為步驟 1 中創建的窗口,這樣您就不需要關注窗口。
  3. 調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM