2016-10-12 11 views
0

작성중인 단축키 프로그램의 키 입력을 읽는 데 사용할 글로벌 키보드 후크를 만들려고하고 있는데 몇 가지 문제가 있습니다. 사용자가 핵심어를 entred 때 메시지 상자를 표시해야합니다 (예 : "password"). 이 코드에서 어떻게 할 수 있습니까?WinAPI C++ 키보드 걸이

C++에서
#include <fstream> 
#include "stdafx.h" 
#include <iostream> 
#include <Windows.h> 
#include <stdio.h> 

using namespace std; 

bool isCapsLockOn() { 

    if ((GetKeyState(VK_CAPITAL) & 0x00001) != 0) 
     return true; 
    else 
     return false; 
} 

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { 
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam; 

if (wParam == WM_KEYDOWN) { 

    if (p->vkCode >= 0x30 && p->vkCode <= 0x39) // 0~9 
    { 
     switch (p->vkCode) { 
      // 0 ~ 9 with Shift Options. 
     case 0x30: if (GetAsyncKeyState(VK_SHIFT)) cout << ')';  else cout << '0';  break; 
     case 0x31: if (GetAsyncKeyState(VK_SHIFT)) cout << '!';  else cout << '1';  break; 
     case 0x32: if (GetAsyncKeyState(VK_SHIFT)) cout << '@';  else cout << '2';  break; 
     case 0x33: if (GetAsyncKeyState(VK_SHIFT)) cout << '#';  else cout << '3';  break; 
     case 0x34: if (GetAsyncKeyState(VK_SHIFT)) cout << '$';  else cout << '4';  break; 
     case 0x35: if (GetAsyncKeyState(VK_SHIFT)) cout << '%';  else cout << '5';  break; 
     case 0x36: if (GetAsyncKeyState(VK_SHIFT)) cout << '^';  else cout << '6';  break; 
     case 0x37: if (GetAsyncKeyState(VK_SHIFT)) cout << '&';  else cout << '7';  break; 
     case 0x38: if (GetAsyncKeyState(VK_SHIFT)) cout << '*';  else cout << '8';  break; 
     case 0x39: if (GetAsyncKeyState(VK_SHIFT)) cout << '(';  else cout << '9';  break; 
     } 
    } 

    else if (p->vkCode >= 0x41 && p->vkCode <= 0x5A) // a~z 
    { 

     if (!(GetAsyncKeyState(VK_SHIFT)^isCapsLockOn())) { 
      cout << char(tolower(p->vkCode)); 

     } 
     else 

      cout << (char)p->vkCode; 

    } 

    else if (p->vkCode >= 0x70 && p->vkCode <= 0x7B) // F1 ~ F12. 
    { 
     cout << "[F" << p->vkCode - 111 << "]"; 
    } 
    else if (p->vkCode >= 0x70 && p->vkCode <= 0x7B) // F1 ~ F12. 
    { 
     cout << "[F" << p->vkCode - 111 << "]"; 
    } 

    else if (p->vkCode) 

    { 
     switch (p->vkCode) 
     { 
     case VK_CAPITAL: cout << "<CAPLOCK>";  break; 
     case VK_LCONTROL: cout << "<LCTRL>";  break; 
     case VK_RCONTROL: cout << "<RCTRL>";  break; 
     case VK_INSERT:  cout << "<INSERT>";  break; 
     case VK_END:  cout << "<END>";   break; 
     case VK_PRINT:  cout << "<PRINT>";  break; 
     case VK_DELETE:  cout << "<DEL>";   break; 
     case VK_BACK:  cout << "<BK>";   break; 
     case VK_LEFT:  cout << "<LEFT>";  break; 
     case VK_RIGHT:  cout << "<RIGHT>";  break; 
     case VK_UP:   cout << "<UP>";   break; 
     case VK_DOWN:  cout << "<DOWN>";  break; 
     case VK_SPACE:  cout << ' ';    break; 
     case VK_ESCAPE:  cout << "<ESC>";   break; 
     case VK_TAB:  cout << "<TAB>";   break; 

     } 
    } 

} 


return CallNextHookEx(NULL, nCode, wParam, lParam); 
} 

    int main() 
{ 

HHOOK keyBoard = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, NULL, NULL); 
MSG msg; 
while (!GetMessage(&msg, NULL, NULL, NULL)) {  
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

UnhookWindowsHookEx(keyBoard); 
} 

답변

0
if (!(GetAsyncKeyState(VK_SHIFT)^isCapsLockOn())) 

^ 당신은 아마 문자열을 기록하려면 논리에 대한 || 또는

을 의미 비트 XOR 연산을

을 의미합니다, 당신은 문자열을 선언 std::string를 사용할 수 있습니다. 문자를 추가 한 다음 사용자가 Return 키를 눌렀을 때 표시하십시오. 아래 예제와 같이 VK_RETURN에 대한 핸들러를 추가해야합니다.

#include "stdafx.h"이 필요하지 않은 경우 포함하지 마십시오. #include <stdio.h>은 IO 용 C 헤더입니다. 여기서는 필요하지 않습니다. 이미 C++ 헤더 파일이 있습니다. <iostream>

#include <iostream> 
#include <fstream> 
#include <string> 
#include <Windows.h> 

... 
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam; 
    static std::string str; 
    if (wParam == WM_KEYDOWN) 
    { 
     ... 
     else if (p->vkCode >= 0x41 && p->vkCode <= 0x5A) // a~z 
     { 
      char c = char(p->vkCode); 
      if (!(GetAsyncKeyState(VK_SHIFT) || isCapsLockOn())) 
       c = (char)tolower(c); 
      cout << c; 
      str += c; 
     } 
     ...  
     else if (p->vkCode) 
     { 
      switch (p->vkCode) 
      { 
      ... 
      case VK_UP:   cout << "<UP>";   break; 
      case VK_DOWN:  cout << "<DOWN>";  break; 
      case VK_SPACE:  cout << ' ';   break; 
      case VK_ESCAPE:  cout << "<ESC>";  break; 
      case VK_TAB:  cout << "<TAB>";  break; 
      case VK_RETURN:  
      { 
       cout << "<RETURN>\n"; 
       if (str.length()) 
       { 
        std::string msg = str; 
        str = ""; 
        ::MessageBoxA(0, msg.c_str(), 0, 0); 
       } 
       break; 
      } 
      ... 
     } 
    } 
}