2005. március 4., péntek

How to disable and reenable the Windows start button


Problem/Question/Abstract:

How can I disable the Windows start button and prevent the user from accessing it by clicking on it or by pressing [CTRL] + [ESC] ?

Answer:

Solve 1:

To disable the Start button:

var
  h: hwnd;
begin
  h := FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', nil);
  EnableWindow(h, false);
end;

But the user can still access the start menu by pressing [CTL] + [ESC] or the windows key. Even hiding the Start button doesn't work. But hiding the Start button and using the SetParent function seems to work:

var
  h: hwnd;
begin
  h := FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', nil)
    ShowWindow(h, 0);
  Windows.SetParent(h, 0);
end;

To enable the Start button again:

var
  h: hwnd;
  TaskWindow: hwnd;
begin
  h := FindWindowEx(GetDesktopWindow, 0, 'Button', nil);
  TaskWindow := FindWindow('Shell_TrayWnd', nil);
  Windows.SetParent(h, TaskWindow);
  ShowWindow(h, 1);
end;

Furthermore, you could create your own Start button and "replace" it with your own.

var
  b: TButton; {or another button type that can hold a bitmap}
  h, Window: hwnd;
begin
  Window := FindWindow('Shell_TrayWnd', nil);
  b := TButton.Create(nil);
  b.ParentWindow := Window;
  b.Caption := 'Start';
  b.Width := 60;
  b.font.style := [fsbold];
end;


Solve 2:

procedure TForm1.Button1Click(Sender: TObject);
var
  Rgn: hRgn;
begin
  {Hide the start button}
  Rgn := CreateRectRgn(0, 0, 0, 0);
  SetWindowRgn(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', nil), Rgn,
    true);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  {Turn the start button back on}
  SetWindowRgn(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', nil), 0,
    true);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  {Disable the start button}
  EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', nil),
    false);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  {Enable the start button}
  EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', nil),
    true);
end;

Nincsenek megjegyzések:

Megjegyzés küldése