2015-03-08 3 views
2

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

Мое окно создано 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 делает это, потому что он имеет сенсорный интерфейс или из-за небольшого экрана.

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

winver.exe в system32 имеет ту же проблему: enter image description here

+0

Вы действительно уверены, что используете данный файл непосредственно в файле .exe, а не на ярлыке с настройкой ** «Run: maximumized» **, применяемой к нему? –

+0

@RemyLebeau Да, я дважды щелкаю непосредственно на .exe. Даже если это был ярлык, мой основной вопрос все равно будет применяться, как я могу предотвратить первый вызов ShowWindow из максимизации окна, в котором нет WS_MAXIMIZEBOX? – Anders

+0

'cmd.exe/c start/MAX c: \ myapp.exe' также имеет такую ​​же проблему ... – Anders

ответ

2

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


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

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

Проблема в том, что положение окна по-прежнему устанавливается на 0 x 0, как максимальное окно.


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

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

Изменение PEB, похоже, не работает, возможно, сторона ядра имеет собственную копию STARTUPINFO ... – Anders

0

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