2016-12-17 9 views
-1

pls私は自分のコードで何が間違っていたかを修正するのに役立つ必要があります。私はコードを実行し、バグやエラーはありませんが、私は組み合わせを試してみると、それは( "キーAはブロックされている"これは月曜日までに。ここでは、コードは次のとおりです。キーボードのフックを正しく使用してキーをブロックし、Cキーでブロックを解除するためにキーの組み合わせを押す方法

#include "stdafx.h" 
#include <iostream> 
#include <conio.h> 
#include <Windows.h> 
#include <sstream> 
#define _WIN32_WINNT 0x050 

using namespace std; 

string intToHexString(int intValue) { 

    string hexStr; 

    /// integer value to hex-string 
    stringstream sstream; 
    sstream << "0x" << hex << (int)intValue; 

    hexStr = sstream.str(); 
    sstream.clear(); //clears out the stream-string 

    return hexStr; 
} 

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { 
    BOOL locked = FALSE; 
    PKBDLLHOOKSTRUCT hookStruct; 
    if (nCode == HC_ACTION) { 
     switch (wParam) 
     { 
     case WM_KEYDOWN: 
     case WM_SYSKEYDOWN: 
     case WM_KEYUP: 
     case WM_SYSKEYUP: 
      hookStruct = (PKBDLLHOOKSTRUCT)lParam; 
     /** 
     * this is where the problem is 
     */ 
      //ctrl+alt+n 
      if (hookStruct->vkCode == 0x11 && hookStruct->vkCode == 0x12 && hookStruct->vkCode == 0x4E 
       && !locked) { 
       locked = TRUE; 
       if (hookStruct->vkCode == 0x41) { 
        cout << "The key A is blocked" << endl; 
        return 1; 
       } 

      } 
      else if (hookStruct->vkCode == 0x11 && hookStruct->vkCode == 0x12 && hookStruct->vkCode == 0x4E) { 
       locked = FALSE; 
       BlockInput(locked); 
       cout << "The key is unblocked" << endl; 

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

int main() 
{ 
    char key_pressed; 
    int ascii_value; 
    string key_press_special; 
    HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0); 
    cout << "press any key to see it's Character, ASCII and Scan Code" << endl; 
    cout << "Press ESC key to Exit" << endl; 
    while(1) { 
     key_pressed = _getch(); 
     if (key_pressed == 13) { 
      key_press_special = "Enter"; 
      cout << "Character: " << key_press_special << endl; 
     } 
     else if (key_pressed == 9) { 
      key_press_special = "Tab"; 
      cout << "Character: " << key_press_special << endl; 
     } 
     else if (key_pressed == 27) { 
      key_press_special = "ESC"; 
      cout << "Character: " << key_press_special << endl; 
     } 

     else { 
      cout << "Character: " << key_pressed << endl; 
     } 
     ascii_value = key_pressed; 
     cout << "The ASCII Value is: " << ascii_value << endl; 
     int scan = MapVirtualKey(ascii_value, 0); 
     string scanCode = intToHexString(scan); 
     cout << "Scan Code is: " << scanCode << endl; 

     if (key_pressed == 27) { 
      break; 
     } 
     else { 
      continue; 
     } 
    } 

    UnhookWindowsHookEx(hhkLowLevelKybd); 

    return 0; 
} 

Plsはあなたが間違いを見たときに批判すること自由に感じ、私はまだ学んでいます。

+0

を***私は、コードを実行し、何のバグやエラーがないが、私は組み合わせを試してみると、それはやってたとしているもの行いません** *バグの定義ではありませんか? – drescherjm

+1

*** hookStruct-> vkCode == 0x11 && hookStruct-> vkCode == 0x12 && hookStruct-> vkCode == 0x4E ***これは決して真実ではありません。 – drescherjm

+0

申し訳ありませんが定義されていたことを知らなかった –

答えて

1

あなたのフックは、完全なCtrl + Alt + Nシーケンスを1つの仮想キーとして処理しようとしています。キーを個別に処理する必要があります。

代わりに、より多くのこのような何かを試してみてください:

bool ctrlDown = false; 
bool altDown = false; 
bool nDown = false; 
bool locked = false; 

void UpdateLock() 
{ 
    if (ctrlDown && altDown && nDown) { 
     locked = !locked; 
     if (!locked) BlockInput(FALSE); 
     cout << (locked ? "" : "not ") << "locked" << endl; 
    } 
} 

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { 
    if (nCode == HC_ACTION) { 
     PKBDLLHOOKSTRUCT hookStruct = (PKBDLLHOOKSTRUCT) lParam; 
     switch (wParam) 
     { 
     case WM_KEYDOWN: 
     case WM_SYSKEYDOWN: 
      switch (hookStruct->vkCode) 
      { 
      case VK_CONTROL: 
       if (!ctrlDown) { 
        ctrlDown = true; 
        UpdateLock(); 
       } 
       break; 
      case VK_MENU: 
       if (!altDown) { 
        altDown = true; 
        UpdateLock(); 
       } 
       break; 
      case 'N': 
       if (!nDown) { 
        nDown = true; 
        UpdateLock(); 
       } 
       break; 
      } 
      break; 

     case WM_KEYUP: 
     case WM_SYSKEYUP: 
      switch (hookStruct->vkCode) 
      { 
      case VK_CONTROL: 
       ctrlDown = false; 
       break; 
      case VK_MENU: 
       altDown = false; 
       break; 
      case 'N': 
       nDown = false; 
       break; 
      } 
      break; 
     } 

     if ((hookStruct->vkCode == 'A') && locked) { 
      cout << "The key A is blocked" << endl; 
      return 1; 
     } 
    } 
    return CallNextHookEx(NULL, nCode, wParam, lParam); 
} 
+0

。私はあなたのメソッドを実装しましたが、Aキーをブロックしたり、LowLevelKeyboardProcから何も表示していません。 –

+0

'SetWindowsHookEx()'が失敗していないことを確認しましたか? 'dwThreadId = 0'を呼び出してフックをグローバルにインストールするには、フックコードをDLLに入れて他のプロセスに注入する必要がありますが、コードが入っていないので' hMod = 0'を設定していますDLL。呼び出しスレッドをフックしたいだけなら、 'dwThreadId'を' GetCurrentThreadId() 'の戻り値に設定してください。 –

関連する問題