Microsoft DirectX庫包含一個可用於獲取鍵盤狀態的函數。它是DirectInput API的一部分。下面的代碼演示瞭如何輪詢鍵盤的關鍵狀態信息。必須添加額外的邏輯來檢測何時按下/釋放按鍵並將其轉換爲字符。
請注意,這需要Microsoft DirectX SDK進行編譯。
//Public domain: no attribution required
#include "stdafx.h"
#include "dxlog.h"
#pragma comment(lib, "dinput8")
#pragma comment(lib, "dxguid")
LPDIRECTINPUT8 din;
LPDIRECTINPUTDEVICE8 dinkbd;
BYTE keystate[256];
DIDATAFORMAT dfi;
void init_dinput(HINSTANCE hInst, HWND hWnd)
{
HRESULT hr;
hr = DirectInput8Create(hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void **)&din, NULL);
hr = din->CreateDevice(GUID_SysKeyboard, &dinkbd, NULL);
hr = dinkbd->SetDataFormat(&c_dfDIKeyboard);
// share the keybdb and collect even when not the active application
hr = dinkbd->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND);
}
void detect_input(void)
{
dinkbd->Acquire();
dinkbd->GetDeviceState(256, keystate);
}
void clean_dinput(void)
{
dinkbd->Unacquire();
din->Release();
}
void print_state()
{
WCHAR pState[4096] = L"";
WCHAR temp[32];
for (int i = 0; i < 256; i++)
{
if (keystate[i] != 0)
{
wsprintf (temp, L"%d(%d) ", i, keystate[i]);
lstrcat(pState, temp);
}
}
if (lstrlen(pState) != 0)
{
lstrcat(pState, L"\n");
OutputDebugString(pState);
}
}
其實,這會更容易。但是安全嗎?如果其他應用程序試圖獲得重點會怎樣? –
這不會阻止任何其他應用程序獲得重點嗎?這個想法是,應用程序應該能夠在其他應用程序正常運行時在後臺接收按鍵。 –
@笨蛋你應該鉤住鍵盤。徘徊在未知行爲之地並不理想。 –