Скрыть кнопку панели задач формы без использования WS_EX_TOOLWIN - PullRequest
4 голосов
/ 04 ноября 2008

Мне нужно скрыть форму Windows на панели задач, но я не могу использовать WS_EX_TOOLWINDOW, потому что мне нужны системное меню и кнопки min / max в строке заголовка формы.

Если я переключаю форму на окно инструментов во время выполнения, обложка формы заполняется. Из поиска в Интернете я вижу, что у VB есть свойство ShowInTaskbar, и мне интересно, будет ли это делать то, что я хочу, и может ли это быть реализовано в Delphi 2006. Также этот проект является COM-сервером и не имеет MainForm и т. Д.

Ответы [ 7 ]

7 голосов
/ 04 ноября 2008

Спасибо Стю за то, что так быстро ответили мне на вопрос. В моем случае мне пришлось вручную добавить дескриптор формы-владельца в CreateParams, но в других / обычных случаях это может не потребоваться.

procedure TfrmWord2Site.CreateParams(var Params:TCreateParams);
begin
  inherited CreateParams(Params);
  Params.WndParent := <your owner form>.Handle;
  Params.ExStyle := Params.ExStyle and not WS_EX_APPWINDOW;
end;
6 голосов
/ 04 ноября 2008

Здесь есть интересное обсуждение этой точной проблемы здесь (от перспективы VB6).

Наиболее важный бит с точки зрения вашего вопроса:

"Когда вы создаете окно, панель задач исследует расширенный стиль окна чтобы увидеть, если либо WS_EX_APPWINDOW (& H40000) или WS_EX_TOOLWINDOW (& H80) стиль включен. Если WS_EX_APPWINDOW включен, панель задач показывает кнопка для окна, и если WS_EX_ TOOLWINDOW включен, панель задач не показывает кнопку для окна. Окно никогда не должно иметь оба эти расширенные стили. Если окно не имеет ни одного из этих стилей, панель задач решает создать кнопку если окно не владеет и не создать кнопку, если окно принадлежит. "

Кстати, вы используете GetWindow Функция API с флагом GW_OWNER для определить, принадлежит ли окно.

1 голос
/ 15 февраля 2011

в Delphi XE (2010) это прекрасно работает: Вы должны редактировать основную форму,

program prog;  

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

begin
Application.Initialize;

// this value is set to "true", but you shoud set it "false"
Application.MainFormOnTaskbar := false;

Application.CreateForm(TForm1, Form1);
Application.Run;
end.

(для этого основного поиска формы в окне "моделирование")

после этого перейдите к unit1.pas, вашему главному модулю форм и событию «OnShow» формы form1:

procedure TForm1.FormShow(Sender: TObject);

begin

ShowWindow(Application.Handle, SW_HIDE);

end;

это поможет, у меня была такая же проблема, искал всю сеть, но без разрешения

1 голос
/ 04 ноября 2008

С благодарностью http://www.scalabium.com/faq/dct0096.htm.

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowWindow(Application.Handle, SW_HIDE);
  SetWindowLong(Application.Handle, GWL_EXSTYLE,
    GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
  ShowWindow(Application.Handle, SW_SHOW);
end;

Я протестировал его, и он работал с Delphi2006. И меню windows и кнопки min / max все еще видны.

0 голосов
/ 29 мая 2015

Я ищу фрагмент кода для интеграции Textbox с панелью задач Windows.

Я планирую создать панель инструментов, которую не могу интегрировать в панель задач.

Спасибо за вашу помощь р ^

0 голосов
/ 14 апреля 2009

Решил мои проблемы в этой области с помощью BordersStyle bsDialog / bsToolWindow (но тогда мне не нужно было min / max ...). Но мне интересно, почему вы должны захотеть объединить эти атрибуты? Не смущает ли это «нормального» пользователя?

0 голосов
/ 05 марта 2009

Один из способов сделать это в C #:

ShowWindow(_window, SWHide);

int style = GetWindowLong(_window, GWL_EXSTYLE);
style |= WS_EX_TOOLWINDOW;
SetWindowLong(_window, GWL_EXSTYLE, style);

ShowWindow(_window, SWShow);
...