2013-03-16 1 views
2

PC에서 실행되는 모든 응용 프로그램에서 키보드 이벤트를 처리하는 C++ 응용 프로그램 (실제로는 사용자가 입력하는 일부 구문을 "catch"하려는 경우)을 만들려고합니다. 내가 만들려고 노력하고있는 무슨의 아주 기본은 이것이다 :Windows API 전역 후크의 무제한 범위

#define _WIN32_WINNT 0x0500 

#include <iostream> 
#include <windows.h> 
using namespace std; 

HHOOK hHook; 

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    printf("Activated\n"); 
    return CallNextHookEx(hHook, nCode, wParam, lParam); 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0); 
    MSG msg; 
    while(GetMessage(&msg, NULL, 0, 0)) 
    { 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
    } 
    return msg.wParam; 
} 

자,이 사람은 세계입니다,하지만 난 실행할 때 내 키보드 입력을 "듣고"하지 않는 것을 알았을 때 여전히 나는 붙어있어 특정 애플리케이션 내 응용 프로그램의 바탕 화면에이 콜백 함수가 전역이므로 원하는 응용 프로그램이 내 응용 프로그램과 동일한 바탕 화면에 속하지 않는 것이 문제라는 것을 알았습니다. 데스크톱 전환 트릭을 ​​구현하려고했지만 Windows API에 익숙하지 않아 모든 노력이 곧 실패했습니다. MSDN 추천은 자습서로 충분하지 않습니다. 내 응용 프로그램을 컴퓨터의 키보드 입력을 어디서나 들려 줄 수있는 방법이 있습니까?

미리 도움 주시면 감사하겠습니다.

+0

이러한 제한 사항으로 인해 사용자 (사용자)가 악성 응용 프로그램 (키로거 등)으로부터 보호받을 수 있습니다. 그들은 그렇게 많이 성공하지는 않습니다 ... – rodrigo

+0

두 번째 데스크탑의 글로벌 후크입니다. – Xearinox

+0

응용 프로그램은 자신의 데스크톱이 아닌 다른 데스크톱에 액세스 할 수 없습니다. 각 데스크톱에 응용 프로그램 복사본이 필요하거나 드라이버를 사용해야합니다. 왜 다른 데스크톱을 연결해야하는지 명확하지 않습니다. 어쩌면 다른 데스크탑에 로그인 한 사람이 매크로 프로그램을 원하지 않을 수도 있습니다. (어쩌면 다른 사람이 당신이 자신의 활동을 키로깅하는 것을 원하지 않는 관리자 일 수 있습니다.) –

답변

2

전역 후크는 DLL에 구현되어야하므로 여러 프로세스에 연결할 수 있습니다. 또한 64 비트 시스템을 지원하려면 별도의 32 비트 및 64 비트 버전을 구현해야합니다. SetWindowsHookEx()에 대한 설명서에는 그 내용이 많이 나와 있습니다.

글로벌 훅을 사용하는 대신 Raw Input을 대신 사용해보십시오. RegisterRawInputDevices()을 사용하여 키보드에 관심을 등록한 다음 키 입력에 대한 메시지를 WM_INPUT 처리하십시오.

+0

흠, 상호 작용할 때 장치를 직접 처리하는 것은 길로 보입니다. 팁을 주셔서 감사합니다. 확실히 확인해 보겠습니다. – Hallion

+0

Uuum, Raw Input 모델을 사용하기 위해 내가해야 할 일이 있습니까? Microsoft Platform SDK를 설치하고 VC20 프로젝트의 해당 디렉토리에 "Microsoft Platform SDK \ Lib"및 "Microsoft Platform SDK \ Include"경로를 포함 시켰지만 원시 입력 선언을 사용할 때 여전히 "선언되지 않은 식별자"오류가 발생합니다. . – Hallion

+0

코드가'#include''windows.h'인지 확인하십시오. 프로젝트가'_WIN32_WINNT'을'0x0501' 이상으로 정의하고 있습니다. –