Delphi4如何接收16位Windows的窗口消息?(100分)

  • 主题发起人 主题发起人 xww
  • 开始时间 开始时间
X

xww

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一程序要升级到Delphi4,其中要调用一个16位Windows环境下编写的
应用程序,并接受其所有的消息,当遇到WM_QUIT时则退出消息处理,
用getmessage(msg,0,0,0)接受不到且无法退出消息循环,
请问有何高招?
 
是否要用DispatchMessage(msg)和TranslateMessage(msg),
这样可以进行消息接受和发送
 
Here is an example of wait for mseconds. Try it!
procedure TForm1.Wait(ms: Longint);
var Msg: TMsg;
StartTick: LongInt;
begin
StartTick := GetTickCount;
While GetTickCount - StartTick < msdo
begin
if PeekMessage(Msg, 0, 0, 0, pm_Remove) then
begin
if Msg.Message = wm_Quit then
Application.Terminate;
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
end;
 
To HuiZhang:
万分感谢回答。问题是我希望当捕获到WM_QUIT消息时再退出
该循环,但我试了一下,始终捕获不了消息,其退出循环是靠
记数循环.
 
getmessage(msg,0,0,0)好象只能接受与本线程有关的消息?
 
16位Windows的消息结构和32位Windows的消息结构不同,getmessage
在32位Windows下仅接受本线程的消息,16位Windows的消息好象
不行
 
各位大侠请多援手,本人不胜感激!
 
我也试了一下,也没有找到合适的方法,不知哪位大侠
可以解决这个问题?
 
与"pount"的意见相同。补充一点;在调用Windows的函数时,16位和32位的
命令是不同的,其所带的参数个数也不一样。但好象32位的指令兼容16位的
指令!?
 
用32位的message给16位的窗体发消息, 没有什么特殊的要求与限制, 16位窗体应该
能够正确受到消息. 不信你随便发个wm_close消息给一个16位程序试一下.
至于WM_Quit当然能够收到, 否则我们的Delphi程序就无法结束了. 在Delphi中的
TApplication.Terminate方法中就是用PostQuitMessage(0)给自己发了一个WM_Quit
的消息. 当TApplication.ProcessMessage收到WM_Quit的时候将Terminated属性
设置为True;
TApplication.Run里面的Repeat循环才停止HandleMessage, 结束程序.
 
你可以试着截获他的WM_Close消息看看是否可行
 
明确说,原来的16位的应用程序是用VC1.5编写的。而我目前无法改变其
原代码,而我的Delphi程序用4.0所写,原来的16位应用程序要发送
消息,我的32位DElphi4的程序接受其消息,Delphi4中消息处理的
方法为:
if PeekMessage(Msg, 0, 0, 0, pm_Remove) then
begin
if Msg.Message = wm_Quit then
Application.Terminate;
TranslateMessage(Msg);
DispatchMessage(Msg);

end;

即消息循环到WM_QUIT终止.
各位大侠可否再次指点!
 
既然16位程序可以和32位程序传送消息,可getmessage(msg,0,0,0)
却解释说,只能接受本线程的消息,这又如何解释?
 
我试了getmessage(msg,0,0,0),却无法接受16位windows
应用程序的消息,又看了各种参考书,皆说getmessage只
接受本线程的消息,那我在Delphi4下又如何接受
不属于本线程的16位Windows应用程序的消息呢?
多谢大侠帮助!
 
明确的说,我用的是Delphi4首先启动原Win16的应用程序,用Winexec,
然后用getmessage接受其消息,在收到WM_QUIT后,退出消息循环,
现在就是收不到消息,各位大虾请援手饿!
 
多人接受答案了。
 
后退
顶部