如何从 ALT+TAB 隐藏应用程序而不是从任务栏(图标行)隐藏应用程序
How to hide App from ALT+TAB but not from the Taskbar (icon row)
我想从 ALT+TAB 隐藏我的应用程序而不是从任务栏;
任务栏现在有一个图标可以用来管理工具 GUI。
但是,不需要将应用程序放在 ALT-TAB 可浏览 window 列表中,因为应用程序的主要 window 实际上是隐藏的。
应用 Window 通过将其 ALPHA 设置为 0 来隐藏。
- 您必须将
Form.BorderStyle
设置为 bsSizeToolWin
或 bsToolWindow
,因此其 window 未在 Alt[=35 中列出=]+Tab 对话框.
- 您必须对
Application.Handle
window 执行相同的操作:
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 按预期对我有效:window 列表中没有任何内容,任务栏上没有一个按钮。
- 根据 Remy 单独添加任务栏按钮 the interface promises to do so:
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+Tab 中的内容也应该有一个任务栏按钮,反之亦然。在工作中,有一个烦人的 NCP software,它会在成功连接后自动隐藏其 window,坚持使用任务托盘图标,并在我靠近任务图标时立即在 window 中使用 auto-slides ,虽然我肯定想打一个不同的。可怕,因为它总是挡路,也不能指望坚持下去。
这不是你想要的,但你也想强制不一致。干脆不要。只需发布一个可以使用并且预期行为也会发生的应用程序。如果所有这些都不打动你,那么想想你的应用程序将来在仿真中失败的可能性有多大——不要做不寻常的事情,Wine 将没有问题 运行 它适用于所有 Unix用户也是。
我想从 ALT+TAB 隐藏我的应用程序而不是从任务栏; 任务栏现在有一个图标可以用来管理工具 GUI。
但是,不需要将应用程序放在 ALT-TAB 可浏览 window 列表中,因为应用程序的主要 window 实际上是隐藏的。
应用 Window 通过将其 ALPHA 设置为 0 来隐藏。
- 您必须将
Form.BorderStyle
设置为bsSizeToolWin
或bsToolWindow
,因此其 window 未在 Alt[=35 中列出=]+Tab 对话框. - 您必须对
Application.Handle
window 执行相同的操作:
步骤 #1 和 #2 按预期对我有效:window 列表中没有任何内容,任务栏上没有一个按钮。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;
- 根据 Remy 单独添加任务栏按钮 the interface promises to do so:
然而:这第三步在 Win7 上对我不起作用 - 没有按钮被添加到任务栏,尽管没有发生错误。可能是因为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;
- 我禁用了样式,我的任务栏看起来像在 Win95 中,并且
- T-Clock Redux 2.4.4正在操纵它。
我不鼓励整个方法:出现在 Alt+Tab 中的内容也应该有一个任务栏按钮,反之亦然。在工作中,有一个烦人的 NCP software,它会在成功连接后自动隐藏其 window,坚持使用任务托盘图标,并在我靠近任务图标时立即在 window 中使用 auto-slides ,虽然我肯定想打一个不同的。可怕,因为它总是挡路,也不能指望坚持下去。
这不是你想要的,但你也想强制不一致。干脆不要。只需发布一个可以使用并且预期行为也会发生的应用程序。如果所有这些都不打动你,那么想想你的应用程序将来在仿真中失败的可能性有多大——不要做不寻常的事情,Wine 将没有问题 运行 它适用于所有 Unix用户也是。