2008-12-04 4 views
1

Функция ниже записывает «0», «z» и «1» в порядке ... но не снимает «Z» (shift-z) ... любая помощь будет оценена ...Ключ для клавиатуры ... не получает символы нижнего или верхнего регистра

__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); 
    } 
} 

ответ

10

клавиатура не посылает символов. Он отправляет ключам. Если вы печатаете z или Z, вы все равно нажимаете ту же клавишу, и эта клавиша имеет один и тот же код VK оба раза.

Вы также должны получать уведомление при нажатии или отпускании клавиши Shift. Вы можете использовать эти уведомления, чтобы перевести нажатия клавиш на символы. Для этого также будет важно состояние блокировки. Вы также можете быть обеспокоены мертвыми ключами.

Вы можете проверить, нажата ли клавиша Shift. GetAsyncKeyState сообщит вам состояние ключа прямо сейчас и GetKeyState сообщит вам состояние ключа по состоянию на последнее сообщение, удаленное из очереди сообщений.

6

Там нет код виртуальной клавиши для Z. Попробуйте что-то вроде этого:

  case 90: 
       if(GetKeyState(VK_LSHIFT|VK_RSHIFT) 
        Logger[0] = L'Z'; break; 
       else 
        Logger[0] = L'z'; break; 
+0

Вы хотите ** синхронное ** состояние ключа модификатора. Если вы пишете клавиатурные шпионы на этом уровне качества, я не ужасно обеспокоен угрозами безопасности. – IInspectable 2015-09-30 18:18:33

+1

Возможно, вы предложили редактировать, не проливая свой чай паранойи; и нет, я, конечно же, не пишу клавиатурных клавиатур для пользовательского пространства. – arul 2015-09-30 18:25:48

Смежные вопросы