本帖最后由 citroen_kimi 于 2010-11-23 11:36:00 编辑

解决方案 »

  1.   

    我本身解析并显示了,然后发送SendMessage,再PostMessage,居然有的似乎没Send过去,但我判断了返回值写了日志,没有显示失败的。真是奇怪。
      

  2.   

    而且我保证我发往的窗口句柄是有效的。用FindWindow及EnumChildWindows找到的Edit句柄。再对这个句柄发送WM_SETTEXT消息。接着再PostMessage回车键消息。
      

  3.   

    PostMessage好象不能保证消息不丢失吧.
      

  4.   

    PostMessage回车键消息有必要吗?
      

  5.   

    有必要,因为我要触发那个进程的回车事件他才会保存。
    PostMessage确实不保证成功,但是我会循环判断那个进程的Edit框是否被清空了,没有被清空就再次post回车键直到清空为止。SendMessage就只是判断了返回值是否是非0,若是0会继续SendMessage发WM_SETTEXT
      

  6.   

    2个进程之间的通信使用SendMessageTimeout!
      

  7.   

    SendMessage, PostMessage, 如果跨进程, 而消息参数中有地址的话, 另一个进程是取不到数据的.
    除非你的地址是进程共享的.
      

  8.   


    但是回车键的发送还是得依赖于PostMessage
      

  9.   

    你的SendMessage(HWND, WM_SETTEXT,...);到另个进程的Edit框,另个进程接收到数据了吗?编辑框被设置了新内容了吗?
      

  10.   


    我没有另一个程序的源码。我只能在发送后再次发送WM_GETTEXT来获取我的内容是否设上去了。
      

  11.   

    你发送WM_SETTEXT,它的lParam是字符串串指针指定值。接受方只能拿到这个指针,但指针的内容取不到(因为跨进程了)。比较简单的方法是使用WM_COPYDATA消息,它内部会加上一些特殊的处理,保证数据在另一个进程可以访问。
    当然还有别的方法,总之要让另一个进程可以访问你传给它的数据
      

  12.   

    每个进程有独立的地址空间,因此你WM_SETTEXT传过去的指针会出问题。WM_COPYDATA是一种方法,
    也可用CreateFileMapping(NULL, ...)/MapViewOfFile
    或者用VirtualAllocEx/WriteProcessMemory
      

  13.   

    谢谢楼上的各位说用地址不对的,不过我说了另一个程序没有源码,也不可能去更改。所以WM_COPYDATA是行不通的。至于地址会失效,可能你们也没验证过吧。WM_SETTEXT消息是不存在地址失效的。你们验证下就知道,你如果手动点击鼠标发送一次,100% 会成功的。
      

  14.   


    测试了一下,WM_SETTEXT消息确实是不存在地址失效问题,学习了。另:SendMessage前先SetFocus(hEdit); 试一下。估计对方程序是在处理EN_KILLFOCUS时才做处理,如果事先不SetFocus, 按回车键是不会触发EN_KILLFOCUS的。
      

  15.   


    我在SendMessage发送WM_SETTEXT后,接下来会发送WM_GETTEXT消息去获取看是否设置上去了,若设上去了,再PostMessage回车键,接下来再通过WM_GETTEXT判断是否被清空了,因为那边收到回车,会进行存储操作,存储完后马上清空。失败的情况比较随机。反正就是普通的windows xp,只开了我的进程和另一个进程。另外我没有用有位兄弟说的SendMessageTimeout,但我要进入执行SendMessage的这一段一定要获取一个进入临界区的权限,也就是说加了锁的,我想在SendMessage期间至少这个操作不会有重入。