【发布时间】:2020-06-04 03:14:26
【问题描述】:
我有一个 Python 程序和 Dll,它被调用来设置一个挂钩来接收某些 Windows 消息。我正在以消息框的形式收到消息,这非常好。现在我想将此消息数据传输回调用 python 文件以进行进一步的数据分析。现在我看到了很多不同的方法。一些人用 ctypes 来做,其他人用进程间通信来做。我只想知道实现实时通信最可行的方法是什么。我也是一个 C 的菜鸟,所以这没有帮助。
DLL:
// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <zmq.h>
HHOOK tHook;
HMODULE hinstDLL;
LRESULT CALLBACK meconnect(int code, WPARAM wParam, LPARAM lParam) {
if (code == HC_ACTION) {
LPMSG data = (LPMSG)lParam;
UINT message = data->message;
switch (message)
{
case WM_POINTERUPDATE:
if (!IS_POINTER_INCONTACT_WPARAM(wParam))
break;
case WM_POINTERDOWN:
case WM_POINTERUP:
//Here will be some more data extraction like coordinates or Pointertype
}
return(CallNextHookEx(tHook, code, wParam, lParam));
}
}
extern "C" __declspec(dllexport) BOOL SetHook()
{
tHook = SetWindowsHookEx(WH_GETMESSAGE, meconnect, hinstDLL, 0);
if (tHook == NULL)
return FALSE;
else
return TRUE;
}
extern "C" __declspec(dllexport) BOOL UnHook()
{
return UnhookWindowsHookEx(tHook);
}
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hinstDLL = hModule;
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Python:
def pointer_msg_loop():
global lib
lib = cdll.LoadLibrary(r'PATH\MessagesDll\x64\Release\HOOKDLL.dll')
print(lib)
#res = lib.ConnectServer()
res = lib.SetHook()
pythoncom.PumpMessages()
res = lib.UnHook()
最好的办法是从 dll 接收数据结构,因为在 python 中我可以比在 C 中更好地提取数据。
【问题讨论】: