Python实现进程之间的WM_COPYDATA通讯

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

Python实现带有活动Windows消息循环的Windows句柄,可以使用pywin32库来调用Windows API。 以下是一个简单的示例代码,可以用于在Python中创建带有消息循环的窗口: ```python import win32gui import win32con import win32api import win32process def window_proc(hwnd, msg, wparam, lparam): if msg == win32con.WM_COPYDATA: # 处理WM_COPYDATA消息 return 0 else: # 其他消息处理 return win32gui.DefWindowProc(hwnd, msg, wparam, lparam) # 创建窗口类 wc = win32gui.WNDCLASS() wc.lpfnWndProc = window_proc wc.lpszClassName = "MyWindowClass" wc.hInstance = win32api.GetModuleHandle(None) win32gui.RegisterClass(wc) # 创建窗口 hwnd = win32gui.CreateWindowEx( 0, wc.lpszClassName, "", 0, 0, 0, 0, 0, win32con.HWND_MESSAGE, None, wc.hInstance, None) # 进入消息循环 while True: msg = win32gui.GetMessage(hwnd, 0, 0, 0) if msg[0] == 0: # 消息循环结束 break win32gui.TranslateMessage(msg) win32gui.DispatchMessage(msg) ``` 在上述代码中,我们首先定义了一个消息处理函数window_proc,用于处理接收到的WM_COPYDATA消息。然后,我们使用pywin32库调用Windows API来创建窗口类和窗口,并将消息处理函数与窗口关联。最后,我们使用GetMessage函数来获取消息,并使用TranslateMessage和DispatchMessage函数来处理消息。在消息处理函数window_proc中,我们可以处理接收到的WM_COPYDATA消息。 注意,由于Python是解释性语言,上述示例代码需要在Windows系统上运行,并且需要安装pywin32库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值