google了很多, 好像没怎么见到类似的提问
一个外部程序的消息框发送回车, 这个消息框上有个确定按钮,外部程序被hook
send是等回应再返回 和 post是不管如何执行马上返回, 请问前辈们, 这里一定不能用send吗?
应该跟被hook无关的, 我弄个临时工程发送也是同样效果还就是, 用post发送消息后就不管了, 这个消息应该也是迟早都要被执行的吧, 有没有什么情况会被忽视?
当然我也可以找到这个按钮句柄再发送点击, 但此贴就想知道这个疑问的答案, 谢谢各位路过的前辈sendmessage没反应
SendMessage(消息框Handle, WM_KEYDOWN, VK_RETURN, 0);
SendMessage(消息框Handle, WM_KEYUP, VK_RETURN, 0);postmessage可以响应
PostMessage(消息框Handle, WM_KEYDOWN, VK_RETURN, 0);
PostMessage(消息框Handle, WM_KEYUP, VK_RETURN, 0);

解决方案 »

  1.   

    在 Windows 2000/XP 里,每个消息队列最多只能存放 10,000 个 Post 的消息,超过的还没被处理的将不会被处理,直接丢掉。这个值可以改得更大:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows] USERPostMessageLimit,最小可以是 4000看来如果系统刚好遇到很多post的消息, 就可能被忽略执行了
    那么该怎样改成sendmessage, 又可以响应的呢
      

  2.   

    看你要不要返回.不返回的话, 当然是 POST啦.比如你要等他返回了, 再干其他的事情.  就用Send
    另外, 你post的是个指针,   刚好引用了你的一个局部地址,    这个时候如果函数执行完毕的话, 这一块地址就可能乱码了.  但是用send等返回 函数才能执行完毕,就不会乱
      

  3.   

    我需要等这个回车 执行后, 也就是对话框 被关闭了, 才继续下面的动作
    那么是不是就是不能用send了
    我就是怕post被忽略执行了
      

  4.   

    PostMessage和SendMessage的区别1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数。而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。而且,PostMessage的返回值表示PostMessage函数执行是否正确;而 SendMessage的返回值表示其他程序处理消息后的返回值。这点大家应该都明白。 2,如果在同一个线程内,PostMessage发送消息时,消息要先放入线程的消息队列,然后通过消息循环Dispatch到目标窗口。 SendMessage发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回。SendMessage在同一线程中发送消息并不入线程消息队列。如果在不同线程内。最好用PostThreadMessage代替PostMessage,他工作的很好。SendMessage发送消息到目标窗口所属的线程的消息队列,然后发送消息的线程等待(事实上,他应该还在做一些监测工作,比如监视QS_SENDMESSAGE标志),直到目标窗口处理完并且结果返回,发送消息的线程才继续运行。这是SendMessage的一般情况,事实上,处理过程要复杂的多。比如,当发送消息的线程监测到有别的窗口 SendMessage一个消息到来时,他直接调用窗口处理过程(重入),并将处理结果返回(这个过程不需要消息循环中GetMessage等的支持)。 3, msdn: 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. 如果发送的消息码在WM_USER之下(非自定义消息)且消息参数中带有指针,那么PostMessage,SendNotifyMessage, SendMessageCallback这些异步消息发送函数将会调用失败。 最好不要用PostMessage发送带有指针参数的消息。
      

  5.   

    主要的区别,postmessage 返回值只是一个bool,只用来确认消息是否发送到达;
    而 sendmessage返回值是个DWORD,那这作用就多了,意味着可以返回32位的无符号整数,或指针...例如下面的sendmessage可以获取一个句柄:procedure TForm1.dtp1DropDown(Sender: TObject);
    var
      hwn: HWND;
    begin
      // 需要返回一个窗口句柄,必须用sendemessage
      hwn := SendMessage(dtp1.Handle, $1000 + 8, 0, 0);
      if hwn > 0 then
        // 最后使用这个返回的句柄做为参数,但是接下来我不再需要返回什么信息了,post即可
        PostMessage(hwn, $1000 + 15, 0, ord(dowMonday));
    end;
    结论:post发出去就不管了,send还要等它回馈一个信息,这个信息接下来还要用。