我希望不论应用程序运行到哪一步,都可以响应其它程序发来的消息,应该怎样做到?
例,新建一个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'),请问应怎样做到。

解决方案 »

  1.   

    自己添加一个自定义消息,声明一个消息处理过程,具体处理代码自己写。当其他程序发送这个消息时,你的程序就自动触发消息处理机制。const
      CM_RESTORE = WM_USER + $1001; {自定义的消息}
    procedure RestoreRequest(var msg: TMessage);message CM_Restore;
    procedure TfrmMain.RestoreRequest(var msg: TMessage);
    begin
    //在此写你的代码
    end;
      

  2.   

    发送程序中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;
      

  3.   

    首先感谢大家的回贴。各位误解了我的意思,楼上有两位的代码只是针对一个窗体的消息处理。比如,各位运行我在楼底所发的例程,会发现运行开使时会弹出一个对话框,此时并无窗体出现,在对话框的显示当中,你如何让应用程序处理消息;又比如,我这个程序没有frmMain,应用程序在不同的情况下会启动不同的窗体,我在应用程序中加了Shell关联,当用户点击*.XX的文件时,会启动我这个程序的A窗体,当用户在网上点击*.XX的文件时,又会启动应用程序的B窗体,但不管是A窗体或是B窗体,它都属于这个应用程序,我的意思是希望应用程序这个“最顶层”的东东来处理这个消息,而不是想让应用程序的某个窗体来处理消息。
      

  4.   

    我发过一段类似的贴子:
    http://expert.csdn.net/Expert/topic/2569/2569320.xml?temp=.1078607
    现在所发的贴子是对该贴的延伸,我看过有提到用Application.OnMessage方法去处理它,可是我没有试出来,所以想发贴子请教一下。
      

  5.   

    to delphiseabird(沙鸥):
       "无论何时"的意思是我不管这个应用程序有多少窗口,当前正在运行哪个窗口,或在处理什么事情,都要能够即时响应消息。 
        用线程会不会麻烦?Application对象应该可以处理消息吧?(我是刚用Delphi,没做过线程)
      

  6.   

    看了一下楼主提供的帖子,我想楼主似乎进入了一个误区,实际上windows消息本身也是通过不断的循环GetMessage来取得消息的,没有窗口的情况下在主线程一直调用该函数一样也是可以获取消息的。然而,无论在何时,除非你的程序在一直等待一个消息,否则是无法做到在任何情况下接收消息的(比如,程序由于某个死循环无法退出),当然,这种情况可以使用线程来解决。排除这种情况之后,归根结底,楼主期望实现的目标就是跨进程通信,这样一来,问题就相当的简单,比如socket,内核对象等等。(初学delphi,如果delphi中不能这样实现,请别见笑^_^)
      

  7.   

    谢谢楼上的发言,socket通信可以考虑,内核对象太深了,我看过Application.Onmessage好像可以解决这个问题,只是我也是初学Delphi,我看过一些关于Application.Onmessage例子全是在某个窗体下的代码,是不是真的是我误解了,除于线程外没有解决的方法?
      

  8.   

    你看看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;
      

  9.   


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

  10.   

    用PeekMessage可以检测消息队列,响应检测到的消息 要用一个专门的线程来处理他 否则不能随时处理你的消息