Как запретить Проводнику запускать мое приложение максимально?
Кажется, 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 может изменить это поведение в будущем, поэтому нет никакой гарантии, что через тот же ошибочный процесс принятия решений, который они использовали для реализации этого, в первую очередь, они не заставят это снова перерезать нам глотку, используя гораздо более сложный процесс. противодействовать методу.