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





Спасибо 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. И меню окна и кнопки мин / макс все еще видны.
Есть интересное обсуждение именно этой проблемы здесь (с точки зрения VB6).
Наиболее актуальный момент с точки зрения вашего вопроса:
"When you create a window, the taskbar examines the window's extended style to see if either the WS_EX_APPWINDOW (&H40000) or WS_EX_TOOLWINDOW (&H80) style is turned on. If WS_EX_APPWINDOW is turned on, the taskbar shows a button for the window, and if WS_EX_ TOOLWINDOW is turned on, the taskbar does not show a button for the window. A window should never have both of these extended styles. If the window doesn't have either of these styles, the taskbar decides to create a button if the window is unowned and does not create a button if the window is owned."
Incidentally, you use the GetWindow API function with the GW_OWNER flag to determine whether a window is owned.
Спасибо, Стю. Вы показали мне проблему. Несмотря на то, что я отключил оба этих параметра, кнопка панели задач все еще отображается, потому что форма не имеет владельца с точки зрения Windows. Это сложно, потому что это плагин COM.
Спасибо Стю за то, что так быстро дал мне ответ. В моем случае мне пришлось вручную добавить дескриптор формы-владельца в 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;
Один из способов сделать это в C#:
ShowWindow(_window, SWHide);
int style = GetWindowLong(_window, GWL_EXSTYLE);
style |= WS_EX_TOOLWINDOW;
SetWindowLong(_window, GWL_EXSTYLE, style);
ShowWindow(_window, SWShow);
В вопросе четко указано, что он ищет НЕ-оконное решение.
Решил мои проблемы в этой области с помощью BordersStyle bsDialog / bsToolWindow (но тогда мне не понадобились min / max ...). Но мне интересно, зачем вам комбинировать эти атрибуты ... Не запутает ли это «нормального» пользователя?
в 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;
это поможет, у меня была такая же проблема, я искал всю сеть, но без разрешения
Я ищу фрагмент кода для интеграции текстового поля в панель задач Windows.
Я планирую создать панель инструментов, которую я не могу интегрировать в панель задач.
Спасибо за помощь пиджей
Спасибо, но я уже использовал этот код. В своем вопросе я указал, что не хочу использовать WS_EX_TOOLWINDOW. Хотя здорово получить такой быстрый ответ :)