普通窗体点击任务栏上的小图标会缩小到任务栏。再点击会还原出来。。问题来了
在窗体样式是bsNone的情况下 点任务栏上的按钮,并不能将窗口缩回到任务栏。分不是很多,希望各路高手帮指点下哈!

解决方案 »

  1.   

     private
        { Private declarations }
          procedure   OnAppMessage(var   Msg:   TMsg;   var   Handled:   Boolean);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    procedure   TForm1.OnAppMessage(var   Msg:   TMsg;   var   Handled:   Boolean);
    begin
        if   (Msg.message   =   WM_ACTIVATE )   and   (Msg.wParam   =   SC_ICON)   then
        begin
            ShowMessage( 拦截最小化消息!');
            Handled   :=   True;
        end;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnMessage:=   OnAppMessage;
    end;当窗口风格bsSingle窗口的时候点击状态栏会激活最小化消息。
    但bsnone的时候,是不会触发这些消息,因此主要是找到应该拦截那一个消息,我没找到,反调试也没得到结果,只看到上层有个USER32.WaitMessage。 抛砖引玉吧。 
      

  2.   

    不是吧
    我的XP+D7的任意设置BorderStyle,点击任务栏都很会最小化及还原
    你做了其它处理了么?
      

  3.   

    我没有做任何的处理。就是一个空窗体设置为bsnone也是这样的效果。。我是win7系统+delphi2010
      

  4.   

    应该楼主自己没去试,在等直接的结果,我反汇编看了下依然也只能消息,而且比较多不好判断,后面一想,直接测试不是来的更快,因此下面注释的是测试前的,逐个排除后得到下面结果, 只需按以前代码改这个消息函数即可。
    procedure TForm1.OnAppMessage(var Msg: TMsg; var Handled: Boolean);
    begin
       if //(Msg.message >0 )
      // and((Msg.message <>49214 ))  //要查是什么消息,因为一直断所以排除
       //and((Msg.message <>15 ))   //要查是什么消息,因为一直断所以排除
      // and((Msg.message <>275 ))    //要查是什么消息,因为一直断所以排除
      // and((Msg.message <>45057 )) //好像是失去焦点
       ((Msg.message =45056 ))      //好想是得到焦点,换成十六进制$b000,可以查消息api
       then
       begin
      // ShowMessage(IntToStr(Msg.message));
      Handled := True;
      Application.Minimize;   //程序最小化,
      //到此已经完成点击最小话,但要判断是任务栏获取焦点还是数遍点击窗口
      //所以还需要在窗体上最判断. 需要自己测试下。
       end;
    end;
      

  5.   


    你这个方法试过了。xp下没测试。。win7下测试的。出现以下问题。
    1、有时候点一下无法缩小。需要点好几下才能缩小
    2、当我点任务栏里别的程序缩小的时候。这个程序也会跟着缩小。。哎。能力有限。只能暂时放下这个功能最后再去研究了。还是谢谢zhangqiwen的提点。
      

  6.   

    就是要判断焦点的问题,因为我只是判断了消息, 有焦点就会有消息, 要检测消息来源,觉得越搞越复杂了,换个方式,不用bsNone,然后再处理问题。