2012-05-01 3 views
0

저는 응용 프로그램 관련 키 스트로크 다이내믹스 툴을 연구 중입니다. 내 요구 사항은 키보드 입력 Windows CMD 프롬프트에있는 사용자의 타이밍 데이터입니다. - 내 응용 프로그램 기능은의 그것과 매우 유사합니다 나에게 나타나는 파이썬 래퍼 모듈Windows 명령 프롬프트에 키 입력을 가로 채는 방법?

1) 창 2) Pyhook 후크를 사용하여 약간의 검색 후, 나는이 일을 수행하는 두 가지 방법을 발견했다 키 로거. 그러나 나는 글로벌 훅을 사용하거나 CMD 프롬프트에서 키 입력을 가로 채기 위해 특정 훅을 사용해야 하는지를 판단 할 수 없습니다. 전역 훅을 사용하는 경우 대상 응용 프로그램을 기반으로 키 입력을 필터링 할 수 있습니까?

+1

왜 응용 프로그램이 바로 이러한 키 입력 이벤트를 수신하지 않는 이유는 무엇입니까? 왜 명령 프롬프트에서 전역 적으로 가로 챌 필요가 있습니까? 명령 줄 응용 프로그램을 만들었습니까? –

+0

@CodyGray : 설명이 불완전하면 죄송합니다. WH_KEYBOARD_LL 후크를 사용하는 콘솔 응용 프로그램을 작성했습니다. 키 스트로크와 타이밍 정보를 기록 할 수 있지만 앱은 시스템 전체에 기록됩니다. 이제는 CMD 창에서만 로깅을 제한하려고합니다. 내가 그 일을하는 더 좋은 방법이 있다면 알려주 길 바란다. 나는 api를 이기기 위하여 새롭다 나는 간신히 표면을 긁고있다. :) – secfreak

+0

응용 프로그램이 명령 프롬프트에서 실행되는 경우 일반 응용 프로그램과 같은 키보드 이벤트를 수신하지 못하는 이유는 무엇입니까? 'WH_KEYBOARD_LL' 훅은 글로벌 로우 레벨 키보드 훅입니다. 즉, 시스템 전체에서 발생하는 모든 키보드 이벤트에 대한 알림을 얻습니다. 그것이 당신이 원하는 것이 아닌 것처럼 들리므로, 당신은 글로벌 훅을 전혀 원하지 않습니다. –

답변

0

아래의 좋은 코드는 CTRL-y 키 조합을 수신 대기하는 백그라운드에있는 단축키 앱이며 더 많은 키 조합을 수정하거나 앱에 추가 할 수 있습니다. CTRL-q을 사용하면 숨겨진 앱을 종료 할 수 있습니다.

콘솔 창을 완전히 숨기려면 main() : //ShowWindow(FindWindowA("ConsoleWindowClass", NULL), false)에서이 행의 주석을 해제하십시오. 즐겨.

if (CTRL_key !=0 && key == 'y') 
{ 
    MessageBox(NULL, "CTRL-y was pressed\nLaunch your app here", "H O T K E Y", MB_OK); 
    CTRL_key=0; 
} 

전체 코드 목록 :

#define _WIN32_WINNT 0x0400 
#pragma comment(lib, "user32.lib") 

#include <windows.h> 
#include <stdio.h> 

HHOOK hKeyboardHook; 

__declspec(dllexport) LRESULT CALLBACK KeyboardEvent (int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    DWORD SHIFT_key=0; 
    DWORD CTRL_key=0; 
    DWORD ALT_key=0; 

    if ((nCode == HC_ACTION) && ((wParam == WM_SYSKEYDOWN) || (wParam == WM_KEYDOWN)))  
    { 
     KBDLLHOOKSTRUCT hooked_key = *((KBDLLHOOKSTRUCT*)lParam); 
     DWORD dwMsg = 1; 
     dwMsg += hooked_key.scanCode << 16; 
     dwMsg += hooked_key.flags << 24; 
     char lpszKeyName[1024] = {0}; 
     lpszKeyName[0] = '['; 

     int i = GetKeyNameText(dwMsg, (lpszKeyName+1),0xFF) + 1; 
     lpszKeyName[i] = ']'; 

     int key = hooked_key.vkCode; 

     SHIFT_key = GetAsyncKeyState(VK_SHIFT); 
     CTRL_key = GetAsyncKeyState(VK_CONTROL); 
     ALT_key = GetAsyncKeyState(VK_MENU); 

     if (key >= 'A' && key <= 'Z') 
     { 

      if (GetAsyncKeyState(VK_SHIFT)>= 0) key +=32; 

      if (CTRL_key !=0 && key == 'y') 
      { 
       MessageBox(NULL, "CTRL-y was pressed\nLaunch your app here", "H O T K E Y", MB_OK); 
       CTRL_key=0; 
      } 

      if (CTRL_key !=0 && key == 'q') 
      { 
       MessageBox(NULL, "Shutting down", "H O T K E Y", MB_OK); 
       PostQuitMessage(0); 
      } 




      printf("key = %c\n", key); 

      SHIFT_key = 0; 
      CTRL_key = 0; 
      ALT_key = 0; 

     } 

     printf("lpszKeyName = %s\n", lpszKeyName); 
    } 
    return CallNextHookEx(hKeyboardHook, nCode,wParam,lParam); 
} 

void MessageLoop() 
{ 
    MSG message; 
    while (GetMessage(&message,NULL,0,0)) 
    { 
     TranslateMessage(&message); 
     DispatchMessage(&message); 
    } 
} 

DWORD WINAPI my_HotKey(LPVOID lpParm) 
{ 
    HINSTANCE hInstance = GetModuleHandle(NULL); 
    if (!hInstance) hInstance = LoadLibrary((LPCSTR) lpParm); 
    if (!hInstance) return 1; 

    hKeyboardHook = SetWindowsHookEx ( WH_KEYBOARD_LL, (HOOKPROC) KeyboardEvent, hInstance, NULL ); 
    MessageLoop(); 
    UnhookWindowsHookEx(hKeyboardHook); 
    return 0; 
} 

int main(int argc, char** argv) 
{ 
    HANDLE hThread; 
    DWORD dwThread; 

    hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE) my_HotKey, (LPVOID) argv[0], NULL, &dwThread); 

    //ShowWindow(FindWindowA("ConsoleWindowClass", NULL), false); 

    if (hThread) return WaitForSingleObject(hThread,INFINITE); 
    else return 1; 

} 
+0

감사! 비슷한 코드가 있습니다. – secfreak

관련 문제