请问怎样让应用程序无论何时都可接收处理消息?

LiangWu25 2003-12-18 01:52:36
我希望不论应用程序运行到哪一步,都可以响应其它程序发来的消息,应该怎样做到?
例,新建一个Delphi工程:
program Project1;

uses
Forms,
Windows,
Messages,
Dialogs,
Unit1 in 'Unit1.pas' {Form1};

const UserMessageStr = 'testmsg';
{$R *.res}
var
UserMessage:Uint;

Function ChooseFile:Boolean;
var
OpenDialog:TOpenDialog;
Begin
Result:=False;
OpenDialog:=TOpenDialog.Create(nil);
OpenDialog.Title := 'test';
OpenDialog.Filter:='test'+'(*.txt)|*.txt|';
OpenDialog.Options:=[ofHideReadOnly,ofAllowMultiSelect];
OpenDialog.FileName:='';
If OpenDialog.Execute then
Result:=True;
End;

begin
UserMessage:=RegisterWindowMessage(UserMessageStr);
Application.Initialize;
ChooseFile;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
这个程序在运行的时候,其它程序会发广播消息SendMessage(HWND_BROADCAST,UserMessage,0,0);我希望这个程序无论何时,只要收到消息UserMessage,就马上弹出消息框('Success'),请问应怎样做到。
...全文
50 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
delphiseabird 2003-12-19
  • 打赏
  • 举报
回复
用PeekMessage可以检测消息队列,响应检测到的消息 要用一个专门的线程来处理他 否则不能随时处理你的消息
tiantian_200 2003-12-19
  • 打赏
  • 举报
回复

你可以用多线程调用循环调用他的函数,并对function TApplication.ProcessMessage(var Msg: TMsg): Boolean;函数修改,你就可以随时对接收到的消息进行处理了!!!
不过接收到消息最好用多线程来处理接收到的消息,不作特殊处理的要调用默认的消息处理,这样才能够一直不间断的处理消息,否则不能“在任何情况下接收消息”!!!

procedure TApplication.ProcessMessages;
var
Msg: TMsg;
begin
while ProcessMessage(Msg) do {loop};
end;
tiantian_200 2003-12-19
  • 打赏
  • 举报
回复
你看看TApplication类下的代码
function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
Handled: Boolean;
begin
Result := False;
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
Result := True;
if Msg.Message <> WM_QUIT then
begin
Handled := False;
if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end
else
FTerminate := True;
end;
end;
delphiseabird 2003-12-19
  • 打赏
  • 举报
回复
可以如果你的主线程正在处理一个运算 他是不能相应一般的消息的 除非这个消息的优先级极高,否则这个消息只能排在消息队列的尾部,等待轮到他时调用它。这样还是不能做的你所说的随时相应 你说是吧
mfc2003 2003-12-19
  • 打赏
  • 举报
回复
用多线程
LiangWu25 2003-12-19
  • 打赏
  • 举报
回复
谢谢楼上的发言,socket通信可以考虑,内核对象太深了,我看过Application.Onmessage好像可以解决这个问题,只是我也是初学Delphi,我看过一些关于Application.Onmessage例子全是在某个窗体下的代码,是不是真的是我误解了,除于线程外没有解决的方法?
murouwolf 2003-12-19
  • 打赏
  • 举报
回复
看了一下楼主提供的帖子,我想楼主似乎进入了一个误区,实际上windows消息本身也是通过不断的循环GetMessage来取得消息的,没有窗口的情况下在主线程一直调用该函数一样也是可以获取消息的。然而,无论在何时,除非你的程序在一直等待一个消息,否则是无法做到在任何情况下接收消息的(比如,程序由于某个死循环无法退出),当然,这种情况可以使用线程来解决。排除这种情况之后,归根结底,楼主期望实现的目标就是跨进程通信,这样一来,问题就相当的简单,比如socket,内核对象等等。(初学delphi,如果delphi中不能这样实现,请别见笑^_^)
LiangWu25 2003-12-19
  • 打赏
  • 举报
回复
to delphiseabird(沙鸥):
"无论何时"的意思是我不管这个应用程序有多少窗口,当前正在运行哪个窗口,或在处理什么事情,都要能够即时响应消息。
用线程会不会麻烦?Application对象应该可以处理消息吧?(我是刚用Delphi,没做过线程)
LiangWu25 2003-12-19
  • 打赏
  • 举报
回复
我发过一段类似的贴子:
http://expert.csdn.net/Expert/topic/2569/2569320.xml?temp=.1078607
现在所发的贴子是对该贴的延伸,我看过有提到用Application.OnMessage方法去处理它,可是我没有试出来,所以想发贴子请教一下。
LiangWu25 2003-12-19
  • 打赏
  • 举报
回复
首先感谢大家的回贴。各位误解了我的意思,楼上有两位的代码只是针对一个窗体的消息处理。比如,各位运行我在楼底所发的例程,会发现运行开使时会弹出一个对话框,此时并无窗体出现,在对话框的显示当中,你如何让应用程序处理消息;又比如,我这个程序没有frmMain,应用程序在不同的情况下会启动不同的窗体,我在应用程序中加了Shell关联,当用户点击*.XX的文件时,会启动我这个程序的A窗体,当用户在网上点击*.XX的文件时,又会启动应用程序的B窗体,但不管是A窗体或是B窗体,它都属于这个应用程序,我的意思是希望应用程序这个“最顶层”的东东来处理这个消息,而不是想让应用程序的某个窗体来处理消息。
delphi2java 2003-12-18
  • 打赏
  • 举报
回复
UP
free007 2003-12-18
  • 打赏
  • 举报
回复
我觉得还是用子类化比较好一些
delphi2004 2003-12-18
  • 打赏
  • 举报
回复
UP
fengsx 2003-12-18
  • 打赏
  • 举报
回复
发送程序中。。。

const UserMessageStr = 'testmsg';

var
UserMessage : UINT;


procedure TForm1.FormCreate(Sender: TObject);
begin
UserMessage := RegisterWindowMessage(UserMessageStr); //注册自己的消息
if UserMessage=0 then
begin
//
showmessage('注册失败!');
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(HWND_BROADCAST,UserMessage,handle,0); //广播消息
end;

//-------------------------------------------------------------------------


在接受程序中。。。

const UserMessageStr = 'testmsg';

var
UserMessage : UINT;

procedure TForm1.FormCreate(Sender: TObject);
begin
UserMessage := RegisterWindowMessage(UserMessageStr); //注册自己的消息
end;

procedure TForm1.WndProc(var Message: TMessage);
begin
if(Message.Msg = UserMessage) then
begin //接受到
//你的处理。。。
end;
inherited;
end;
delphiseabird 2003-12-18
  • 打赏
  • 举报
回复
无论何时是什么意思?
除非另创建一个线程实时查看消息队列,但是如果检测到了 楼主要如何呢
抱朴守拙 2003-12-18
  • 打赏
  • 举报
回复
自己添加一个自定义消息,声明一个消息处理过程,具体处理代码自己写。

当其他程序发送这个消息时,你的程序就自动触发消息处理机制。

const
CM_RESTORE = WM_USER + $1001; {自定义的消息}
procedure RestoreRequest(var msg: TMessage);message CM_Restore;


procedure TfrmMain.RestoreRequest(var msg: TMessage);
begin
//在此写你的代码
end;
steventone 2003-12-18
  • 打赏
  • 举报
回复
保证它运行.???????捕捉所有信息???
LiangWu25 2003-12-18
  • 打赏
  • 举报
回复
连UP都没人吗?

唉!自己UP!
chenkandy 2003-12-18
  • 打赏
  • 举报
回复
up

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧