使用postmessage发送自定义消息

【N久之前的笔记了】
 用 PostMessage、SendNotifyMessage、SendMessageCallback 等异步函数发送系统消息时,参数里不可以使用指针,因为发送者并不等待消息的处理就返回,接受者还没处理指针就已经被释放了。

‍(MSDN中的remark)If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters can not include pointers. Otherwise, the operation will fail. The functions will return before the receiving thread has had a chance to process the message and the sender will free the memory before it is used。

自己在程序中使用了一个postmessage向父窗口发送自定义消息,带一个指针参数,结果在父窗口的函数中取出参数之后发现内容被改动了!O.M.G.!调了一上午,能想到的地方都测试了,还是出错,忽然想到前两天也使用自定义消息传递过指针为什么那一次就行呢?找出程序来检查了一遍,发现那个使用的是sendmessage,也就是发送同步消息,疑问:除了一个放入消息队列,直接返回(post),一个等待知道处理完成返回(send)外,还有什么区别?查了一个MSDN发现,还真不是那么简单的一回事,又到网上一搜,发现原来如此,把post改为send之后果然,指针参数就正常了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Python 中,要自定义消息发送它可以使用 `postmessage` 函数。 首先,我们需要导入 `ctypes` 模块来调用 Windows API 函数。然后,我们可以使用如下代码自定义发送消息: ```python import ctypes # 定义自定义消息的常量 MY_MESSAGE = 1024 # 发送自定义消息的函数 def send_custom_message(hwnd): # 获取消息句柄 user32 = ctypes.windll.user32 message = ctypes.wintypes.MSG() # 设置消息参数 message.hwnd = hwnd message.message = MY_MESSAGE message.wParam = 0 message.lParam = 0 # 发送消息 user32.PostMessageA(message.hwnd, message.message, message.wParam, message.lParam) ``` 在这个例子中,我们定义了一个常量 `MY_MESSAGE` 来表示自定义消息的标识符。然后,我们定义了一个 `send_custom_message` 函数,它接受一个窗口句柄作为参数并发送自定义消息。 在函数中,我们首先使用 `ctypes.windll.user32` 获取 `user32` 模块的句柄。然后,我们创建一个 `MSG` 实例来设置消息参数,包括窗口句柄、消息标识符以及其他参数。 最后,我们使用 `user32.PostMessageA` 函数来发送消息。这个函数接受四个参数:窗口句柄、消息标识符、wParam 和 lParam。使用 `PostMessageA` 可以发送 ANSI 字符串作为消息,如果你需要发送 Unicode 字符串,可以使用 `PostMessageW` 函数。 以上就是在 Python 中自定义消息发送它的方法。你可以根据自己的需求修改 `send_custom_message` 函数来实现不同的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值