gpt4 book ai didi

python - 从 python 调用时,DLL 中的 KeyboardHookProc 不执行任何操作

转载 作者:行者123 更新时间:2023-11-30 16:02:09 25 4
gpt4 key购买 nike

我一直在尝试用 C 语言编写 DLL。

安装 Hook 设置 KeyboardProc。从 Python 调用 InstallHook()UninstallHook() 函数总是返回 0,我猜这是因为我的回调函数 KeyboardProc 不是工作。

以下是我的 DLL 的 C 代码:

#include "stdafx.h"
#include <windows.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include "ourdll.h"

//#pragma comment(linker, "/SECTION:.SHARED,RWS")
//#pragma data_seg(".SHARED")
HHOOK hKeyboardHook = 0;
int keypresses = 0;
HMODULE hInstance = 0;

//#pragma data_seg()

BOOL WINAPI DllMain (HANDLE hModule, DWORD dwFunction, LPVOID lpNot)
{
hInstance = hModule; //Edit
return TRUE;
}

LRESULT CALLBACK KeyboardProc(int hookCode, WPARAM vKeyCode, LPARAM flags)
{
if(hookCode < 0)
{
return CallNextHookEx(hKeyboardHook, hookCode, vKeyCode, flags);
}

keypresses++;;

return CallNextHookEx(hKeyboardHook, hookCode, vKeyCode, flags);
}

__declspec(dllexport) void InstallHook(void)
{
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hInstance, 0);
}

__declspec(dllexport) int UninstallHook(void)
{
UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = 0;
return keypresses;
}

使用它的Python代码如下:

>>> from ctypes import *
>>> dll = CDLL('C:\...\OurDLL.dll')
>>> dll.InstallHook()

[此时输入一些内容]

>>> result = dll.UninstallHook()
>>> result
0

编辑:我可能应该提到我还尝试过 LowLevelKeyboardHook。我知道 LowLevel Hook 是全局的,并且会捕获所有击键,但这只会导致我的 dll.InstallHook() Python 代码在返回零之前卡住一两秒。

我不是 C 方面的专家,所以任何帮助将不胜感激。谢谢。

最佳答案

hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, 0);

SetWindowsHookEx 需要一个 hModule - 从 DllMain 保存 hModule 并将其传递到此处。 (只有当线程id是你自己的线程时,你才可以传递NULL。)

一个异常(exception)是 _LL 钩子(Hook)类型;这些不需要 hmodule 参数,因为这些钩子(Hook)不会注入(inject)目标进程 - 这就是为什么使用 KEYBOARD_LL 的代码“成功”。

至于为什么当您使用 KEYBOARD_LL 时它可能会阻塞 - LowLevelKeyboardHookProc 的文档提到安装钩子(Hook)的线程(即调用 SetWindowsHookEx)必须有一个消息循环,而您的 python 代码中可能没有消息循环。

调试提示:看起来 SetWindowsHookEx 应该返回 NULL(GetLastError() 返回合适的错误代码);在开发代码时,适本地使用assert/printf/OutputDebugString 的某种组合来检查这些返回值是确保您的假设正确并为您提供一些关于哪里出了问题的线索的好方法。

顺便说一句,KEYBOARD 与 KEYBOARD_LL 需要注意的另一件事是:KEYBOARD Hook 被加载到目标进程中 - 但前提是它的位数相同 - 因此 32 位 Hook 只能看到其他 32 位进程按下的键。 OTOH,KEYBOARD_LL 在您自己的进程中回调,因此您可以看到所有键 - 并且也不需要处理共享段(尽管据我所知,它作为 KEYBOARD Hook 的效率也较低)。

关于python - 从 python 调用时,DLL 中的 KeyboardHookProc 不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5628614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com