c - 不知道如何正确编辑此代码
问题描述
好吧,我对 C 语言还是有点陌生。
可以说我有这个代码:
来源.c
#include "logger.c"
int main{
FILE *myfile1;
fileX = fopen("myfile.txt, a+);
SetHook(fileX);
}
然后我有非常简单的键盘记录器
logger.c
HHOOK _hook;
KBDLLHOOKSTRUCT kbdStruct;
LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
if (wParam == WM_KEYDOWN)
{
// PRINT INTO THE FILE
kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
fprintf(fileX, "%c", kbdStruct.vkCode);
}
}
return CallNextHookEx(_hook, nCode, wParam, lParam);
}
void SetHook(fileX)
{
_hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0)
}
基本上我想有这样的分离代码。
但我认为这是错误的,我需要将“fileX”传递给函数 setHOOK(),而不是传递给“LRESULT __stdcall ...”,我不知道该怎么做。
我会感谢任何帮助。
解决方案
WH_KEYBOARD_LL 是全局钩子,您需要将其钩子程序放在一个独立于安装钩子程序的应用程序的 DLL 中。(为了简单的目的,您可以将钩子程序放在您的应用程序中,它也可以工作。但这不是建议的方式。)
(使用 Hooks的 SetWindowsHookExA 函数 )
这个钩子在安装它的线程的上下文中被调用。通过向安装钩子的线程发送消息来进行调用。因此,安装钩子的线程必须有一个消息循环。(换句话说,应用程序需要有一个窗口,以便它可以继续发送消息。)
出于学习钩子的目的,我的建议是开始使用 Visual Studio Windows 桌面应用程序模板 (C++)。
注册键盘钩子并在钩子中接收消息很简单。
对于在钩子生产者中写入文件,您可以创建一个命名文件映射,这样您就不需要将文件句柄传递给钩子。您可以使用其名称打开此文件映射并使用此文件映射写入文件。(创建命名共享内存)
static HHOOK hhookKeyPress;
hhookKeyPress = SetWindowsHookEx(
WH_KEYBOARD_LL,
KeyboardHookCallback,
NULL,
0);
// Main message loop:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
分享以上信息以帮助您入门,然后您可以在以后找到 C 编程方式。希望能帮助到你。
推荐阅读
- c++ - 为什么互斥锁可以在 C++ 中锁定两次而不解锁?
- php - 如何使用 ?在网址中?
- android - Android Studio 在更新 4.0.1 后不工作
- javascript - Chrome 扩展:在 Angular 站点中准备好 DOM 后,无法获取 DOM 元素
- python - 无法使用视图名称“usermodel-detail”解析超链接关系的 URL
- python-3.x - Python 3 Imaplib -(错误:EXPUNGE 失败,BAD [b'Command Argument Error.11'])无法从 Microsoft 服务帐户中删除邮件
- parsing - 斯坦福解析器 - amod 和 nsubj 依赖关系 - 谓词和定语形容词的组合
- java - 在流上调用 forEach 会导致 java.lang.IllegalStateException
- oxid - Phpstan Class_parent 未找到
- excel - Excel合并单元格,排除空值,正确读取日期