type
TForm1 = class(TForm)
var
Form1 : TForm1;
OldHandle : THandle;
procedure LoForm(aHandle: THandle); Export; StdCall;
procedure FreeForm; Export; StdCall;
implementation
{$R *.dfm}
procedure LoForm(aHandle: THandle);
begin
OldHandle := Application.Handle;
Application.Handle := aHandle;
Form1:= TForm1.Create(Application);
end;
procedure FreeForm;
begin
Application.Handle := OldHandle;
Form1.Free;
end;
Как скрыть кнопки на панели задач?
Есть главная форма, при нажатии на кнопку модально открывает 2 форма, 2 форма порождает 3 форму. Все работает нормально. Проблема проявляется при вызове форм через COM. В этом случае каждая форма отображается на панели задач. Собственно вопрос - как избежать появления вкладок на панели задач? Я хочу чтобы отображалась только главное окно программы. Работаю на Delphi XE.
Код:
Можно так же попробовать при создании формы, принудительно
изменять стиль отображения окна с WS_EX_APPWINDOW на WS_Ex_ToolWindow:
Код:
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure CreateParams(VAR Params: TCreateParams);
override;
...
procedure TForm1.CreateParams(VAR Params: TCreateParams);
begin
Inherited
CreateParams(Params);
WITH Params DO
ExStyle := ExStyle OR WS_Ex_ToolWindow;
end;
TForm1 = class(TForm)
private
{ Private declarations }
procedure CreateParams(VAR Params: TCreateParams);
override;
...
procedure TForm1.CreateParams(VAR Params: TCreateParams);
begin
Inherited
CreateParams(Params);
WITH Params DO
ExStyle := ExStyle OR WS_Ex_ToolWindow;
end;
Надеюсь, это поможет.
Изменение стиля окна помогло. Но появилась другая проблема - при нажатии Alt + Tab дочерние формы скрываются за главной:( При этом главная форма остается заблокированной.
Код:
var
x: word;
begin
x:= GetSysModalWindow(Form1.handle);
SetSysModalWindow(x);
end;
x: word;
begin
x:= GetSysModalWindow(Form1.handle);
SetSysModalWindow(x);
end;
Ещё можно сделать активной главную форму приложения с помощью такой процедуры:
Код:
procedure ShowMainForm;{©Drkb v.3.01 2008}
var
hWnd,hCurWnd,dwThreadID,dwCurThreadID: THandle;
OldTimeOut: DWORD;
AResult: boolean;
begin
ShowWindow(Application.Handle,SW_RESTORE);
Application.MainForm.Visible := true; // Показываем главную форму
hWnd:= Application.Handle; // Ставим нашу форму впереди всех окон
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT,0,@OldTimeOut,0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,Pointer(0),0);
SetWindowPos(hWnd, HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
hCurWnd:= GetForegroundWindow;
AResult:= false;
While not AResult do
begin
dwThreadID:= GetCurrentThreadId;
dwCurThreadID:= GetWindowThreadProcessId(hCurWnd);
AttachThreadInput(dwThreadID,dwCurThreadID,true);
AResult:= SetForegroundWindow(hWnd);
AttachThreadInput(dwThreadID,dwCurThreadID,false);
end;
SetWindowPos(hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,Pointer(OldTimeOut), 0);
end;
var
hWnd,hCurWnd,dwThreadID,dwCurThreadID: THandle;
OldTimeOut: DWORD;
AResult: boolean;
begin
ShowWindow(Application.Handle,SW_RESTORE);
Application.MainForm.Visible := true; // Показываем главную форму
hWnd:= Application.Handle; // Ставим нашу форму впереди всех окон
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT,0,@OldTimeOut,0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,Pointer(0),0);
SetWindowPos(hWnd, HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
hCurWnd:= GetForegroundWindow;
AResult:= false;
While not AResult do
begin
dwThreadID:= GetCurrentThreadId;
dwCurThreadID:= GetWindowThreadProcessId(hCurWnd);
AttachThreadInput(dwThreadID,dwCurThreadID,true);
AResult:= SetForegroundWindow(hWnd);
AttachThreadInput(dwThreadID,dwCurThreadID,false);
end;
SetWindowPos(hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,Pointer(OldTimeOut), 0);
end;
Или наоборот, заставить её находиться всегда "в тылу":
Код:
type
TForm1 = class(TForm)
procedure WndProc (Var Message: TMessage); override;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WndProc (Var Message: TMessage);
begin
case Message.Msg of
WM_WINDOWPOSCHANGING:
PWindowPos(Message.LParam)^.hwndInsertAfter:= HWND_BOTTOM;
end;
inherited;
end; //Автор: antonn
TForm1 = class(TForm)
procedure WndProc (Var Message: TMessage); override;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WndProc (Var Message: TMessage);
begin
case Message.Msg of
WM_WINDOWPOSCHANGING:
PWindowPos(Message.LParam)^.hwndInsertAfter:= HWND_BOTTOM;
end;
inherited;
end; //Автор: antonn
Играясь с параметрами типа HWND_(BOTTOM/TOPMOST) можно добиться очень интересных результатов:-)