Программно развернуть окно без полей - PullRequest
0 голосов
/ 09 июня 2018

В настоящее время у меня есть способ сделать именно то, что я спрашиваю, но результаты очень неэффективны для некоторых пользователей.Некоторые пользователи сообщали, что он сделал это так, как если бы он был свернут (окно не отображалось никогда, но все еще на панели задач), некоторые сообщили, например, в сверхшироком 21: 9, что он будет максимизироваться только слева от ширины 1080p 16: 9, но у меня есть32: 9 сверхвысокое и не было проблем.

Мой текущий поток:

  • Получить размеры экрана, исключая нагрузку на панель задач:

    MaximizedBounds = Screen.FromHandle(mForm.Handle).WorkingArea; (mForm = Application.OpenForms [0], для поддержки из любого потока и т. Д.)

  • Из другого потока / функции / запуска класса: Form1.mForm.Invoke(new MethodInvoker(() => Form1.mForm.WindowState = FormWindowState.Maximized));
  • Этодолжно привести к максимизированному окну с надлежащим разрешением, но это не так: /

Что я бы предпочел:

  • НЕ требуется получать размеры экрана назагрузите, поэтому используйте что-нибудь из официального кода Microsoft, либо DllImport, .NET Framework Code, либо msapi, чтобы получить PROPER MaximizedBounds for Formsless Forms.(formborderstyle.none)

Я установил MaximizedBounds, потому что если я этого не сделаю, приложение будет полноэкранным на весь экран, а не «максимизирует», как традиционные приложения, но в конечном итоге сделает большеПолноэкранный стиль видеоплеера.

Используя мой экран 32: 9 и экран моего ноутбука 4k 16: 9 в режиме расширенного отображения, мне удалось воссоздать проблему

enter image description here

Этапы перепроизводства:

  • Откройте приложение, оставьте его на экране, в котором оно впервые запустилось в
  • Разверните приложение (будет работать нормально)
  • Разверните и переместите его на другой экран
  • Нажмите на максимизировать, ваш результат должен быть, как указано выше.

Это означает, Maximize Bounds при загрузке получает активные границы только один раз, как и ожидалось, но из-за того, что я выполняю изменение Form Style для другого класса и другого потока, я не могу на самом деле редактировать свойство MaximizedBounds для него каждый раз, когда я хочу максимизировать, так какприсваиватьты не публичный.

1 Ответ

0 голосов
/ 09 июня 2018

Благодаря HansPassant!

Выяснили, что именно нужно.

Проблема:

  • При перемещении приложения на другой монитор онобудет использовать те же границы.Причиняя это не должным образом Максимизировать
  • При обновлении границ с помощью WndProc (), он все равно будет пытаться максимизировать на Мониторе 1, но за пределами его реальных границ, создавая впечатление, что приложение было скрыто>: (* ​​1012 *

Обновление границ (укажите это в форме Form1):

protected override void WndProc(ref Message m) {
    if(m.Msg == 0x02E0) {
        Rectangle b = Screen.FromControl(mForm).WorkingArea; //where mForm is Application.OpenForms[0], this is specific to my applications use case.
        b.X = 0; //The bounds will try to base it on Monitor 1 for example, 1920x1080, to another 1920x1080 monitor on right, will set X to 1080, making it show up on the monitor on right, outside its bounds.
        b.Y = 0; //same as b.X
        MaximizedBounds = b; //Apply it to MaximizedBounds
        m.Result = (IntPtr)0; //Tell WndProc it did stuff
    }
    base.WndProc(ref m); //If any other messages were called, do the defaults this method does. Required even if you edited a msg.
}

Обновление осведомленности о DPI для запуска сообщения WndProc (поместите это в app.manifest,сделайте это, если его не существует):

<application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitor</dpiAwareness> //Windows 10
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware> //Old-Compatibility
    </windowsSettings>
</application>

Теперь он больше не отображается вне границ и, наконец, обновляет MaximizeBounds при смене мониторов!

Спасибо @HansPassant за советы!

...