SendMessage WM_COPYDATA 拒绝错误

背景

SendMessage WM_COPYDATA 我们经常用来进程通信,今天突然改了一下代码加载方式,突然发现消息无法通信,我不断的通过打印日志来确定问题,最终觉得自己代码没有问题,但就是无法发送消息到另外一个进程。突然想到GetLastError() 看一下有什么错误,通过打印发现出现错误5,然后通过vs 带的错误查询,发现是拒绝错误。

解决方案

通过GetLastError, 我的脑海大概猜测是权限问题,于是搜索SendMessage WM_COPYDATA 拒绝错误,然后我找到这篇 https://blog.csdn.net/aa1991/article/details/19504557 ,固然验证是权限问题。如果是按照文章调用 ChangeWindowMessageFilter(WM_COPYDATA, 1); 就可以了

总结

排错需要更加系统化,尽可能了解不同知识点,更重要是思考方式,学会不断调节

贴边程序思路

我们有时候需要实现贴边qq或者微信窗口或者其他窗口的功能,最近研究了一下,大概2个思路。

  • 直接用 GetForegroundWindow ,获取当前前台的窗口句柄,然后获取是否自己想贴边的程序,可以通过类名或者窗口标题和进程名来判断
  • 通过窗口钩子,捕捉窗口移动的消息和一些其他消息来处理

我选择的第一种方式,因为实现起来最简单,启动一个定时器不停检测当前窗口就可以了,如果用钩子,可能被杀毒软件报警,同时代码复杂度会偏高。