Ostatnio przy okazji grzebania w czeluściach WinAPI otarłem się o temat, więc dla starego kumpla oto proof-of-concept:
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComObj, ShlObj, ActiveX, StdCtrls;
const CLSID_TaskbarList:TGUID='{56FDF344-FD6D-11d0-958A-006097C9A090}';
const IID_ITaskBarList:TGUID='{56FDF342-FD6D-11d0-958A-006097C9A090}';
type
ITaskBarList = interface(IUnknown)
['{56FDF342-FD6D-11D0-958A-006097C9A090}']
function HrInit():HRESULT; stdcall;
function AddTab(hwnd:THandle):HRESULT; stdcall;
function DeleteTab(hwnd:THandle):HRESULT; stdcall;
function ActivateTab(hwnd:THandle):HRESULT; stdcall;
function SetActiveAlt(hwnd:THandle):HRESULT; stdcall;
end;
type
TForm3 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
taskbar:ITaskBarList;
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
taskbar.HrInit;
taskbar.DeleteTab(Application.Handle);
end;
procedure TForm3.FormCreate(Sender: TObject);
begin
CoInitializeEx(nil,0);
CoCreateInstance(CLSID_TaskbarList, nil, CLSCTX_INPROC_SERVER, IID_ITaskBarList, taskbar);
end;
end.
Trzeba uruchamiać exeka jako samodzielną aplikację (spoza delphi).
Naciśnięcie buttona spowoduje zniknięcie aplikacji z paska zadań, ale nie z alt-taba. Teraz wystarczy w DeleteTab() podać handelek do innego okna.
Zgrzyt jest taki, że reaktywowanie "znikniętego" okna powoduje, że przycisk na pasku zadań powróci. Ale to już w ramach zadania domowego... ;-)
Link do EXE - demonstracja: http://wswiktor.fm.interia.pl/znikacz.exe
</url>