【发布时间】:2011-08-03 11:18:59
【问题描述】:
我一直在尝试用 C 编写一个 DLL。
安装挂钩设置 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 钩子是全局的,并且会捕获所有击键,但这只会导致我的 dll.InstallHook() Python 代码在返回零之前冻结一两秒。
我不是 C 方面的专家,因此我们将不胜感激。谢谢。
【问题讨论】: