Как развернуть окно на два монитора
multiple-monitors - Развернуть окно на двух мониторах в Windows?
В отличие от того, что говорят другие, вот бесплатное, работающее решение, которое максимизирует окно, которое находится под мышью.
(Авторы идут за парнем, который написал эти удивительные функции autoit - я просто написал бит, который их использует.)
Скачайте autoit и установите его (бесплатное программное обеспечение):
http://www.autoitscript.com/site/autoit/
Создайте файл .au3.
Вставьте это внутри:
#include <misc.au3> #include <Array.au3> HotKeySet('{ESC}', '_Exit') Global $WinText, $OldMouse[2], $NewMouse[2], $Windows, $x, $MyWin, $MyCoords $NewMouse = MouseGetPos() $title = _GetWin() WinSetState($MyWin,"",@SW_RESTORE) WinMove($MyWin,"",0,0,3840,1165) Func _GetWin() Local $Coords ToolTip("") $Mouse = MouseGetPos() $OldMouse = $Mouse $Windows = _WinList() ;_ArrayDisplay($Windows, "") For $x = 1 To UBound($Windows)-1 $Coords = WinGetPos($Windows[$x][0], "") If $Coords = -4 Then ExitLoop If IsArray($Coords) Then If $Mouse[0] >= $Coords[0] And $Mouse[0] <= ($Coords[0]+$Coords[2]) And $Mouse[1] >= $Coords[1] And $Mouse[1] <= ($Coords[1]+$Coords[3]) Then ExitLoop EndIf Next If $x = UBound($Windows) Then $x -= 1 $MyWin = $Windows[$x][0] $Control = _MouseGetCtrlInfo() $Return = $Windows[$x][0] & @CRLF & $Control Return $Return EndFunc Func _WinList() Local $WinListArray[1][2] $var = WinList() For $i = 1 to $var[0][0] If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then Redim $WinListArray[UBound($WinListArray) + 1][2] $WinListArray[UBound($WinListArray)-1][0] = $var[$i][0] $WinListArray[UBound($WinListArray)-1][1] = $var[$i][1] EndIf Next Return $WinListArray EndFunc Func IsVisible($handle) If BitAnd( WinGetState($handle), 2 ) Then Return 1 Else Return 0 EndIf EndFunc Func _Exit() Exit EndFunc Func _MouseGetCtrlInfo() ; get ID, Classe and Text of a control Global $hWin = WinGetHandle($MyWin) Global $sClassList = WinGetClassList($hWin) Local $sSplitClass = StringSplit(StringTrimRight($sClassList, 1), @LF) Local $aMPos = MouseGetPos() ;_ArrayDisplay($sSplitClass, "") $MyCoords = ClientToScreen($hWin) For $iCount = UBound($sSplitClass) - 1 To 1 Step - 1 Local $nCount = 0 If $sSplitClass[$iCount] = "WorkerW" Then ContinueLoop While 1 $nCount += 1 $aCPos = ControlGetPos($hWin, '', $sSplitClass[$iCount] & $nCount) If @error Then ExitLoop $hCtrlWnd = ControlGetHandle ($hWin, "", $sSplitClass[$iCount] & $nCount) If IsArray($aCPos) Then If $aMPos[0] >= ($MyCoords[0]+$aCPos[0]) And $aMPos[0] <= ($MyCoords[0]+$aCPos[0] + $aCPos[2]) _ And $aMPos[1] >= ($MyCoords[1]+$aCPos[1]) And $aMPos[1] <= ($MyCoords[1]+$aCPos[1] + $aCPos[3]) Then $aReturn = DllCall('User32.dll', 'int', 'GetDlgCtrlID', 'hwnd', $hCtrlWnd) If @error Then Return "Err" $Text = ControlGetText($hWin, '', $sSplitClass[$iCount] & $nCount) If StringInStr($Text, @LF) Then $Text = "demasiado largo" If IsArray($aReturn) Then Return 'ControlID: ' & $aReturn[0] & @CRLF & 'ClassNameNN: ' & $sSplitClass[$iCount] & $nCount & @CRLF & "Text: " & $Text EndIf EndIf WEnd Next ;_ArrayDisplay($sSplitClass, "") Return "No Ctrl" EndFunc Func ClientToScreen($hWnd) ; get client area of a win relative to the screan Local $Point, $aRes[2] Local $cX, $cY $Point = DllStructCreate("int;int") DllStructSetData($Point, 1, $cX) DllStructSetData($Point, 1, $cY) DllCall("User32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($Point)) $aRes[0] = DllStructGetData($Point, 1) $aRes[1] = DllStructGetData($Point, 2) Return $aRes EndFunc
Затем измените строку
WinMove($ MyWin, "", 0,0,3840,1165)
ценностям по вашему вкусу.
Затем вы можете создать ярлык Windows для этого файла, щелкнуть его правой кнопкой мыши -> Свойства и назначить ярлык (например, CTRL+ALT+UP).
Скорее всего, вы обнаружите, что вам нужно будет повторить процедуру и создать второй файл, чтобы восстановить окно небольшого размера.
Надеюсь это поможет
autohotkey - Как я могу развернуть окно на нескольких мониторах?
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
Как мне развернуть окно на несколько мониторов в awesome wm?
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
Visual Studio и два / несколько мониторов: как оптимизировать использование моих мониторов?
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
Размещение объектов на нескольких мониторах - приложения Win32
- 3 минуты на чтение
В этой статье
Окно или меню, отображаемые на более чем одном мониторе, вызывают нарушение зрения у зрителя. Чтобы свести к минимуму эту проблему, система отображает меню и новые и развернутые окна на одном мониторе.В следующей таблице показано, как выбрать монитор.
Объект | Расположение |
---|---|
окно | CreateWindow (Ex) отображает на мониторе окно, которое содержит наибольшую часть окна. Максимально увеличивает на мониторе, который содержит наибольшую часть окна до его свертывания. Сочетание клавиш ALT-TAB отображает на мониторе окно, в котором находится активное окно. |
собственное окно | на том же мониторе, что и его владелец. |
подменю | Отображается на мониторе, который занимает большую часть соответствующего пункта меню. |
контекстное меню | Появляется на мониторе, где произошел щелчок правой кнопкой мыши. |
раскрывающийся список | Отображается на мониторе, содержащем прямоугольник поля со списком. |
диалоговое окно | Отображается на мониторе окна, которому оно принадлежит. Если оно определено со стилем DS_CENTERMOUSE, оно отображается на мониторе с помощью мыши. Если у него нет владельца, а активное окно и диалоговое окно находятся в одном приложении, диалоговое окно появляется на мониторе текущего активного окна. Если диалоговое окно не имеет владельца и активное окно находится не в том же приложении, что и диалоговое окно, диалоговое окно появляется на основном мониторе. |
окно сообщения | Отображается на мониторе окна, которому он принадлежит. |
Если окно охватывает два монитора и один из мониторов перемещается, система размещает на мониторе окно, которое содержит большую часть исходного окна.
Приложению также обычно требуется позиционировать объекты. Например, может потребоваться создать окно на том же мониторе, что и другое окно.
Для размещения объекта в системе с несколькими мониторами
- Определите подходящий монитор.
- Получите координаты на мониторе.
- Расположите объект, используя координаты.
Обычно вы размещаете объект либо на основном мониторе, либо на мониторе, на котором уже есть объект.Чтобы идентифицировать монитор для данной точки, прямоугольника или окна, используйте MonitorFromPoint , MonitorFromRect и MonitorFromWindow .
Чтобы получить координаты монитора, используйте GetMonitorInfo , который предоставляет как рабочую область, так и весь прямоугольник монитора. Обратите внимание, что SM_CXSCREEN и SM_CYSCREEN всегда относятся к основному монитору, не обязательно к монитору, отображающему ваше приложение. Также избегайте SM_xxVIRTUALSCREEN, потому что это центрирует ваше окно на виртуальном экране, а не на мониторе.
Для центрирования диалоговых окон в рабочей области окна используйте стиль DS_CENTER. Чтобы центрировать диалоговое окно по центру окна приложения, используйте GetWindowRect . Windows автоматически ограничивает меню и диалоговые окна монитором. Однако могут возникнуть проблемы с настраиваемыми меню, настраиваемыми раскрывающимися списками, настраиваемыми инструментальными палитрами и сохраненным положением приложения.
Пример правильного позиционирования объектов см. В разделе «Размещение объектов при настройке нескольких дисплеев».
Использование SM_CXSCREEN и SM_CYSCREEN для определения местоположения панели инструментов рабочего стола приложения (также называемой appbar ) ограничивает панель приложений основным монитором.Чтобы панель приложений находилась на любом краю любого монитора, используйте соответствующие системные метрики для расчета границ мониторов. Также используйте макросы GET_X_LPARAM и GET_Y_LPARAM для извлечения координат, иначе знак координат может быть неправильным. Эти макросы включены в Windowsx.h.
Размер полноэкранного окна должен изменяться при перемещении между мониторами с разным разрешением. Для этого приложение должно проверить, в каком окне оно находится, используя MonitorFromWindow или MonitorFromPoint , а затем использовать GetMonitorInfo , чтобы получить размер монитора.В качестве альтернативы вы можете использовать HMONITOR из функции DirectX DirectDrawEnumerateEx . Затем используйте SetWindowPos , чтобы расположить и изменить размер окна так, чтобы он перекрывал монитор.
Развернутое окно не закрывает панель задач со свойством «Всегда сверху». Однако полноэкранное окно закрывает панель задач - например, в слайд-шоу Microsoft PowerPoint и в играх.
Для сохранения и последующего восстановления положения окна при выходе из приложения используйте функции GetWindowPlacement и SetWindowPlacement .Однако перед использованием убедитесь, что позиция все еще действительна, поскольку монитор мог быть перемещен или удален из системы. Приложение отображает окно на основном мониторе, если HMONITOR окна является недопустимым.
Система пытается запустить приложение на мониторе, содержащем ее ярлык. Итак, один из способов позиционирования приложения - разместить его ярлык на нужном мониторе.
Если вы используете ShellExecute или ShellExecuteEx , укажите hWnd , чтобы система открывала все новые окна на том же мониторе, что и вызывающее приложение.
Обратите внимание, что значения для структуры MINMAXINFO немного изменены для системы с несколькими мониторами.
.