Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Форма без отображения в TASKBAR и поверх окон

513
24 июля 2008 года
Yurec
228 / / 21.09.2005
Если кто знает - посоветуйте пЛз.
Измучился, никак не получается.
Важный момент - окно не главное. Его нужно по команде отображать и при этом всегда держать поверх всех окон и не отображать в таскбаре. Мучался с SetWindowPos и SetWindowLong ничего толком не вышло(
3.7K
24 июля 2008 года
0nni
326 / / 24.06.2008
Если через VCL то вот так
 
Код:
form2.FormStyle := fsStayOnTop;
  form2.BorderStyle := bsSizeToolWin; //bsToolWindow;


Если через 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;


Или вам нудно окно поверх всех окно в системе?
16K
24 июля 2008 года
medved_68
36 / / 06.07.2006
Цитата: Yurec
Если кто знает - посоветуйте пЛз.
Измучился, никак не получается.
Важный момент - окно не главное. Его нужно по команде отображать и при этом всегда держать поверх всех окон и не отображать в таскбаре. Мучался с 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;

Ну а насчет - поверх всех окон - для этого есть функция SetForegroundWindow:)
513
24 июля 2008 года
Yurec
228 / / 21.09.2005
Да, нужно поверх окон в системе. Кстати рамки у этого окна быть не должно, я пока нашел, что можно так:
SetWindowLong(self.Handle, GWL_HWNDPARENT, GetDesktopWindow);

вроде работает, но вот как убрать окно их таскбара, не убирая при этом из таскбара иные окна этого приложения, я не знаю.
513
24 июля 2008 года
Yurec
228 / / 21.09.2005
Цитата: medved_68
Чтобы удалить из таскбар:
Код:
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;

Ну а насчет - поверх всех окон - для этого есть функция SetForegroundWindow:)



Это по-моему систрей? Мне нужно из таксбара (это там где справа от пуска видны заголовки окон). Может я напутал в понятиях...

3.7K
24 июля 2008 года
0nni
326 / / 24.06.2008
Возможно вам нужно вот это?
Код:
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]
513
24 июля 2008 года
Yurec
228 / / 21.09.2005
Цитата: 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]



Очень рядом... Сначала все ок, но после скрыть/показать опять отображается в баре

3.7K
24 июля 2008 года
0nni
326 / / 24.06.2008
Незнаю у меня все в порядке... Есть два варианта...
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);

Если вариант с API подходит, то нужно просто немного почитать.

:rolleyes:Можно еще ваше окно сделать в стиле BorderStyle := bsNone и поместить на Апишную форму, будет то что надо!
261
24 июля 2008 года
ahilles
1.5K / / 03.11.2005
а случайно не вот это ли нужно?
 
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  BorderStyle:=bsNone;
  WindowState:=wsMaximized;
end;
14
25 июля 2008 года
Phodopus
3.3K / / 19.06.2008
Да, хорошую задачку задал, на баг в VCL-е! :)
На вариант который работает:
 
Код:
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;


Но т.к. он изменяет логику VCL могут быть глюки иного рода :)

Полный проект прикрепляю
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог