Создание свернутого перекрывающегося окна (Win32) - PullRequest
0 голосов
/ 01 октября 2011

Я хотел бы создать перекрывающееся окно, которое вначале будет видимым (отображается кнопка панели задач), но свернуто.Создание окна с помощью WS_MINIMZED (или WS_MAXIMIZE в этом отношении) ничего не делает.Использование ShowWindow (hWnd, SW_SHOWMINIMIZED) дает критическую ошибку.Я подозреваю, что это как-то связано с STARTUPINFO, но я не могу найти информацию о том, как его настроить / изменить / взломать.

hWnd = CreateWindowA(
    (LPCSTR)atom, 
    "Window Name", 
    WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_MINIMZED,    // doesn't work
    CW_USEDEFAULT, 
    CW_USEDEFAULT, 
    CW_USEDEFAULT, 
    CW_USEDEFAULT, 
    0, 
    0, 
    hInstance, 
    0);

ShowWindow(hWnd,SW_SHOWMINIMIZED);    // gives critical error

Ответы [ 2 ]

0 голосов
/ 15 ноября 2011

Ссылаясь на MSDN, функция ShowWindow, параметр nCmdShow:

Управляет отображением окна.Этот параметр игнорируется при первом вызове приложения ShowWindow, если программа, запустившая приложение, предоставляет структуру STARTUPINFO.

Итак, я предполагаю, что ваше окно является первым окном, созданным приложением,и как таковой, параметр ShowWindow игнорируется.

Еще один малоизвестный факт виден в документах для CreateWindow, параметр y (да, y):

Если перекрывающееся окно создается с установленным битом стиля WS_VISIBLE, а для параметра x установлено значение CW_USEDEFAULT, то параметр y определяет способ отображения окна.Если параметром y является CW_USEDEFAULT, тогда оконный менеджер вызывает ShowWindow с флагом SW_SHOW после того, как окно было создано.Если параметр y имеет какое-то другое значение, то диспетчер окон вызывает ShowWindow с этим значением в качестве параметра nCmdShow.

Вероятно, лучше создать скрытое окно (без WS_VISIBLE) и /или передача 0 в качестве параметра y для CreateWindow.

Другие варианты: сначала создать фиктивное окно, показать его и быстро уничтожить, например, в виде заставки.Это потребовало бы команду STARTUPINFO.

0 голосов
/ 15 ноября 2011

@ Кайша, вы правы: если вы запускаете исполняемый файл с помощью CreateProcess, то на видимость окна будет влиять STARTUPINFO. Чтобы запустить приложение с свернутым окном, сделайте следующее:

ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
startupInfo.dwFlags = STARTF_USESHOWWINDOW;
startupInfo.wShowWindow = SW_SHOWMINNOACTIVE;

Я использовал этот подход в приложении, которое неоднократно запускало версию WinZip для командной строки, и оно работало нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...