PYQT实现WM_COPYDATA消息的发送和接收

PYQT实现WM_COPYDATA消息的发送和接收


在有些项目中需要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
以下是使用 Pyqt5 中的 QBluetooth 模块进行蓝牙发送接收的示例代码: ```python from PyQt5.QtBluetooth import QBluetoothDeviceDiscoveryAgent, QBluetoothSocket from PyQt5.QtCore import QIODevice, QBluetoothUuid, QByteArray from PyQt5.QtWidgets import QApplication, QDialog, QListWidget, QVBoxLayout, QPushButton, QHBoxLayout, QLineEdit import sys class BluetoothDialog(QDialog): def __init__(self, parent=None): super().__init__(parent) self.devices = QListWidget() self.discovery = QBluetoothDeviceDiscoveryAgent() self.discovery.deviceDiscovered.connect(self.add_device) self.devices.itemDoubleClicked.connect(self.connect_to_device) self.connect_button = QPushButton('Connect') self.connect_button.clicked.connect(self.connect_to_device) self.send_button = QPushButton('Send') self.send_button.clicked.connect(self.send_data) self.input_box = QLineEdit() layout = QVBoxLayout() layout.addWidget(self.devices) layout.addWidget(self.connect_button) hbox = QHBoxLayout() hbox.addWidget(self.input_box) hbox.addWidget(self.send_button) layout.addLayout(hbox) self.setLayout(layout) def add_device(self, info): name = info.name() address = info.address().toString() self.devices.addItem('{} ({})'.format(name, address)) def connect_to_device(self): device = self.devices.currentItem().text() device_name = device.split(' ')[0] device_address = device.split(' ')[1][1:-1] socket = QBluetoothSocket(QBluetoothServiceInfo.RfcommProtocol) socket.connectToService(QBluetoothAddress(device_address), QBluetoothUuid.SerialPort) self.socket = socket self.socket.readyRead.connect(self.receive_data) def send_data(self): text = self.input_box.text() if not text: return data = QByteArray() data.append(text) self.socket.write(data) self.input_box.setText('') def receive_data(self): data = self.socket.readAll() print(data) if __name__ == '__main__': app = QApplication(sys.argv) dialog = BluetoothDialog() dialog.discovery.start() dialog.show() sys.exit(app.exec_()) ``` 该示例代码实现了蓝牙设备的搜索、连接、发送接收功能。在搜索到蓝牙设备后,用户可以通过双击列表中的设备名称来连接设备。连接成功后,用户可以通过文本框输入需要发送的数据,点击 Send 按钮发送数据,并通过 receive_data 方法接收数据。注意,该示例代码只是一个简单的示例,实际应用中需要根据具体需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值