Я пытался написать DLL на C.
Установочный хук устанавливает KeyboardProc. Вызов функций InstallHook()
и UninstallHook()
из Python всегда возвращает 0, что, я думаю, объясняется тем, что моя функция обратного вызова KeyboardProc
не работает.
Ниже приведен мой C-код для DLL:
#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 зависнуть на секунду или две, прежде чем вернуть ноль.
Я не эксперт в Си, поэтому любая помощь будет принята с благодарностью. Спасибо.