Как запретить Проводнику запускать мое приложение максимально?

Кажется, Explorer всегда запускает мое приложение с SW_MAXIMIZE (STARTF_USESHOWWINDOW установлен в STARTUPINFO.dwFlags). я знаю это ShowWindow будет использовать это значение в первый раз, когда вам /Windows потребуется отобразить окно, но оно имеет печальное последствие максимизации окна, которое никогда не должно быть максимизировано.

Мое окно создано с CreateDialogIndirectParam и имеет следующие стили: WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_CLIPCHILDREN|DS_MODALFRAME|DS_CENTER|WS_VISIBLE, Почему ShowWindow не проверять, если WS_MAXIMIZEBOX устанавливается перед разрешением STARTF_USESHOWWINDOW заставить SW_MAXIMIZE? Это ошибка в Windows?

Это происходит на HP Stream 7 с Windows 8.1. Я не уверен, что это делает Проводник, потому что он сенсорный или из-за маленького экрана.

Задокументировано ли это поведение проводника где-нибудь и есть ли способ его отключить? Каков наилучший способ остановить Explorer (или любой другой родительский процесс) от воздействия на мой начальный режим окна? (Я не хочу блокировать людей, начинающих меня с SW_*MINIMIZE*)

WinVer.exe в system32 имеет ту же проблему:

2 ответа

Моей первой мыслью было отключить STARTF_USESHOWWINDOW в PEB, если родитель хотел, чтобы я начал максимально, но это слишком неприятно и недокументировано, поэтому я еще не пробовал.


Предотвращение любого вида изменения размера (что нормально для моего приложения, так как это просто "модальный" диалог) вроде работает:

case WM_WINDOWPOSCHANGING:
  ((WINDOWPOS*)lp)->flags |= SWP_NOSIZE;
  return true;

Проблема в том, что позиция окна по-прежнему установлена ​​на 0 х 0, как развернутое окно.


Лучшее решение, кажется, состоит в том, чтобы обнаружить и исправить проблему после WM_INITDIALOG:

case WM_INITDIALOG:
  PostMessage(hDlg, WM_APP, 0, 0);
  break;
case WM_APP:
  if (IsZoomed(hDlg)) ShowWindow(hDlg, SW_SHOWNOACTIVATE);
  break;

Я являюсь счастливым владельцем нескольких планшетов HP Stream 7, и я хотел бы добавить свои 2 цента здесь. Microsoft приняла произвольное решение, что устройства с размерами экрана менее 8 дюймов будут вести себя не так, как обычно. Многие пользователи в некоторой степени знают об этом, но не знают, что именно здесь возникает ваша проблема.

Windows определяет размер экрана, считывая с экрана информацию об EDID, которая содержит информацию о размерах в сантиметрах.

Если в EDID нет информации о размерах или информация о размерах ниже произвольно выбранного 8-дюймового порога Microsoft, вы получаете это явное неправильное поведение, которое, по меньшей мере, ухудшает положение тех, кто замечает это и не хочет этого.

Решение состоит в том, чтобы переопределить драйвер по умолчанию для монитора в диспетчере устройств с драйвером, который сообщает Windows, что на самом деле экран имеет размер 8 дюймов или больше.

Для этого сначала необходимо прочитать информацию EDID из реестра с помощью такого инструмента, как редактор E-EDID Deltacast (бесплатно, последний раз, когда я проверял), а также изменить значения размера и сохранить измененный файл где-нибудь, где вы сможете его найти.

После того, как вы изменили файл EDID и сохранили его, загрузите Monitor Asset Manager из EnTech (также бесплатно) и используйте его для создания INF-файла.

После создания INF-файла необходимо перезапустить Windows с помощью меню "Дополнительные настройки" и выбрать "Отключить принудительное выполнение подписи драйверов", поскольку созданный вами INF-файл не будет иметь цифровой подписи. После отключения откройте диспетчер устройств в Windows и обновите драйвер для монитора, используя созданный вами INF-файл. Вам нужно будет подтвердить, что вы действительно хотите установить неподписанный файл драйвера.

Перезагрузка и Windows теперь будут вести себя нормально с одной загадкой: экранная клавиатура теперь будет другого размера и будет иметь больше доступных опций.

К сожалению, Microsoft может изменить это поведение в будущем, поэтому нет никакой гарантии, что через тот же ошибочный процесс принятия решений, который они использовали для реализации этого, в первую очередь, они не заставят это снова перерезать нам глотку, используя гораздо более сложный процесс. противодействовать методу.

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