首页 > 解决方案 > 不知道如何正确编辑此代码

问题描述

好吧,我对 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 ...”,我不知道该怎么做。
我会感谢任何帮助。

标签: cwinapi

解决方案


WH_KEYBOARD_LL 是全局钩子,您需要将其钩子程序放在一个独立于安装钩子程序的应用程序的 DLL 中。(为了简单的目的,您可以将钩子程序放在您的应用程序中,它也可以工作。但这不是建议的方式。)

使用 Hooks的 SetWindowsHookExA 函数

这个钩子在安装它的线程的上下文中被调用。通过向安装钩子的线程发送消息来进行调用。因此,安装钩子的线程必须有一个消息循环。(换句话说,应用程序需要有一个窗口,以便它可以继续发送消息。)

( LowLevelKeyboardProc 回调函数)

出于学习钩子的目的,我的建议是开始使用 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 编程方式。希望能帮助到你。


推荐阅读