Скрыть кнопку панели задач формы без использования WS_EX_TOOLWIN

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
9 511
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Спасибо 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. И меню окна и кнопки мин / макс все еще видны.

Спасибо, но я уже использовал этот код. В своем вопросе я указал, что не хочу использовать WS_EX_TOOLWINDOW. Хотя здорово получить такой быстрый ответ :)

sriver 04.11.2008 16:25
Ответ принят как подходящий

Есть интересное обсуждение именно этой проблемы здесь (с точки зрения 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.

sriver 04.11.2008 16:23

Спасибо Стю за то, что так быстро дал мне ответ. В моем случае мне пришлось вручную добавить дескриптор формы-владельца в 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);

В вопросе четко указано, что он ищет НЕ-оконное решение.

Synetech 14.02.2010 23:47

Решил мои проблемы в этой области с помощью 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.

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

Спасибо за помощь пиджей

Другие вопросы по теме