form2.FormStyle := fsStayOnTop;
form2.BorderStyle := bsSizeToolWin; //bsToolWindow;
Форма без отображения в TASKBAR и поверх окон
Измучился, никак не получается.
Важный момент - окно не главное. Его нужно по команде отображать и при этом всегда держать поверх всех окон и не отображать в таскбаре. Мучался с SetWindowPos и SetWindowLong ничего толком не вышло(
Код:
Если через WinApi
Код:
with form2 do
begin
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
//SetWindowLong(Handle, GWL_STYLE, GetWindowLong(handle, GWL_STYLE) or WS_SIZEBOX);
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);
end;
begin
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
//SetWindowLong(Handle, GWL_STYLE, GetWindowLong(handle, GWL_STYLE) or WS_SIZEBOX);
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);
end;
Или вам нудно окно поверх всех окно в системе?
Цитата: Yurec
Если кто знает - посоветуйте пЛз.
Измучился, никак не получается.
Важный момент - окно не главное. Его нужно по команде отображать и при этом всегда держать поверх всех окон и не отображать в таскбаре. Мучался с SetWindowPos и SetWindowLong ничего толком не вышло(
Измучился, никак не получается.
Важный момент - окно не главное. Его нужно по команде отображать и при этом всегда держать поверх всех окон и не отображать в таскбаре. Мучался с SetWindowPos и SetWindowLong ничего толком не вышло(
Чтобы удалить из таскбар:
Код:
function TaskBarDeleteIcon(hWindow: THandle;ID: Integer): Boolean;
var
NID: TNotifyIconData;
begin
FillChar(NID, SizeOf(TNotifyIconData), 0);
with NID do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := hWindow;
uID := ID;
end;
Result := Shell_NotifyIcon(NIM_DELETE, @NID);
end;
var
NID: TNotifyIconData;
begin
FillChar(NID, SizeOf(TNotifyIconData), 0);
with NID do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := hWindow;
uID := ID;
end;
Result := Shell_NotifyIcon(NIM_DELETE, @NID);
end;
Ну а насчет - поверх всех окон - для этого есть функция SetForegroundWindow:)
SetWindowLong(self.Handle, GWL_HWNDPARENT, GetDesktopWindow);
вроде работает, но вот как убрать окно их таскбара, не убирая при этом из таскбара иные окна этого приложения, я не знаю.
Цитата: medved_68
Чтобы удалить из таскбар:
Ну а насчет - поверх всех окон - для этого есть функция SetForegroundWindow:)
Код:
function TaskBarDeleteIcon(hWindow: THandle;ID: Integer): Boolean;
var
NID: TNotifyIconData;
begin
FillChar(NID, SizeOf(TNotifyIconData), 0);
with NID do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := hWindow;
uID := ID;
end;
Result := Shell_NotifyIcon(NIM_DELETE, @NID);
end;
var
NID: TNotifyIconData;
begin
FillChar(NID, SizeOf(TNotifyIconData), 0);
with NID do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := hWindow;
uID := ID;
end;
Result := Shell_NotifyIcon(NIM_DELETE, @NID);
end;
Ну а насчет - поверх всех окон - для этого есть функция SetForegroundWindow:)
Это по-моему систрей? Мне нужно из таксбара (это там где справа от пуска видны заголовки окон). Может я напутал в понятиях...
Код:
unit Unit2;
...
type
TForm2 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
protected
[COLOR="Blue"]procedure CreateParams(var Params: TCreateParams); override;[/COLOR]
end;
....
[COLOR="Blue"]procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
params.Style := WS_POPUP or WS_VISIBLE or WS_BORDER;
Params.ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST;
end;[/COLOR]
...
type
TForm2 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
protected
[COLOR="Blue"]procedure CreateParams(var Params: TCreateParams); override;[/COLOR]
end;
....
[COLOR="Blue"]procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
params.Style := WS_POPUP or WS_VISIBLE or WS_BORDER;
Params.ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST;
end;[/COLOR]
Цитата: 0nni
Возможно вам нужно вот это?
Код:
unit Unit2;
...
type
TForm2 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
protected
[COLOR="Blue"]procedure CreateParams(var Params: TCreateParams); override;[/COLOR]
end;
....
[COLOR="Blue"]procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
params.Style := WS_POPUP or WS_VISIBLE or WS_BORDER;
Params.ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST;
end;[/COLOR]
...
type
TForm2 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
protected
[COLOR="Blue"]procedure CreateParams(var Params: TCreateParams); override;[/COLOR]
end;
....
[COLOR="Blue"]procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
params.Style := WS_POPUP or WS_VISIBLE or WS_BORDER;
Params.ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST;
end;[/COLOR]
Очень рядом... Сначала все ок, но после скрыть/показать опять отображается в баре
1. Зачем прятать форму - можно создавать ее динамически, а потом уничтожать. Так вы сэкономите, память, да и покажете что вы не просто программист однодневка :)
2. А если делать через WINAPI?
Вот как это делается. И Ж рвать не надо
Код:
var hhintwindow : hwnd;//Глобальная переменная
...
//И при создании окна
hhintwindow := CreateWindowEX(WS_EX_TOOLWINDOW or WS_EX_TOPMOST, 'STATIC', 'Read hint window!!!', WS_VISIBLE or WS_POPUP or SS_CENTER or WS_BORDER,
100, 100, 150, 18, 0, 0, HInstance, nil);
...
//И при уничтожении окна (главного)
DestroyWindow(hhintwindow);
...
//И при создании окна
hhintwindow := CreateWindowEX(WS_EX_TOOLWINDOW or WS_EX_TOPMOST, 'STATIC', 'Read hint window!!!', WS_VISIBLE or WS_POPUP or SS_CENTER or WS_BORDER,
100, 100, 150, 18, 0, 0, HInstance, nil);
...
//И при уничтожении окна (главного)
DestroyWindow(hhintwindow);
Если вариант с API подходит, то нужно просто немного почитать.
:rolleyes:Можно еще ваше окно сделать в стиле BorderStyle := bsNone и поместить на Апишную форму, будет то что надо!
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
BorderStyle:=bsNone;
WindowState:=wsMaximized;
end;
begin
BorderStyle:=bsNone;
WindowState:=wsMaximized;
end;
На вариант который работает:
Код:
procedure TfrmSecond.ApplicationEventsDeactivate(Sender: TObject);
begin
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOOWNERZORDER);
end;
begin
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOOWNERZORDER);
end;
Но т.к. он изменяет логику VCL могут быть глюки иного рода :)
Полный проект прикрепляю