Как убрать окно консольной программы из таскбара?
От: SergASh  
Дата: 08.02.21 07:40
Оценка:
Привет всем!

Нужно сделать так, чтобы окно стандартной консольной программы не показывалось на таскбаре.
Обычное решение, которое мне попадалось, сводится к тому, чтобы поменять extended style
целевого окна и потом задать ему невидимого владельца.
  Вот законченный пример
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
  HWND hwndConsole = GetConsoleWindow();

  LONG style = GetWindowLong( hwndConsole, GWL_EXSTYLE );
  style = style & ~WS_EX_APPWINDOW | WS_EX_TOOLWINDOW;
  SetWindowLong( hwndConsole, GWL_EXSTYLE, style );

  HWND hwndOwner = CreateWindowExW( 0, TEXT( "STATIC" ), TEXT( "#0" ), WS_POPUP, 0, 0, 0, 0, 0, 0, 0, nullptr );

  // ShowWindow( hwndConsole, SW_HIDE );

  SetLastError( 0 );
  LONG oldOwner = SetWindowLong( hwndConsole, GWL_HWNDPARENT, (LONG)hwndOwner );
  DWORD err = GetLastError();
  printf( "last error: %d\n", err );

  // ShowWindow( hwndConsole, SW_SHOW );

  printf( "done.\n" );
  getchar();
  return 0;
}
Но с консолью это не работает, она зависает, точнее становится "not responding"
Система, где это должно работать — Windows 8.1 и 10
Re: Как убрать окно консольной программы из таскбара?
От: qaz77  
Дата: 08.02.21 09:13
Оценка: 5 (2) +1
Здравствуйте, SergASh, Вы писали:
SAS>Нужно сделать так, чтобы окно стандартной консольной программы не показывалось на таскбаре.

Консольное окно не вполне обычное.
Например, заголовок нельзя через SetWindowText поменять, а только через SetConsoleTitle.
Поэтому смена стилей окна может не работать.

Я бы попробовал не трогать само окно, а управлять таскбаром напрямую:
ITaskbarList::DeleteTab(HWND)
Re: Как убрать окно консольной программы из таскбара?
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 08.02.21 12:03
Оценка: 4 (1)
Здравствуйте, SergASh, Вы писали:

SAS>Нужно сделать так, чтобы окно стандартной консольной программы не показывалось на таскбаре.


Решения не знаю, но есть сырая идея. Существуют программы-обёртки для консоли типа Console2/ConsoleZ (ещё ConEmu известна, но я её не смотрел). Внутри у них живёт cmd.exe, но каким-то образом они то ли проксируют его, то ли внедряют в своё окно. Можно попробовать разобраться, как они это делают, сделать такой же трюк и применить скрытие к получившемуся формально-теперь-уже-не-консольному окну.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re: Как убрать окно консольной программы из таскбара?
От: TailWind  
Дата: 11.02.21 12:50
Оценка:
SAS>int _tmain(int argc, _TCHAR* argv[])
поменяйте на:

int WinMain(HINSTANCE hi, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

И не будет у вас консоли
Re: Как убрать окно консольной программы из таскбара?
От: CEMb  
Дата: 15.02.21 07:29
Оценка:
Здравствуйте, SergASh, Вы писали:

SAS>Привет всем!


Сейчас нашёл такой способ: сделать консольное окно дочерним у десктопа (которое SysListView32, "FolderView", с иконками, третье в иерархии от основного десктопа ProgMan).
  Скрытый текст
Искал способы вот этой программой

SAS>Система, где это должно работать — Windows 8.1 и 10

Пробовал на 7-ке, но должно работать и там
Re[2]: Как убрать окно консольной программы из таскбара?
От: SergASh  
Дата: 15.02.21 18:33
Оценка:
Здравствуйте, TailWind, Вы писали:

SAS>>int _tmain(int argc, _TCHAR* argv[])

TW>поменяйте на:

TW>int WinMain(HINSTANCE hi, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)


TW>И не будет у вас консоли


Ну так ведь она мне нужна! По сути другого интерфейса-то у программы и нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.