2011-09-23 13 views
0

그래서 오늘 밤에 작은 키로거를 작성하여 getAsyncKeyState에 대해 배우기로 결정했습니다. 내 로그를 파일에 쓰려고하지만 파일의 내용이 비어 있거나 임의의 메모리 주소를 내게 던졌습니다 (0x28fef0 전에). getAsyncKeyState가 Windows 7 x64에서 제대로 작동하지 않는다고 들었습니다. 사실입니까?getAsyncKeyState가 키 입력을 인식하지 못합니다.

이것은 꽤 심해지고 있습니다. 저는 오늘 밤이 프로그램을 실제로 사용할 수 있기를 희망했습니다.

while(1) 
    { 
     Sleep(20); 
     for(DWORD_PTR key = 8; key <= 190; key++) 
     { 
      if (GetAsyncKeyState(key) == HC_ACTION) 
       checkKey(key); 
     } 
    } 

기능 정의

void checkKey(DWORD_PTR key) 
{ 
    ofstream out; 
    out.open("log.txt"); 

     if (key==8) 
      out << "[del]"; 
     if (key==13) 
      out << "n"; 
     if (key==32) 
      out << " "; 
     if (key==VK_CAPITAL) 
      out << "[CAPS]"; 
     if (key==VK_TAB) 
      out << "[TAB]"; 
     if (key==VK_SHIFT) 
      out << "[SHIFT]"; 
     if (key==VK_CONTROL) 
      out << "[CTRL]"; 
     if (key==VK_PAUSE) 
      out << "[PAUSE]"; 
     if (key==VK_ESCAPE) 
      out << "[ESC]"; 
     if (key==VK_END) 
      out << "[END]"; 
     if (key==VK_HOME) 
      out << "[HOME]"; 
     if (key==VK_LEFT) 
      out << "[LEFT]"; 
     if (key==VK_UP) 
      out << "[UP]"; 
     if (key==VK_RIGHT) 
      out << "[RIGHT]"; 
     if (key==VK_DOWN) 
      out << "[DOWN]"; 
     if (key==VK_SNAPSHOT) 
      out << "[PRINT]"; 
     if (key==VK_NUMLOCK) 
      out << "[NUM LOCK]"; 
     if (key==190 || key==110) 
      out << "."; 
     if (key >=96 && key <= 105) 
     { 
      key -= 48; 
      out << &key; // had ampersand 
     } 
     if (key >=48 && key <= 59) 
      out << &key; // amp'd 
     if (key !=VK_LBUTTON || key !=VK_RBUTTON) 
     { 
      if (key >=65 && key <=90) 
      { 
       if (GetKeyState(VK_CAPITAL)) 
       out << &key; // amp;d 
      else 
      { 
       key = key +32; 
       out << &key; // amp'd 
      } 
     } 
     } 
} 

내가 심각하게이 문제로 난처한 상황에 빠진거야 어떤 도움을 크게 감상 할 수있다. 이 기능이 64 비트 시스템에서 다르게 작동하는 이유는 무엇입니까? 그것이 내가 가지고있는 유일한 상자라고 생각하면 32 비트로 실행하여 격리 된 문제인지 여부를 확인할 수 없습니다. 왜냐하면 나는 그것이 getAsyncKeyState와 관련되어 있고 내 코드 (빈 로그 파일을 컴파일하고 생성하는)가 아니라고 가정하기 때문에이 두 코드 스 니펫 만 포함했습니다.

+0

전체 키보드의 상태 (모든 키)를 가져 오려면 'GetAsyncKeyState'를 여러 번 호출하지 마십시오. 대신'GetKeyboardState'를 호출하십시오. 그것은 훨씬 더 잘 수행 할 것입니다.그러나 키 로거의 경우 키보드 후크를 사용하거나'WM_KEYUP','WM_KEYDOWN' 등을 듣고 싶습니다. –

답변

1

이 기능을 잘못 사용하고 있습니다. 도움을 요청하는 것은 일반적으로 좋은 생각입니다 전에

난 그냥 여기 MSDN을 인용거야 ... 문서를 읽기 :

를 함수가 성공하면 반환 값은 키 이 지난 이후 눌렀는지 여부를 지정합니다 GetAsyncKeyState를 호출하고 키가 현재 작동 중이거나 작동 중지 상태인지 확인합니다. 최상위 비트가 설정되면 키가 작동 중지되고 최하위 비트가 설정된 경우 키는 이전에 GetAsyncKeyState를 호출 한 후에 이 누적 된 것입니다. 그러나 은이 마지막 동작에 의존하면 안됩니다. 자세한 내용은 설명을 참조하십시오.

마지막 부분은 키 로거에서 완전히 쓸모 없다는 의미입니다.

추신 : 가상 키 코드를 의미있는 이름으로 변환하려면 GetKeyNameText을 사용해보십시오.

+0

감사합니다. MSDN을 지금부터 두 번 확인해야 겠어. 내가 간과 한 것 같아. –

1

글쎄, 먼저 키 로거를 쓰는 경우 GetAsyncKeyState를 사용하고 싶지는 않습니다. GetAsyncKeyState는 함수를 호출하는 즉시 키의 상태를 가져옵니다. WM_KEYDOWN, WM_KEYUP 등의 목적이나 WM_CHAR, WM_UNICHAR 등의 목적에 따라 Windows 메시지를 수신해야합니다.

+0

피드백을 보내 주셔서 감사합니다. –

1

입력을 모니터링하기 위해 MSDN에서 WHWKEYBOARD_LL로 SetWindowsHookEx를 찾아 보는 것이 키보드 후크와 같은 방법 일 수 있습니다.

다른 곳에서 언급했듯이 여기서 GetAsyncKeyState를 올바르게 사용하지 않는 것입니다. 왜 주소를보고있는에 관해서는

가 나타납니다 : 키가 너무 & 키 포인터가하는 DWORD_PTR입니다 - 주소가 오는 곳이 가능성이 높습니다 :

out << &key; // amp'd 

이 코드에서 여러 장소이다 에서.

관련 문제