Как сделать так, чтобы окно отображалось на панели задач?

Окно не отображается на панели задач, только в системном трее. Как я могу сделать так, чтобы он отображался и на панели задач?

Я попробовал следующий код, но это не дало никакого эффекта:

int windowStyle = GetWindowLong(pMainWindow, GWL_EXSTYLE);
SetWindowLong(pMainWindow, GWL_EXSTYLE, windowStyle & WS_EX_TOOLWINDOW);

И это НЕ моя форма! Я получаю дескриптор от Process.GetProcessesByName и не знаю, как получить доступ к свойствам класса Form:

Process[] processes = Process.GetProcessesByName("somename");
someProcess = processes[0];

pMainWindow = someProcess.MainWindowHandle;

person Valentin Golev    schedule 22.09.2009    source источник


Ответы (4)


Следующее, кажется, делает свое дело. Если вы скроете и снова отобразите окно после вызова SetWindowLong, оно отобразится на панели задач.

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

[DllImport("User32.Dll")]                
public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

private const int SW_HIDE = 0x00;
private const int SW_SHOW = 0x05;

private const int WS_EX_APPWINDOW = 0x40000;
private const int GWL_EXSTYLE = -0x14;

private void ShowWindowInTaskbar(IntPtr pMainWindow)
{                       
    SetWindowLong(pMainWindow, GWL_EXSTYLE, WS_EX_APPWINDOW);

    ShowWindow(pMainWindow, SW_HIDE);
    ShowWindow(pMainWindow, SW_SHOW);      
}
person ParmesanCodice    schedule 22.09.2009
comment
Круто без проблем. Если вы разворачиваете окно с помощью значка уведомления на панели задач, просто имейте в виду, что когда пользователь сворачивает окно, он ожидает его удаления с панели задач. Как я уже сказал в своем ответе, я не мог заставить этот бит работать... - person ParmesanCodice; 23.09.2009
comment
Я думаю, что это неправильно, например. предполагая, что окно является самым верхним, это очистит флаг WS_EX_TOPMOST. Вам также нужно будет использовать GetWindowLong и |. - person the swine; 23.05.2017

Передайте WS_EX_APPWINDOW вместо WS_EX_TOOLWINDOW. Из документов:

WS_EX_APPWINDOW: принудительно размещает окно верхнего уровня на панели задач, когда окно видимо.

WS_EX_TOOLWINDOW: ...Окно инструмента не появляется на панели задач или в диалоговом окне, которое появляется, когда пользователь нажимает ALT+TAB...

person itowlson    schedule 22.09.2009
comment
Спасибо! попробовал оба SetWindowLong(pMainWindow, GWL_EXSTYLE, windowStyle и WS_EX_APPWINDOW); и SetWindowLong(pMainWindow, GWL_EXSTYLE, windowStyle и WS_EX_APPWINDOW); но без результата. во время поиска в Google я обнаружил, что просто установить сам расширенный стиль окна было недостаточно - он мог работать правильно только при инициализации окна, возможно, это проблема - person Valentin Golev; 23.09.2009
comment
... решение состояло в том, чтобы сделать окно приложения родителем окна, которое мы хотим редактировать. но у меня нет окна в моем приложении, это dll! - person Valentin Golev; 23.09.2009

Установите для свойства .ShowInTaskbar формы значение true.

person Phoexo    schedule 22.09.2009
comment
извините, я не дал вам всю информацию. это не моя форма - person Valentin Golev; 23.09.2009

Можете ли вы преобразовать объект, возвращенный Process.GetProcessesByName(), в форму, а затем установить его свойство .ShowInTaskbar?

person tb.    schedule 22.09.2009
comment
что-то вроде... Object O = new Object(); O = Процесс.ПолучитьПроцессыПоИмени(); ((Форма)O).ShowInTaskBar = true; - person tb.; 23.09.2009