C:如果键盘上的任何键被按下,最快的确定方法



我正在C中寻找最快的方法来确定是否按下了键盘上的任何键。

我不想知道如何确定是否按下了特定的键(在这种情况下,GetAsyncKeyState()会起作用(。

此外,它需要在后台工作,因此程序窗口没有焦点(程序将在后台运行(。

编辑:程序将在每次按键时发出声音输出。我希望它能在每次我打字时输出一个声音(比如Word之类的(。这也是它需要在后台运行的原因。我希望它很快,这样我就可以最大限度地减少按键和声音输出之间的延迟。

第2版:我正在搜索Windows Hooks之外的其他内容。虽然它确实可以在后台按键,但我正在寻找更快(尽可能减少延迟(的东西。

例如:GetAsyncKeyState()用于对特定按键做出反应,而程序窗口没有焦点。我正在寻找这样的东西,但有能力对任何按键做出反应,而不是特定的按键。

作为注释,您可以使用RegisterRawInputDevices作为此示例。

  1. 创建一个仅消息窗口
  2. 将RAWINPUTDEVICE.ownTarget设置为步骤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: %dn",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;
}

相关内容

最新更新