用了楼主东东之后,发现确实不错:)
今天没事,在公司看了看msdn, 也发现一个获取键盘输入的方法[s:35],不知道是不是和楼主的相似哦?
这里主要是用的win xp的 Raw Input来获取的。
关于Raw input可以到MSDN中查看,网上有人翻译了中文版本的:
http://www.cppblog.com/shenhuafeng/archive/2006/09/15/12530.html
主要流程:
1、向系统注册一个或者多个原始输入设备
2、在你注册的原始输入设备数据发生变化时,系统发送一个消息及新数据到你的进程
3、调用GetRawInputData或者GetRawInputBuffer来获取这些数据
这是注册部分的代码:
复制内容到剪贴板
代码:
BOOL RegisitKeyBord(HWND hwnd)
{
if(NULL == hwnd)
return false;
PRegisterRawInputDevices RegisterRawInputDevices = (PRegisterRawInputDevices)GetApiAdd("User32.dll", "RegisterRawInputDevices");
if(NULL == RegisterRawInputDevices)
return false;
RAWINPUTDEVICE rid;
rid.usUsagePage = 0x01;
rid.usUsage = 0x06;
rid.dwFlags = RIDEV_INPUTSINK;
rid.hwndTarget = hwnd;
return RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE));
}获取数据的部分代码:
复制内容到剪贴板
代码:
case WM_INPUT:
if(NULL == GetRawInputData)
{
DefWindowProc(hWnd, message, wParam, lParam);
return 0;
}
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
lpb = new BYTE[dwSize];
if(lpb == NULL)
{
DefWindowProc(hWnd, message, wParam, lParam);
return 0;
}
if(GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize)
MessageBox(NULL, "GetRawInputData doesn't return correct size !", "Raw Input Test", 0);
raw = (RAWINPUT*)lpb;
if (raw->header.dwType == RIM_TYPEKEYBOARD)
{
wsprintf(vk, "Kbd: make=%04x Flags:%04x Reserved:%04x ExtraInformation:%08x, msg=%04x VK=%04x \n",
raw->data.keyboard.MakeCode,
raw->data.keyboard.Flags,
raw->data.keyboard.Reserved,
raw->data.keyboard.ExtraInformation,
raw->data.keyboard.Message,
raw->data.keyboard.VKey);
MessageBox(NULL, vk, "Raw Input Test", 0);
}
delete[] lpb;
DefWindowProc(hWnd, message, wParam, lParam);
return 0;这是枚举输入设备的代码:
复制内容到剪贴板
代码:
int main(void)
{
HANDLE hHeap = GetProcessHeap();
UINT nDevices = 0;
PGetRawInputDeviceList GetRawInputDeviceList = NULL;
HMODULE hUser32 = LoadLibrary("User32.dll");
if(hUser32 != NULL)
{
GetRawInputDeviceList = (PGetRawInputDeviceList)GetProcAddress(hUser32, "GetRawInputDeviceList");
if(NULL == GetRawInputDeviceList)
{
printf("Load GetRawInputDeviceList error..\n");
FreeLibrary(hUser32);
return -1;
}
}
else
{
printf("Load user32.dll error..\n");
return -1;
}
GetRawInputDeviceList(NULL, &nDevices, sizeof(RAWINPUTDEVICELIST));
PRAWINPUTDEVICELIST pril = (PRAWINPUTDEVICELIST)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(RAWINPUTDEVICELIST) * nDevices);
PRAWINPUT pri = (PRAWINPUT)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 1024);
if(NULL == pril)
{
printf("HeapAlloc error..\n");
FreeLibrary(hUser32);
return -1;
}
nDevices = GetRawInputDeviceList(pril, &nDevices, sizeof(RAWINPUTDEVICELIST));
if(nDevices <= 0)
{
printf("GetRawInputDeviceList error..\n");
HeapFree(hHeap, HEAP_ZERO_MEMORY, pril);
FreeLibrary(hUser32);
return -1;
}
printf("All %d input devices:\n", nDevices);
for(UINT i = 0; i < nDevices; i++)
{
printf("hDevice: %08x\ttype: %08x\n", pril->hDevice, pril->dwType);
pril++;
}
HeapFree(hHeap, HEAP_ZERO_MEMORY, pril);
FreeLibrary(hUser32);
return 0;
}