如何从ALT+TAB隐藏应用程序,但不从任务栏(图标行)隐藏



我想在ALT+TAB中隐藏我的应用程序,但不想在任务栏中隐藏;任务栏现在有一个可以用来管理工具GUI的图标。

然而,由于应用程序的主窗口实际上是隐藏的,因此不需要将应用程序放在ALT-TAB可浏览窗口列表中。

应用程序窗口通过将其ALPHA设置为0而隐藏。

  1. 您必须将Form.BorderStyle设置为bsSizeToolWinbsToolWindow,因此其窗口不会在Alt+选项卡对话框中列出
  2. 您必须对Application.Handle窗口执行相同操作:
    procedure TForm1.FormCreate( Sender: TObject );
    var
    iStyle: Integer;
    begin
    iStyle:= GetWindowLong( Application.Handle, GWL_EXSTYLE );
    SetWindowLong( Application.Handle, GWL_EXSTYLE, iStyle or WS_EX_TOOLWINDOW );
    end;
    
    步骤#1和#2对我来说如预期的那样有效:窗口列表中没有任何内容,任务栏上没有一个按钮
  3. 根据雷米单独添加任务栏按钮的说法,界面承诺会这样做:
    uses
    ComObj;
    // From https://github.com/project-jedi/jvcl/blob/master/jvcl/run/JvProgressBar.pas
    const
    CLSID_TaskbarList: TGUID= '{56FDF344-FD6D-11d0-958A-006097C9A090}';
    type
    ITaskbarList= interface(IUnknown)
    ['{56FDF342-FD6D-11D0-958A-006097C9A090}']
    function HrInit: HRESULT; stdcall;
    function AddTab( hwnd: HWND ): HRESULT; stdcall;
    function DeleteTab( hwnd: HWND ): HRESULT; stdcall;
    function ActivateTab( hwnd: HWND ): HRESULT; stdcall;
    function SetActiveAlt( hwnd: HWND ): HRESULT; stdcall;
    end;
    var
    oBar: ITaskbarList= nil;
    procedure TForm1.Button1Click( Sender: TObject );
    begin
    if oBar= nil then begin  // Never used? Try to init.
    oBar:= CreateComObject( CLSID_TaskbarList ) as ITaskbarList;
    if oBar.HrInit<> S_OK then oBar:= nil;  // Failed? Can't use it.
    end;
    if oBar<> nil then begin
    if oBar.AddTab( self.Handle )= S_OK then self.Caption:= 'Success!';
    end;
    end;
    
    然而:这第三步在Win7上对我不起作用——任务栏上没有添加任何按钮,尽管没有出现任何错误。可能是因为
    • 我禁用了样式,我的任务栏看起来像Win95,并且
    • T-Clock Redux 2.4.4正在操纵它

我不赞成这种整个方法:Alt+选项卡中出现的内容也应该有任务栏按钮,反之亦然。在工作中,有一个烦人的NCP软件,它在成功连接后自动隐藏窗口,坚持使用任务栏图标,并在我靠近任务图标时自动在窗口中滑动,尽管我肯定想换一个。可怕的是,因为它总是挡道,也不能依靠它来坚持下去。

这不是你想要的,但你也想强迫不一致。干脆不要。只需发布一个可以使用的应用程序,以及预期行为发生的位置。如果所有这些都没有改变你,那么想想你的应用程序在未来的模拟中会有多容易失败——不要做不寻常的事情,Wine也不会为所有Unix用户运行它。

最新更新