Hiding a form from the TaskBar
Typically, you want to have your programs visible and have the ability to switch to
them; however, there are times when you have a background operation that you don't want
anyone messing with once it has started; or only when you choose to let them mess with it.
The way to accomplish this is with a WinAPI call to ShowWindow.
ShowWindow is a function that allows you change a window's appearance
with respect to Windows environment. With it, you can maximize, minimize, hide, or show
windows to your heart's content. For a more detailed explanation of the function, check
out the Delphi help under WinAPI. Search on ShowWindow, and you'll be on your way.
The program below is a simple example of how you can employ ShowWindow. It demonstrates
not only the ShowWindow procedure, but also a methodology for periodically querying a user
for a response. You can execute a program like this on the fly to implement a
"Register Now!" screen. Here's what to do:
- Start a new project
- Drop two BitButtons on the form.
- Set the 'Kind' property for BitBtn1 to bkRetry and set its caption to 'Continue'
- Set the 'Kind' property for BitBtn1 to bkCancel, leaving its caption alone.
- Drop a timer onto the form, and set its 'Interval' property to 30000 (30 secs).
- Copy the code from the listing below into each event listed in the code.
- Run the form. Now every 30 seconds a message will appear on the screen, asking whether
you want to show the form.
- Select Cancel to quit the program or select Continue to keep hiding the form.
{=======================================================================
This unit demonstrates how you can hide a window from the task manager
and keep the user from being able to Alt-Tab to it.
=======================================================================}
unit Hidemain;
interface
uses
WinTypes, WinProcs, Messages, Controls, Forms,
Dialogs, StdCtrls, Buttons, Classes, ExtCtrls;
type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
{First, check the button's label. If it's 'Hide' then
change it to 'Continue'. First value is only for initial
program execution}
if (BitBtn1.Caption = 'Hide') then
begin
BitBtn1.Caption := 'Continue';
BitBtn1.Update;
end;
{If the window's hidden, ask the user if he/she wants to show it. If
so, show it with its default display parameters.}
if NOT IsWindowVisible(Self.Handle) then
if (MessageDlg('Do you want to show the hidden application?',
mtConfirmation, [mbYes,mbNo], 0) = mrYes) then
ShowWindow(Self.Handle, SW_SHOWNORMAL);
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ShowWindow(Self.Handle, SW_HIDE);
end;
rocedure TForm1.BitBtn2Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
BitBtn1.Caption := 'Hide';
BitBtn1.Update;
end;
end.
Notice that I used another call to the WinAPI called IsWindowVisible.
This function returns the visibility state of any window. Just pass its handle to the
function and it will return a Boolean value: True if the window is visible; False
if the window is hidden. This is a quick and painless way of getting the visibility state
of a form you're interested in.
So what gets accomplished here? Once the form is hidden, it is hidden. You won't
be able to Alt-Tab or Ctrl-Esc to the Task Manager. This is one of those point of no
return scenarios, but it's useful. Something like this could be used for monitoring
certain Windows events or checking the status of a file independent of another program.
Play around with it.
|