自制一个视频播放,希望控制窗和播放窗在任务栏下都有一个可以点击的条,用于区别控制窗和播放窗,
就象解霸或影霸一样,一弹出任务栏下就会有两个可以点击的条,最好能有两个不同的图标。
现在用一个主Form,一个播放的Form制作,但这时发现两个Form在任务栏下只有一个条可以点击,
因为只有一个工程,无法区别开来,请问有何方法可以解决?谢谢了。

解决方案 »

  1.   

    在Form中定义:
        procedure CreateWindowHandle(const Params: TCreateParams); override; 实现:
    procedure TForm2.CreateWindowHandle(const Params: TCreateParams);
    var
      NewParams: TCreateParams;
    begin
      NewParams:=Params;
      NewParams.ExStyle := NewParams.ExStyle or WS_EX_APPWINDOW;
      inherited CreateWindowHandle(NewParams);
    end;
      

  2.   

    keyz(keyz)你好:
        你的代码很好,基本实现功能,但是经我测试:我把这个过程放在Form2中实现,在弹出Form2后,如果在windows窗口中点击两个窗体,会实现自由切换,一切正常;如果是点击任务栏上的两个任务条时,却发现点击Form2的有效,点击Form1的却无效,点不动,只能将Form2点缩小下来后才能到Form1,这是个不完美的地方,希望能修改一下源代码,补发个完善的上来好吗?
      

  3.   

    在form1上添加一个ApplicationEvents控件procedure TForm1.ApplicationEvents1Activate(Sender: TObject);
    begin
      application.MainForm.SetFocus;
    end;
      

  4.   

    keyz(keyz)你好:
        这回可是反过来了,在任务栏上点Form1的时候有效,点Form2的时候却无效了,而且用这句写法还多出了两个问题:(1.)Form1被始终被聚焦,而且置于其它窗体最上端。(2.)可能多次点击Form1上的弹出Form2的Button,,这样会在任务栏下生多个任务条来,点几个有几条,要几条有几条。
        我试图将以上语句改一下,将它放在其它地方写入,但无法捕获到鼠标点击任务条上的事件,如果能捕获到,则可以在那句中加上聚焦Form2的语句,或许可以解决。
        但现在没有一个综合的可行的方案,请指教。各位社区内的大虾们,都来帮忙献献计呀。。另外,也可以发邮箱:[email protected],同样给分,谁先测试好解决的就一次性给了,谢谢了!
      

  5.   

    我测试不会啊。windows xp2 + delphi7 你是怎么写创建form2窗体的?怎么会创建多个form2呢?
      

  6.   

    我测试是在Win2000 server 和 Win2000 Advance Server 两种操作系统上分别进行的,用Delphi6,
    以下是两个Form的所有源代码:***********************
    unit Unit1;
    interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons, AppEvnts;type
      TForm1 = class(TForm)
        BtnClose: TBitBtn;
        BtnForm2: TBitBtn;
        ApplicationEvents1: TApplicationEvents;
        procedure BtnCloseClick(Sender: TObject);
        procedure BtnForm2Click(Sender: TObject);
        procedure ApplicationEvents1Activate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.BtnCloseClick(Sender: TObject);
    begin
      Close;
    end;procedure TForm1.BtnForm2Click(Sender: TObject);
    begin
      Application.CreateForm (tForm2,Form2);
      Form2.Show ; 
    end;procedure TForm1.ApplicationEvents1Activate(Sender: TObject);
    begin
      application.MainForm.SetFocus;
    end;end.
    ***********************
    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm2 = class(TForm)
      private
        { Private declarations }
        procedure CreateWindowHandle(const Params: TCreateParams); override; 
      public
        { Public declarations }
      end;var
      Form2: TForm2;implementation{$R *.dfm}procedure TForm2.CreateWindowHandle(const Params: TCreateParams);
    var
      NewParams: TCreateParams;
    begin
      NewParams:=Params;
      NewParams.ExStyle := NewParams.ExStyle or WS_EX_APPWINDOW;
      inherited CreateWindowHandle(NewParams);
    end;end.
    **************如果From1中不用:application.MainForm.SetFocus;一句,是点击任务栏上的Form1条无效,如果用了,是点击任务栏上的Form2条无效。以上代码在点击BtnForm2时,会在任务栏上多次生成Form2任务条,请看创建Form2的写法是否有误。我想,Win2000 server + Delphi6 应该是个常用的配置,不应该需要去更换掉配置才能实现这些功能,所以请帮助解决。
      

  7.   

    创建form2:if not assigned(form2) then
      Application.CreateForm (tForm2,Form2);Form2.Show ;
      

  8.   

    我原来也没有写过这样的代码,是看了vcl后写出来的,并不是成熟的代码。
      

  9.   

    你再试试这个吧。思路是把真正的主窗口和Application都隐藏起来,实际的两个窗口都是后来创建的。可能还有问题,你自己想办法解决吧。unit Unit1;
    interfaceuses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, Buttons, AppEvnts;type
    TForm1 = class(TForm)
    BtnClose: TBitBtn;
        BtnForm2: TButton;
    ApplicationEvents1: TApplicationEvents;
    procedure BtnCloseClick(Sender: TObject);
    procedure BtnForm2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure CreateWindowHandle(const Params: TCreateParams); override;
    private
    { Private declarations }
    public
    { Public declarations }
    end;var
    Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.BtnCloseClick(Sender: TObject);
    begin
    Close;
    end;procedure TForm1.BtnForm2Click(Sender: TObject);
    begin
    if not Assigned(Form2) then
      application.CreateForm (tForm2,Form2);
    Form2.Show ;
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      MF:TForm;
    begin
      Application.CreateForm(TForm,MF);
      MF.BorderStyle := bsnone;
      MF.Height := 0;
      Show;
      ShowWindow(Application.Handle, SW_HIDE);
    end;procedure TForm1.CreateWindowHandle(const Params: TCreateParams);
    var
    NewParams: TCreateParams;
    begin
    NewParams:=Params;
    NewParams.ExStyle := NewParams.ExStyle or WS_EX_APPWINDOW;
    inherited CreateWindowHandle(NewParams);
    end;
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Application.MainForm.Close;
    end;end.