Python实现进程之间的WM_COPYDATA通讯
接收端
import threading
import time
import ctypes
import ctypes.wintypes
import win32api
import win32con
import win32gui
class COPYDATASTRUCT(ctypes.Structure):
_fields_ = [
('dwData', ctypes.wintypes.LPARAM),
('cbData', ctypes.wintypes.DWORD),
('lpData', ctypes.c_void_p)
]
PCOPYDATASTRUCT = ctypes.POINTER(COPYDATASTRUCT)
class EndOfTime(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
while 1:
print(1)
time.sleep(3)
class Listener:
def __init__(self):
WindowName ="CopyDataName"
message_map = {
win32con.WM_COPYDATA: self.OnCopyData
}
wc = win32gui.WNDCLASS()
wc.lpfnWndProc = message_map
wc.lpszClassName = WindowName
hinst = wc.hInstance = win32api.GetModuleHandle(None)
classAtom = win32gui.RegisterClass(wc)
self.hwnd = win32gui.CreateWindow(
classAtom,
"test",
0,
0,
0,
win32con.CW_USEDEFAULT,
win32con.CW_USEDEFAULT,
0,
0,
hinst,
None
)
print("当前句柄", self.hwnd)
def OnCopyData(self, hwnd, msg, wparam, lparam):
pCDS = ctypes.cast(lparam, PCOPYDATASTRUCT)
s = ctypes.string_at(pCDS.contents.lpData).decode()
print(f"收到来自句柄{hwnd}的消息:{s}")
return 1
l = Listener()
win32gui.PumpMessages()
发送端
import ctypes.wintypes
import win32con
FindWindow = ctypes.windll.user32.FindWindowW
SendMessage = ctypes.windll.user32.SendMessageW
class COPYDATASTRUCT(ctypes.Structure):
_fields_ = [
('dwData', ctypes.wintypes.LPARAM),
('cbData', ctypes.wintypes.DWORD),
('lpData', ctypes.c_char_p)
]
# 通过寻找窗口名获取句柄
hwnd = FindWindow('CopyDataName', None)
# 或者直接根据句柄来发送
# hwnd = 1707560
cds = COPYDATASTRUCT()
cds.dwData = 0
msg = "这是通过VM_COPYDATA发送的数据"
msg_bytes = msg.encode('utf-8')
cds.cbData = ctypes.sizeof(ctypes.create_string_buffer(msg_bytes))
cds.lpData = ctypes.c_char_p(msg_bytes)
SendMessage(hwnd, win32con.WM_COPYDATA, 0, ctypes.byref(cds))
print("已发送CopyData数据", msg)
如需转载请注明出处!
https://blog.csdn.net/ndd1996/article/details/107882856