<font color=#FF0000>请教一下Postmessage 和 Sendmessage 的用法和区别</font>(80分)

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

dream

Unregistered / Unconfirmed
GUEST, unregistred user!
我要实现关闭一个外部程序,获得该程序的窗口句柄后<br>&nbsp;用Sendmessage(formhandle,wm_quit,0,0) 不能关闭该程序<br>而用Postmessage(formhandle,wm_quit,0,0) 则可以,请教原因.<br><br><br>&nbsp; &nbsp;<br>&nbsp;
 
我能想到的原因就是那个程序自己判断了是不是被SendMessage,然后做了处理<br>不然为什么呢?
 
我所知道的区别就是:<br>SendMessage要等消息处理完后才能返回。<br>PostMessage将消息放入消息队列后直接返回。<br><br>WM_QUIT消息只能用PostMessage,因为该消息将导致应用程序<br>释放消息环,也就无法返回结果。<br>你用SendMessage函数能返回吗?<br>还是不能结实为什么程序没有关闭。<br><br>是不是哪个程序在等待消息的返回值,在win api中申明WM_QUIT是没有返回值的。<br>
 
对WM_QUIT是一个特例。为什么呢?参看GetMessage的说明:<br>.....<br>If the function retrieves the WM_QUIT message, the return value is zero. <br>.....<br>这就意味着将不再进入消息循环进行DispatchMessage(),而直接从while中退出,<br>很自然,WndProc就不会被调用,而SendMessage()却等着,但永远不会得到结果。<br>这正是你看到的现象。<br><br>通常要关闭外部程序,一般用:<br>PostMessage(hwnd,WM_SYSCOMMAND,SC_CLOSE,0)<br>如果你想“强硬”一点的话,那就<br>GetWindowThreadProcessId() 再 TerminateProcess()吧。<br><br>下面的文档,也许会给你一些帮助:<br>Q178893 - HOWTO: Terminate an Application "Cleanly" in Win32 <br>http://support.microsoft.com/support/kb/articles/q178/8/93.asp<br><br>
 
视窗王子:你的解释有点道理.<br>&nbsp; &nbsp;但是我对你最后关于 “强硬关闭外部程序的方法”中使用的两个<br>API函数的用法及其参数却不太明白,能给个具体例子吗?(其它大虾知道<br>也可帮我一把。)<br><br>&nbsp; 还有我用Sendmessage(formhandle,wm_quit,0,0) 却可以关闭外部程序.<br>但有一点不明白.<br>&nbsp; 当我想关闭'我的电脑'这个窗口时,用sendmessage(formhandle,wm_quit,0,0)<br>也不能实现,这是为什么?
 
我们不是不知道SendMessage/PostMessage的区别, 也不是不知道WM_QUIT不会返回值,<br>而是不知道为什么SendMessage不能结束程序呀?
 
&gt;&gt;我们不是不知道SendMessage/PostMessage的区别, 也不是不知道WM_QUIT不会返回值,<br>&gt;&gt;而是不知道为什么SendMessage不能结束程序呀?<br>我试了一下,也没有搞清楚。<br>有一些消息用PostMessage可以而SendMessage不可以;<br>而另一些消息用SendMessage可以而PostMessage不可以;<br>我再去研究一下,猜想是SendMessage和PostMessage的消息发送机制不同所造成的!<br><br>
 
我知道了!<br>在Win32 SDK的文档中说:<br>PostMessage和SendMessage不同的是:PostMessage可以投递不需要制定接收者的消息,而SendMessage必须制定接收者。WM_QUIT正好是这样的消息,用<br>PostMessage的时候, 消息被发送到指定的接收者的窗口所在的主线程,然后<br>那里的GetMessage循环就会终止从而退出程序,而SendMessage直接发送给了目<br>的窗口的处理过程,所以退不出来(如果这个窗口没有处理好WM_QUIT的话)
 
多人接受答案了。
 
后退
顶部