不知道如何正确编辑此代码

时间:2019-02-22 13:41:25

标签: c winapi

好吧,我还是C语言的新手。

让我说我有这个代码:

source.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 ...”,我不知道该怎么做。
感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

  

WH_KEYBOARD_LL是全局挂钩,您需要将其挂钩过程放置在与   安装挂钩程序的应用程序。 (为简单起见,您可以在应用程序中添加钩子程序,它也可以正常工作。但这不是建议的方法。)

({SetWindowsHookExA function Using Hooks

  

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

LowLevelKeyboardProc callback function

出于学习钩子的目的,我的建议是开始使用Visual Studio Windows桌面应用程序模板(C ++)。

enter image description here

注册键盘挂钩并在挂钩中接收消息很简单。

要在钩子生成器中写入文件,您可以创建一个命名文件映射,这样就无需将文件句柄传递给钩子。您可以使用其名称打开此文件映射,并使用此文件映射写入文件。 (Creating Named Shared Memory

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编程方式。希望对您有所帮助。