在Python中调用DLL中的KeyboardHookProc不起作用

2024-10-17 08:35:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试用C写一个动态链接库

安装钩子设置键盘程序。从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代码如下:

^{pr2}$

[在此处键入内容]

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

编辑:我应该提到我也尝试过LowLevelKeyboardHook。我知道lowlevelhook是全局的,它将捕捉所有的击键,但这只是导致我的dll.InstallHook()Python代码在返回零之前冻结了一两秒钟。在

我不是C语言方面的专家,如有任何帮助我将不胜感激。谢谢。在


Tags: 函数代码returnincludeintflagsvoidpragma
1条回答
网友
1楼 · 发布于 2024-10-17 08:35:17
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, 0);

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

其中一个例外是针对-ull钩子类型;这些钩子不需要hmodule参数,因为这些钩子不会注入到目标进程中——这就是为什么使用键盘的代码是“成功的”。在

至于为什么在使用KEYBOARD-docs for lowlevel keyboardhookproc时可能会阻塞,请提到安装钩子的线程(即调用setwindowshookx)必须有一个消息循环,这在python代码中可能没有。在

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

顺便说一句,使用键盘和键盘需要注意的另一件事是:键盘钩子被加载到目标进程中——但前提是它的位相同——所以32位钩子只看到其他32位进程按下的键。哦,键盘是在你自己的进程中被调用的,所以你可以看到所有的键-而且也不需要处理共享段(尽管据我所知,作为一个键盘钩子,它的效率也较低)。在

相关问题 更多 >