一个高难的问题,如何在发送消息并且消息引发的事件处理完之后返回(0分)

  • 主题发起人 主题发起人 Dragon_Sky
  • 开始时间 开始时间
D

Dragon_Sky

Unregistered / Unconfirmed
GUEST, unregistred user!
打个比方来说吧,我给一个外部程序(这个外部程序我是没有代码没办法改写的,<br>比如Oicq)某个窗口发送一个消息,比如是MouseDown的消息,这个外部程序的<br>窗口有MouseDown的事件,当然就此引发,现在我要该窗口的MouseDown事件里的<br>代码全部执行完之后通知主窗体。(不能用SendMessageCallBack,因为这个函数<br>的回调函数是在消息被处理之后就执行的也就是说是在MouseDown事件之前执行的)<br>请大侠指点下迷津吧,先行谢过
 
The SendMessage function sends the specified message to a window or windows.<br>The function calls the window procedure for the specified window and <br>[red]does not return until [/red]the window procedure has processed the message. <br><br>The PostMessage function, in contrast, posts a message to a thread's message<br>queue and returns immediately. <br><br>The SendMessageCallback function sends the specified message to a window or<br>&nbsp;windows. The function calls the window procedure for the specified window <br>and returns immediately. After the window procedure processes the message, <br>the system calls the specified callback function, passing the result of the <br>message processing and an application-defined value to the callback function.<br><br>其一自己不动手,其二高难还不给分,真受不了,逗人玩呐?
 
这些东西我都看过了,并且也做了一些尝试,发消息都是很容易做到的事,<br>写一两个测试程序也不是有太大的困难,主要的难点在于如何得到接受消<br>息的一方对消息的行为做出相应的操作之后的返回?不知道是不是我没有<br>讲清楚,我自己可以实现发送消息,而消息发送之后,对应的程序自然有<br>对该消息做出相应响应的动作,不然发送消息就没什么意义了,然后我要<br>得到的是该响应动作作完之后的那个时刻,我要接下来再做一些动作,但是<br>由于被呼叫的子程序我没有代码所以不能直接的在其响应消息的事件里添加<br>代码。就是这样。我认为是比较难的,至于分数嘛,一方面我没多少分可以给,<br>另一方面我觉得也不重要,最重要的是一个思路,具体实现我可以自己写的
 
SendMessage()是有返回值的!<br>不过我觉的你的口气好硬哦,
 
Dragon_Sky:<br>你可真是个小气鬼啊![:D][:D]这样等级的问题竟然出0分?!<br>不过,还是关注此题!
 
sorry....大哥,如果给你这个感觉就是我的错了:)<br>我知道SendMessage有返回值的,但是这个返回值其实也不是我想要的,<br>因为这个返回值也是在我通过SendMessage发送的消息引发事件之前<br>就返回了,这个我已经有测试过了,是实在不知如何动手了,才请大侠<br>帮忙的
 
不对把,sendmessage()只有对应的消息处理函数处理完成以后才返回。<br>Delphi的一些事件的var参数就是sendmessage()的返回值,
 
大家一起谴责他! <br><br>我们谴责你,鄙视你!
 
看来你还没明白我的意思,SendMessage只是负责把消息发给指定窗口,并且在<br>指定窗口接收这个消息之后就不管了,但是如果指定的窗口还有相应的事件动作,<br>比如我发送一个WM_LBUTTONDOWN消息给它,然后在这个指定窗口接收这个消息后<br>(注意'后'),它的MouseDown事件里有代码的话就会执行了,而SendMessage在<br>这个事件触发前已经返回了,我要得到的是事件处理完之后的返回(确切说我只<br>要能得到那一时刻到底是在哪里就行了,我就可以再做一些其他的动作了)
 
那就需要双方通讯了,<br>我用SendMessage的时候没出现这个问题,<br>都是处理完了以后SendMessage才返回,<br>可能是入队消息和非入队消息的一些差别把!
 
张无忌大哥:<br>麻烦问一下,什么样的消息是非入队消息呀?
 
前面已经说了,外部程序是我所不能写代码的可执行程序,所以通讯是不行的,<br>不然我只要直接在外部程序的事件末尾添加代码就可以了,其实SendMessage<br>是没办法控制消息引发的事件的(不信的话可以写一些代码测试),当然PostMessage<br>就更不用说,连指定窗口有没有接收这个消息这一步都省了(所以用这个方法<br>消息可能被吃了自己都不知道)
 
非入队消息,比如WM_CREATE没有进入消息队列,<br>创建窗体的时候消息循环没有建立了,系统直接<br>用WM_CREATE参数调用对应的消息处理过程了。<br>入队消息比如键盘消息,都是翻译处理以后进入<br>消息队列。<br>我的理解可能有问题,记的不是太清楚。
 
procedure TForm1.ShowMeg(var Msg:TMsg);<br>begin<br>&nbsp; ShowMessage('haha');<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br><br>begin<br>&nbsp; SendMessage(handle,WM_DM,0,0);<br>&nbsp; ShowmESSAGE('ok');<br>&nbsp;end;
 
你看看,哪个窗口先出来?
 
张无忌大哥:谢谢啦!(虽然我还是不太明白,55555,看来要多看书啊)[:)]
 
我用SendMessage发送的消息是给外部程序的,当SendMessage执行之后后面还有代码的话<br>那就是两个进程同时在运行了,如果在外部的事件里有重力活的话,比如要运行好几分钟<br>才能运行完的话,就很明显了(你也可以记录时间下来看看就很清楚了),如果这么简单<br>的话,我是不会来烦大侠的,呵呵
 
我开始以为是同进程的,如果不同进程的<br>那就两个进程通讯,用内存映射文件,信号,<br>互斥,管道,邮槽,套接字也行。或者要他<br>完成事件以后返回个消息给你也行,那就和<br>动态数据交换一样了,<br>如果不能修改对方的代码我看很难解决。<br>
 
当然是有点难度了,不然我也不会在标题上就写着高难问题啊,呵呵<br>但是是可以做到的,因为有时候有些作者发布了程序,但是另外的人<br>发现有bug,结果他都在汉化的同时给加上补丁,不大可能汉化的时候<br>有源代码的吧,可见是可以作到的
 
我刚刚测试过,我给另外一个EXE发送消息,结果是哪个EXE处理完消息以后<br>我的程序才响应过来。而且WINDOWS核心编程上也是说等到消息处理完成以<br>后才返回,你出的问题是由于发送鼠标和键盘消息才导致提前返回,所以<br>还是入队消息的原因!
 

Similar threads

后退
顶部