我一直在尝试用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语言方面的专家,如有任何帮助我将不胜感激。谢谢。在
SetWindowsHookEx需要一个hModule-从DllMain保存hModule并将其传递到此处。(只有当线程id是您自己的线程时,才能传递NULL。)
其中一个例外是针对-ull钩子类型;这些钩子不需要hmodule参数,因为这些钩子不会注入到目标进程中——这就是为什么使用键盘的代码是“成功的”。在
至于为什么在使用KEYBOARD-docs for lowlevel keyboardhookproc时可能会阻塞,请提到安装钩子的线程(即调用setwindowshookx)必须有一个消息循环,这在python代码中可能没有。在
调试提示:看起来SetWindowsHookEx应该返回NULL(GetLastError()返回适当的错误代码);在开发代码时,根据需要使用assert/printf/OutputDebugString的某种组合来检查这些返回值是一个很好的方法,可以确保您的假设是正确的,并为您提供一些关于在哪里的线索事情出了问题。在
顺便说一句,使用键盘和键盘需要注意的另一件事是:键盘钩子被加载到目标进程中——但前提是它的位相同——所以32位钩子只看到其他32位进程按下的键。哦,键盘是在你自己的进程中被调用的,所以你可以看到所有的键-而且也不需要处理共享段(尽管据我所知,作为一个键盘钩子,它的效率也较低)。在
相关问题 更多 >
编程相关推荐