我一直在嘗試用C編寫一個DLL。DLL中的KeyboardHookProc在從python中調用時不會執行任何操作
安裝鉤子設置了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掛鉤是全局的,並且會捕獲所有鍵擊,但是這隻會導致我的Python代碼在返回零之前凍結一兩秒鐘。
我不是C的專家,所以任何幫助將不勝感激。謝謝。
你說得對!我需要從DLLMain保存'HMODULE'類型。現在它在'KeyboardProc'回調函數中遞增我的'keypresses'值。共享段是我嘗試Lowlevel鍵盤時留下的代碼。對於我的草率代碼抱歉,我很慚愧,但在我開始使用它之前,我會先修復它。再次,非常感謝! – mmoore 2011-04-11 23:48:58