在有些项目中需要C++或者C#的窗口跟Python窗口进行数据交互,通过windows系统的WM_COPYDATA消息进行通讯也是一个很方便的方法。
1、实现发送消息
import ctypes
from ctypes.wintypes import MSG #引入ctypes的包,实现调用windows的API
import win32gui,win32con
import array,struct
class COPYDATASTRUCT(ctypes.Structure):
_fields_ = [
('dwData', ctypes.wintypes.LPARAM),
('cbData', ctypes.wintypes.DWORD),
('lpData', ctypes.c_void_p)
]
PCOPYDATASTRUCT = ctypes.POINTER(COPYDATASTRUCT)
hld = win32gui.FindWindow(None, u"接收窗口") #查询到要发送消息的窗口,获取其句柄
char_buffer = array.array('B',("Hello World").encode('utf-8'))
char_buffer_address, char_buffer_size = char_buffer.buffer_info()
copy_struct = struct.pack("PLP", 1, char_buffer_size, char_buffer_address)
win32gui.SendMessage(hld, win32con.WM_COPYDATA, None, copy_struct)
2、实现消息的接收
def nativeEvent(self, eventType, msg):#PYQT里的函数,固定的
mess= ctypes.wintypes.MSG.from_address(msg.__int__())
if mess.message==0x004A:
PCOPYDATASTRUCT = ctypes.POINTER(COPYDATASTRUCT)
pCDS = ctypes.cast(mess.lParam, PCOPYDATASTRUCT)
str=ctypes.string_at(pCDS.contents.lpData)
print(str.decode('utf-8'))
return False, 0