GetKeyState()
-
hi leute
Kann mir jmd folgenden funktion ( hab ich von einem keyloger ) erklähren:std::string GetKey(int Key) { std::string KeyString = ""; if (Key == 8) KeyString = "[delete]"; else if (Key == 13) KeyString = "\n"; else if (Key == 32) KeyString = " "; else if (Key == VK_PAUSE) KeyString = "[PAUSE]"; else if (Key == VK_CAPITAL) KeyString = "[CAPITAL]"; else if (Key == VK_SHIFT) KeyString = "[SHIFT]"; else if (Key == VK_TAB) KeyString = "[TABULATOR]"; else if (Key == VK_CONTROL) KeyString = "[CTRL]"; else if (Key == VK_ESCAPE) KeyString = "[ESCAPE]"; else if (Key == VK_END) KeyString = "[END]"; else if (Key == VK_HOME) KeyString = "[HOME]"; else if (Key == VK_LEFT) KeyString = "[LEFT]"; else if (Key == VK_RIGHT) KeyString = "[RIGHT]"; else if (Key == VK_UP) KeyString = "[UP]"; else if (Key == VK_DOWN) KeyString = "[DOWN]"; else if (Key == VK_SNAPSHOT) KeyString = "[SNAPSHOT]"; else if (Key == VK_NUMLOCK) KeyString = "[NUMLOCK]"; else if (Key == 190 || Key == 110) KeyString = "."; //Char klein machen // Für buchstaben??? wahrscheinlich else if (Key >=96 && Key <= 105) KeyString = Key-48; else if (Key > 47 && Key < 60) KeyString = Key; if (Key != VK_LBUTTON || Key != VK_RBUTTON) { if (Key > 64 && Key < 91) { if (GetKeyState(VK_CAPITAL)) KeyString = Key; else { Key = Key + 32; KeyString = Key; } } } return KeyString; }
also ich kapier das scho mit if und else... aber mit diesen zahlen und VK_... nicht
-
Es geht da eigentlich nur darum, dass je nach Taste (VK_... sind auch Tasten) ein String in die Variable KeyString geschrieben wird, und ddiese Variable dann als return-Wert fungiert.
Mfg Ominion
-
else if (Key >=96 && Key <= 105) KeyString = Key-48; else if (Key > 47 && Key < 60) KeyString = Key; if (Key != VK_LBUTTON || Key != VK_RBUTTON) { if (Key > 64 && Key < 91) { if (GetKeyState(VK_CAPITAL)) KeyString = Key; else { Key = Key + 32; KeyString = Key; } } }
entspricht jede dieser zahlen einer taste der tastatur? (ansi???) wenn ja gibt es irgendwo eine auflistung aller zeichen mit entsprechender zahl?
-
Ja und bestimmt. Bloß wo...einfach mal ein bisschen googeln...oder im Tafelwerk (falls du sowas hast) im Informatikteil.
Mfg Ominion
-
Wäre da nicht MapVirtualKey einfacher
?
-
und was macht dieses MapVirtualKey genau aus dem artikel von msdn werd ich nicht wirklich schlau
gibt es irgendwo einen kurzen bsp code?
-
albertk13 schrieb:
und was macht dieses MapVirtualKey genau aus dem artikel von msdn werd ich nicht wirklich schlau
gibt es irgendwo einen kurzen bsp code?Guck mal hier.
PS: Statt der else-if-Kette empfielt sich auch ein switch.
-
VK_* sind Virtual key codes von Windows. Diese Werte sind in winuser.h definiert. Wobei die Wert '0' bis '9' und 'A' bis 'Z' mit den Ascii-Werten übereinstimmen.
#include <windows.h> #include <stdio.h> struct tVK_Keys { char *name; int value; }; struct tVK_Keys VK_Keys[] = { { "VK_LBUTTON", 0x01 }, { "VK_RBUTTON", 0x02 }, { "VK_CANCEL", 0x03 }, { "VK_MBUTTON", 0x04 }, { "VK_XBUTTON1", 0x05 }, { "VK_XBUTTON2", 0x06 }, { "VK_BACK", 0x08 }, { "VK_TAB", 0x09 }, { "VK_CLEAR", 0x0C }, { "VK_RETURN", 0x0D }, { "VK_SHIFT", 0x10 }, { "VK_CONTROL", 0x11 }, { "VK_MENU", 0x12 }, { "VK_PAUSE", 0x13 }, { "VK_CAPITAL", 0x14 }, { "VK_KANA", 0x15 }, { "VK_JUNJA", 0x17 }, { "VK_FINAL", 0x18 }, { "VK_KANJI", 0x19 }, { "VK_ESCAPE", 0x1B }, { "VK_CONVERT", 0x1C }, { "VK_NONCONVERT", 0x1D }, { "VK_ACCEPT", 0x1E }, { "VK_MODECHANGE", 0x1F }, { "VK_SPACE", 0x20 }, { "VK_PRIOR", 0x21 }, { "VK_NEXT", 0x22 }, { "VK_END", 0x23 }, { "VK_HOME", 0x24 }, { "VK_LEFT", 0x25 }, { "VK_UP", 0x26 }, { "VK_RIGHT", 0x27 }, { "VK_DOWN", 0x28 }, { "VK_SELECT", 0x29 }, { "VK_PRINT", 0x2A }, { "VK_EXECUTE", 0x2B }, { "VK_SNAPSHOT", 0x2C }, { "VK_INSERT", 0x2D }, { "VK_DELETE", 0x2E }, { "VK_HELP", 0x2F }, { "VK_LWIN", 0x5B }, { "VK_RWIN", 0x5C }, { "VK_APPS", 0x5D }, { "VK_SLEEP", 0x5F }, { "VK_NUMPAD0", 0x60 }, { "VK_NUMPAD1", 0x61 }, { "VK_NUMPAD2", 0x62 }, { "VK_NUMPAD3", 0x63 }, { "VK_NUMPAD4", 0x64 }, { "VK_NUMPAD5", 0x65 }, { "VK_NUMPAD6", 0x66 }, { "VK_NUMPAD7", 0x67 }, { "VK_NUMPAD8", 0x68 }, { "VK_NUMPAD9", 0x69 }, { "VK_MULTIPLY", 0x6A }, { "VK_ADD", 0x6B }, { "VK_SEPARATOR", 0x6C }, { "VK_SUBTRACT", 0x6D }, { "VK_DECIMAL", 0x6E }, { "VK_DIVIDE", 0x6F }, { "VK_F1", 0x70 }, { "VK_F2", 0x71 }, { "VK_F3", 0x72 }, { "VK_F4", 0x73 }, { "VK_F5", 0x74 }, { "VK_F6", 0x75 }, { "VK_F7", 0x76 }, { "VK_F8", 0x77 }, { "VK_F9", 0x78 }, { "VK_F10", 0x79 }, { "VK_F11", 0x7A }, { "VK_F12", 0x7B }, { "VK_F13", 0x7C }, { "VK_F14", 0x7D }, { "VK_F15", 0x7E }, { "VK_F16", 0x7F }, { "VK_F17", 0x80 }, { "VK_F18", 0x81 }, { "VK_F19", 0x82 }, { "VK_F20", 0x83 }, { "VK_F21", 0x84 }, { "VK_F22", 0x85 }, { "VK_F23", 0x86 }, { "VK_F24", 0x87 }, { "VK_NUMLOCK", 0x90 }, { "VK_SCROLL", 0x91 }, { "VK_OEM_NEC_EQUAL", 0x92 }, { "VK_OEM_FJ_JISHO", 0x92 }, { "VK_OEM_FJ_MASSHOU", 0x93 }, { "VK_OEM_FJ_TOUROKU", 0x94 }, { "VK_OEM_FJ_LOYA", 0x95 }, { "VK_OEM_FJ_ROYA", 0x96 }, { "VK_LSHIFT", 0xA0 }, { "VK_RSHIFT", 0xA1 }, { "VK_LCONTROL", 0xA2 }, { "VK_RCONTROL", 0xA3 }, { "VK_LMENU", 0xA4 }, { "VK_RMENU", 0xA5 }, { "VK_BROWSER_BACK", 0xA6 }, { "VK_BROWSER_FORWARD", 0xA7 }, { "VK_BROWSER_REFRESH", 0xA8 }, { "VK_BROWSER_STOP", 0xA9 }, { "VK_BROWSER_SEARCH", 0xAA }, { "VK_BROWSER_FAVORITES", 0xAB }, { "VK_BROWSER_HOME", 0xAC }, { "VK_VOLUME_MUTE", 0xAD }, { "VK_VOLUME_DOWN", 0xAE }, { "VK_VOLUME_UP", 0xAF }, { "VK_MEDIA_NEXT_TRACK", 0xB0 }, { "VK_MEDIA_PREV_TRACK", 0xB1 }, { "VK_MEDIA_STOP", 0xB2 }, { "VK_MEDIA_PLAY_PAUSE", 0xB3 }, { "VK_LAUNCH_MAIL", 0xB4 }, { "VK_LAUNCH_MEDIA_SELECT", 0xB5 }, { "VK_LAUNCH_APP1", 0xB6 }, { "VK_LAUNCH_APP2", 0xB7 }, { "VK_OEM_1", 0xBA }, { "VK_OEM_PLUS", 0xBB }, { "VK_OEM_COMMA", 0xBC }, { "VK_OEM_MINUS", 0xBD }, { "VK_OEM_PERIOD", 0xBE }, { "VK_OEM_2", 0xBF }, { "VK_OEM_3", 0xC0 }, { "VK_OEM_4", 0xDB }, { "VK_OEM_5", 0xDC }, { "VK_OEM_6", 0xDD }, { "VK_OEM_7", 0xDE }, { "VK_OEM_8", 0xDF }, { "VK_OEM_AX", 0xE1 }, { "VK_OEM_102", 0xE2 }, { "VK_ICO_HELP", 0xE3 }, { "VK_ICO_00", 0xE4 }, { "VK_PROCESSKEY", 0xE5 }, { "VK_ICO_CLEAR", 0xE6 }, { "VK_PACKET", 0xE7 }, { "VK_OEM_RESET", 0xE9 }, { "VK_OEM_JUMP", 0xEA }, { "VK_OEM_PA1", 0xEB }, { "VK_OEM_PA2", 0xEC }, { "VK_OEM_PA3", 0xED }, { "VK_OEM_WSCTRL", 0xEE }, { "VK_OEM_CUSEL", 0xEF }, { "VK_OEM_ATTN", 0xF0 }, { "VK_OEM_FINISH", 0xF1 }, { "VK_OEM_COPY", 0xF2 }, { "VK_OEM_AUTO", 0xF3 }, { "VK_OEM_ENLW", 0xF4 }, { "VK_OEM_BACKTAB", 0xF5 }, { "VK_ATTN", 0xF6 }, { "VK_CRSEL", 0xF7 }, { "VK_EXSEL", 0xF8 }, { "VK_EREOF", 0xF9 }, { "VK_PLAY", 0xFA }, { "VK_ZOOM", 0xFB }, { "VK_NONAME", 0xFC }, { "VK_PA1", 0xFD }, { "VK_OEM_CLEAR", 0xFE }, { 0 } }; int useparms(int a, ...) { return a; } char *fbprint(char *format, ...) { static char buf[160]; vsprintf(buf, format, (&format)+1); return (char *)buf; } long TextOutStr(HDC hdc, int x, int y, char *s) { return TextOut(hdc, x, y, s, strlen(s)); } char *GetVKName(int vk) { int i; static char buf[10]; if (vk >= '0' && vk <= '9' || vk >= 'A' && vk <= 'Z') { buf[0] = (char)vk; buf[1] = 0; return buf; } for (i = 0; VK_Keys[i].name; i++) if (VK_Keys[i].value == vk) return VK_Keys[i].name; return ""; } static int shiftstate; static int lshiftstate; static int rshiftstate; static int controlstate; static int lcontrolstate; static int rcontrolstate; static int menustate; static int lmenustate; static int rmenustate; static int Astate; static int shiftastate; static int lshiftastate; static int rshiftastate; static int controlastate; static int lcontrolastate; static int rcontrolastate; static int menuastate; static int lmenuastate; static int rmenuastate; static int Aastate; static unsigned char lpKeyState[256]; void GetStates(void) { shiftstate = GetKeyState(VK_SHIFT); lshiftstate = GetKeyState(VK_LSHIFT); rshiftstate = GetKeyState(VK_RSHIFT); controlstate = GetKeyState(VK_CONTROL); lcontrolstate = GetKeyState(VK_LCONTROL); rcontrolstate = GetKeyState(VK_RCONTROL); menustate = GetKeyState(VK_MENU); lmenustate = GetKeyState(VK_LMENU); rmenustate = GetKeyState(VK_RMENU); Astate = GetKeyState('A'); shiftastate = GetKeyState(VK_SHIFT); lshiftastate = GetKeyState(VK_LSHIFT); rshiftastate = GetKeyState(VK_RSHIFT); controlastate = GetKeyState(VK_CONTROL); lcontrolastate = GetKeyState(VK_LCONTROL); rcontrolastate = GetKeyState(VK_RCONTROL); menuastate = GetKeyState(VK_MENU); lmenuastate = GetKeyState(VK_LMENU); rmenuastate = GetKeyState(VK_RMENU); Aastate = GetKeyState('A'); GetKeyboardState((unsigned char *)&lpKeyState); } long _stdcall WndProc(HWND hwnd, unsigned int message, unsigned int wParam, long lParam) { HDC hdc; PAINTSTRUCT ps; static TEXTMETRIC tm; static unsigned int KEYDOWN_nVirtKey; static long KEYDOWN_lKeyData; static unsigned int KEYUP_nVirtKey; static long KEYUP_lKeyData; static unsigned int CHAR_chCharCode; static long CHAR_lKeyData; static unsigned int SYSKEYDOWN_nVirtKey; static long SYSKEYDOWN_lKeyData; static unsigned int SYSKEYUP_nVirtKey; static long SYSKEYUP_lKeyData; static unsigned int SYSCHAR_chCharCode; static long SYSCHAR_lKeyData; static unsigned int SYSDEADCHAR_chCharCode; static long SYSDEADCHAR_lKeyData; int x, y; static char kbuf[80]; switch(message) { case WM_CREATE: hdc = GetDC(hwnd); GetTextMetrics(hdc, &tm); ReleaseDC(hwnd, hdc); ZeroMemory(&lpKeyState, 256); shiftstate = lshiftstate = rshiftstate = 0; controlstate = lcontrolstate = rcontrolstate = 0; menustate = lmenustate = rmenustate = 0; Astate = 0; shiftastate = lshiftastate = rshiftastate = 0; controlastate = lcontrolastate = rcontrolastate = 0; menuastate = lmenuastate = rmenuastate = 0; Astate = 0; return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); *kbuf = 0; GetKeyNameText(KEYDOWN_lKeyData, kbuf, sizeof(kbuf)); TextOutStr(hdc, 20, 10, fbprint("KEYDOWN_nVirtKey 0x%02X %s", KEYDOWN_nVirtKey, GetVKName(KEYDOWN_nVirtKey))); TextOutStr(hdc, 20, 30, fbprint("KEYDOWN_lKeyData 0x%08X %s", KEYDOWN_lKeyData, kbuf)); *kbuf = 0; GetKeyNameText(KEYUP_lKeyData, kbuf, sizeof(kbuf)); TextOutStr(hdc, 20, 50, fbprint("KEYUP_nVirtKey 0x%02X %s", KEYUP_nVirtKey, GetVKName(KEYUP_nVirtKey))); TextOutStr(hdc, 20, 70, fbprint("KEYUP_lKeyData 0x%08X %s", KEYUP_lKeyData, kbuf)); *kbuf = 0; GetKeyNameText(CHAR_lKeyData, kbuf, sizeof(kbuf)); TextOutStr(hdc, 20, 90, fbprint("CHAR_chCharCode 0x%02X %c", CHAR_chCharCode, CHAR_chCharCode)); TextOutStr(hdc, 20, 110, fbprint("CHAR_lKeyData 0x%08X %s", CHAR_lKeyData, kbuf)); *kbuf = 0; GetKeyNameText(SYSKEYDOWN_lKeyData, kbuf, sizeof(kbuf)); TextOutStr(hdc, 380, 10, fbprint("SYSKEYDOWN_nVirtKey 0x%02X %s", SYSKEYDOWN_nVirtKey, GetVKName(SYSKEYDOWN_nVirtKey))); TextOutStr(hdc, 380, 30, fbprint("SYSKEYDOWN_lKeyData 0x%08X %s", SYSKEYDOWN_lKeyData, kbuf)); *kbuf = 0; GetKeyNameText(SYSKEYUP_lKeyData, kbuf, sizeof(kbuf)); TextOutStr(hdc, 380, 50, fbprint("SYSKEYUP_nVirtKey 0x%02X %s", SYSKEYUP_nVirtKey, GetVKName(SYSKEYUP_nVirtKey))); TextOutStr(hdc, 380, 70, fbprint("SYSKEYUP_lKeyData 0x%08X %s", SYSKEYUP_lKeyData, kbuf)); *kbuf = 0; GetKeyNameText(SYSCHAR_lKeyData, kbuf, sizeof(kbuf)); TextOutStr(hdc, 380, 90, fbprint("SYSCHAR_chCharCode 0x%02X %c", SYSCHAR_chCharCode, SYSCHAR_chCharCode)); TextOutStr(hdc, 380, 110, fbprint("SYSCHAR_lKeyData 0x%08X %s", SYSCHAR_lKeyData, kbuf)); *kbuf = 0; GetKeyNameText(SYSDEADCHAR_lKeyData, kbuf, sizeof(kbuf)); TextOutStr(hdc, 380, 130, fbprint("SYSDEADCHAR_chCharCode 0x%02X %c", SYSDEADCHAR_chCharCode, SYSDEADCHAR_chCharCode)); TextOutStr(hdc, 380, 150, fbprint("SYSDEADCHAR_lKeyData 0x%08X %s", SYSDEADCHAR_lKeyData, kbuf)); TextOutStr(hdc, 790, 10, fbprint("shiftstate %02X %02X", shiftstate&0xFF, shiftastate&0xFF)); TextOutStr(hdc, 790, 30, fbprint("lshiftstate %02X %02X", lshiftstate&0xFF, lshiftastate&0xFF)); TextOutStr(hdc, 790, 50, fbprint("rshiftstate %02X %02X", rshiftstate&0xFF, rshiftastate&0xFF)); TextOutStr(hdc, 790, 70, fbprint("controlstate %02X %02X", controlstate&0xFF, controlastate&0xFF)); TextOutStr(hdc, 790, 90, fbprint("lcontrolstate %02X %02X", lcontrolstate&0xFF, lcontrolastate&0xFF)); TextOutStr(hdc, 790, 110, fbprint("rcontrolstate %02X %02X", rcontrolstate&0xFF, rcontrolastate&0xFF)); TextOutStr(hdc, 950, 10, fbprint("menustate %02X %02X", menustate&0xFF, menuastate&0xFF)); TextOutStr(hdc, 950, 30, fbprint("lmenustate %02X %02X", lmenustate&0xFF, lmenuastate&0xFF)); TextOutStr(hdc, 950, 50, fbprint("rmenustate %02X %02X", rmenustate&0xFF, rmenuastate&0xFF)); TextOutStr(hdc, 950, 70, fbprint("'A'state %02X %02X", Astate&0xFF, Aastate&0xFF)); for (y = 0; y < 16; y++) for (x = 0; x < 16; x++) { char *vkname; vkname = GetVKName(y*16+x); if (vkname) { if (strlen(vkname) > 3 && strncmp(vkname, "VK_", 3) == 0) vkname += 3; TextOutStr(hdc, 10+x*70, 200+y*40, fbprint("%s", vkname)); } } for (y = 0; y < 16; y++) for (x = 0; x < 16; x++) TextOutStr(hdc, 10+x*70, 180+y*40, fbprint("%X", lpKeyState[y*16+x])); EndPaint(hwnd, &ps); return 0; case WM_KEYDOWN: KEYUP_nVirtKey = 0; KEYUP_lKeyData = 0; KEYDOWN_nVirtKey = wParam; KEYDOWN_lKeyData = lParam; GetStates(); InvalidateRect(hwnd, 0, TRUE); UpdateWindow(hwnd); return 0; case WM_KEYUP: KEYDOWN_nVirtKey = 0; KEYDOWN_lKeyData = 0; CHAR_chCharCode = 0; CHAR_lKeyData = 0; KEYUP_nVirtKey = wParam; KEYUP_lKeyData = lParam; GetStates(); InvalidateRect(hwnd, 0, TRUE); UpdateWindow(hwnd); return 0; case WM_CHAR: CHAR_chCharCode = wParam; CHAR_lKeyData = lParam; GetStates(); InvalidateRect(hwnd, 0, TRUE); UpdateWindow(hwnd); return 0; case WM_SYSKEYDOWN: SYSKEYUP_nVirtKey = 0; SYSKEYUP_lKeyData = 0; SYSKEYDOWN_nVirtKey = wParam; SYSKEYDOWN_lKeyData = lParam; GetStates(); InvalidateRect(hwnd, 0, TRUE); UpdateWindow(hwnd); return 0; case WM_SYSKEYUP: SYSCHAR_chCharCode = 0; SYSCHAR_lKeyData = 0; SYSDEADCHAR_chCharCode = 0; SYSDEADCHAR_lKeyData = 0; SYSKEYDOWN_nVirtKey = 0; SYSKEYDOWN_lKeyData = 0; SYSKEYUP_nVirtKey = wParam; SYSKEYUP_lKeyData = lParam; GetStates(); InvalidateRect(hwnd, 0, TRUE); UpdateWindow(hwnd); return 0; case WM_SYSCHAR: SYSCHAR_chCharCode = wParam; SYSCHAR_lKeyData = lParam; GetStates(); InvalidateRect(hwnd, 0, TRUE); UpdateWindow(hwnd); return 0; case WM_SYSDEADCHAR: SYSDEADCHAR_chCharCode = wParam; SYSDEADCHAR_lKeyData = lParam; InvalidateRect(hwnd, 0, TRUE); UpdateWindow(hwnd); return 0; case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: GetStates(); InvalidateRect(hwnd, 0, TRUE); UpdateWindow(hwnd); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char *szCmdLine, int iCmdShow) { HWND hwnd; MSG msg; WNDCLASS wc; char *cln = "mbclass"; memset(&wc, 0, sizeof(WNDCLASS)); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hIcon = LoadIcon(0, IDI_INFORMATION); wc.hCursor = LoadCursor(0, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszClassName = cln; RegisterClass(&wc); hwnd = CreateWindow(cln, "Titel", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, 0); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); useparms(0, hPrevInstance, szCmdLine); while(GetMessage(&msg, 0, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
-
Ist das nicht ein bisschen übertrieben für ein KeyLogger ? Es reicht doch die relevanten Tasten anzuzeigen und bei Steuertasten eine entsprechende Trennung einzubauen (Beispiel: Bei einem VK_RETURN wird wirklich eine neue Zeile in die Log-Datei geschreiben
), dann würde nämlich reichen:
inline TCHAR ConvertVirtualKey(UINT uiVirtKey) { #ifndef MAPVK_VK_TO_CHAR #define MAPVK_VK_TO_CHAR 0x02 #endif // MAPVK_VK_TO_CHAR return (MapVirtualKey(uiVirtKey, MAPVK_VK_TO_CHAR)); }
PS: @keksekekse: Der Return-Wert der Funktion 'GetVKName' sollte const char* sein.
-
Und UNICODE-Support, falls überhaupt relevant, sollte auch berücksichtigt werden.
-
Ok super danke vll check ichs ja lol
-
Mir fällt gerade so auf, dass meine Funktion irgendwie auch überflüssiger Balast ist^^. Man kann den Aufruf von MapVirtualKey auch direkt einsetzen
.