SendMessage到另一个进程的Edit框问题 本帖最后由 citroen_kimi 于 2010-11-23 11:36:00 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我本身解析并显示了,然后发送SendMessage,再PostMessage,居然有的似乎没Send过去,但我判断了返回值写了日志,没有显示失败的。真是奇怪。 而且我保证我发往的窗口句柄是有效的。用FindWindow及EnumChildWindows找到的Edit句柄。再对这个句柄发送WM_SETTEXT消息。接着再PostMessage回车键消息。 PostMessage好象不能保证消息不丢失吧. PostMessage回车键消息有必要吗? 有必要,因为我要触发那个进程的回车事件他才会保存。PostMessage确实不保证成功,但是我会循环判断那个进程的Edit框是否被清空了,没有被清空就再次post回车键直到清空为止。SendMessage就只是判断了返回值是否是非0,若是0会继续SendMessage发WM_SETTEXT 2个进程之间的通信使用SendMessageTimeout! SendMessage, PostMessage, 如果跨进程, 而消息参数中有地址的话, 另一个进程是取不到数据的.除非你的地址是进程共享的. 但是回车键的发送还是得依赖于PostMessage 你的SendMessage(HWND, WM_SETTEXT,...);到另个进程的Edit框,另个进程接收到数据了吗?编辑框被设置了新内容了吗? 我没有另一个程序的源码。我只能在发送后再次发送WM_GETTEXT来获取我的内容是否设上去了。 你发送WM_SETTEXT,它的lParam是字符串串指针指定值。接受方只能拿到这个指针,但指针的内容取不到(因为跨进程了)。比较简单的方法是使用WM_COPYDATA消息,它内部会加上一些特殊的处理,保证数据在另一个进程可以访问。当然还有别的方法,总之要让另一个进程可以访问你传给它的数据 每个进程有独立的地址空间,因此你WM_SETTEXT传过去的指针会出问题。WM_COPYDATA是一种方法,也可用CreateFileMapping(NULL, ...)/MapViewOfFile或者用VirtualAllocEx/WriteProcessMemory 谢谢楼上的各位说用地址不对的,不过我说了另一个程序没有源码,也不可能去更改。所以WM_COPYDATA是行不通的。至于地址会失效,可能你们也没验证过吧。WM_SETTEXT消息是不存在地址失效的。你们验证下就知道,你如果手动点击鼠标发送一次,100% 会成功的。 测试了一下,WM_SETTEXT消息确实是不存在地址失效问题,学习了。另:SendMessage前先SetFocus(hEdit); 试一下。估计对方程序是在处理EN_KILLFOCUS时才做处理,如果事先不SetFocus, 按回车键是不会触发EN_KILLFOCUS的。 我在SendMessage发送WM_SETTEXT后,接下来会发送WM_GETTEXT消息去获取看是否设置上去了,若设上去了,再PostMessage回车键,接下来再通过WM_GETTEXT判断是否被清空了,因为那边收到回车,会进行存储操作,存储完后马上清空。失败的情况比较随机。反正就是普通的windows xp,只开了我的进程和另一个进程。另外我没有用有位兄弟说的SendMessageTimeout,但我要进入执行SendMessage的这一段一定要获取一个进入临界区的权限,也就是说加了锁的,我想在SendMessage期间至少这个操作不会有重入。 MFC---单例模式内存泄露问题 怎么将程序从任务栏中隐藏 怎么把一个类的this指针传给另一个类 如何向注册表写入REG_DWORD类型的值,谢谢指点! 开始程序是只显示一个MDI的主框架,而不显示子窗口。(在线等) 请问怎么样判断一个程序(或DLL)文件已经在运行(或被引用)?~ 我已结过账,为什么得分的人没有显示得了多少分? CPtrArray类的问题 求助帖 关于Shell Namespace 右键菜单的问题 线程专用钩子和全局钩子的区别和作用? SetWindowText ()问题? 怎么让对话框响应鼠标单击事件,我这个没反应
PostMessage确实不保证成功,但是我会循环判断那个进程的Edit框是否被清空了,没有被清空就再次post回车键直到清空为止。SendMessage就只是判断了返回值是否是非0,若是0会继续SendMessage发WM_SETTEXT
除非你的地址是进程共享的.
但是回车键的发送还是得依赖于PostMessage
我没有另一个程序的源码。我只能在发送后再次发送WM_GETTEXT来获取我的内容是否设上去了。
当然还有别的方法,总之要让另一个进程可以访问你传给它的数据
也可用CreateFileMapping(NULL, ...)/MapViewOfFile
或者用VirtualAllocEx/WriteProcessMemory
测试了一下,WM_SETTEXT消息确实是不存在地址失效问题,学习了。另:SendMessage前先SetFocus(hEdit); 试一下。估计对方程序是在处理EN_KILLFOCUS时才做处理,如果事先不SetFocus, 按回车键是不会触发EN_KILLFOCUS的。
我在SendMessage发送WM_SETTEXT后,接下来会发送WM_GETTEXT消息去获取看是否设置上去了,若设上去了,再PostMessage回车键,接下来再通过WM_GETTEXT判断是否被清空了,因为那边收到回车,会进行存储操作,存储完后马上清空。失败的情况比较随机。反正就是普通的windows xp,只开了我的进程和另一个进程。另外我没有用有位兄弟说的SendMessageTimeout,但我要进入执行SendMessage的这一段一定要获取一个进入临界区的权限,也就是说加了锁的,我想在SendMessage期间至少这个操作不会有重入。