最大化Windows中双显示器的窗口?


Answers:


17

与他人所说的相反,这是一个免费的,有效的解决方案,该方案可以最大化鼠标下方的窗口。

(这些钱归功于编写了这些惊人的“自动”功能的人-我只是写了一些使用它们的功能。)

下载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快捷方式,右键单击它-> properties,然后分配快捷方式(例如CTRL + ALT + UP)。

您很可能会发现您将需要重复该过程并创建第二个文件以将窗口还原为小尺寸。

希望这可以帮助


1
爱它!我打算使用NVidia马赛克,但是我想将显示器从两个单独的图形卡中分开,并且由于KVM不支持VGA而无法恢复。只有gotchya-我无法使键盘快捷方式直接从.au3文件的快捷方式使用。我能够得到一个键盘快捷方式来解决到名为au3脚本的批处理脚本的快捷方式。
paquetp

1
确实,除非将脚本文件放在桌面上,否则快捷方式方法不起作用。
nikos 2013年

1
对于具有两个以上监视器的监视器,WinMove($ MyWin,“”,0,0,3840,1165)行中的0,0代表起点的坐标,因此可以通过更改来最大化任何屏幕数量这些数字相应。
ilakast 2014年

我必须在Win 10中为此max.au3创建一个快捷方式,并且该快捷方式的属性允许我分配一个快捷键。不需要批量。
Martin Zaske

@nikos这个脚本对我有用,但是我无法弄清楚windows位置的语法;看来我的0,0在我的主显示器左上角“附近”,但不是。我的第二个监视器也位于主监视器的左侧(脚本似乎允许这样做,但我尚未阅读AutoIt语法)。但是脚本正在打开我的主监视器右侧的程序(这里什么也没有)。我尝试挂钩到一个负值(-1920,0),但那没有用,负数被拒绝。请指教。您的回答
令人高兴

9

Jeff Axelrod具有使用AutoHotKey出色解决方案

他映射了Shift + Windows + Up组合以最大化所有显示的窗口,这与Windows 7的Windows + Up热键互补,后者在一个监视器中最大化了所选窗口。

这是他的代码(感谢Jeff!):

;Shift + Windows + Up (maximize a window across all displays) https://stackoverflow.com/a/9830200/470749
+#Up::
    WinGetActiveTitle, Title
    WinRestore, %Title%
   SysGet, X1, 76
   SysGet, Y1, 77
   SysGet, Width, 78
   SysGet, Height, 79
   WinMove, %Title%,, X1, Y1, Width, Height
return

Shift + Windows +向上键在带有两个屏幕和两个不同图形驱动程序的Windows 10安装程序上不起作用。仍然对其他人有用。
Martin Zaske

8

使用双显示器工具:这是一组免费工具,可以管理多个屏幕设置。

在“ 交换屏幕”工具中,您可以为“超大活动窗口”分配一个热键,以便将其最大化以占据所有屏幕。


2
出色的程序,默认设置合理(全部禁用),完全符合我的需求,来自Ultramon。提示:“超大活动窗口”热键的作用类似于切换。再次点击将恢复窗口。
法尼斯

3

如果您有nVidia视频卡:

  1. 右键单击桌面,然后单击“ NVIDIA控制面板”
  2. 在任务列表的底部,在“工作站”下,是“设置马赛克”。点击它。
  3. 在右侧窗格中,单击“启用马赛克”旁边的复选框
  4. 在“显示”下,在要合并的监视器旁边放置复选标记。
  5. 在“配置”下,选择所需的拓扑(并排,垂直)。
  6. 在屏幕的右下角,点击“应用”

现在,当您单击最大化按钮时,它将覆盖两个监视器。您的任务栏还将覆盖两个监视器。如果那使您感到烦恼,请尝试将其拖动到显示器的左侧,使其变为垂直(如果将图标变小并使用“从不合并”,效果会更好)。



2

有点晚了,但是如果使用Intel集成显卡,则可以打开Intel图形控制面板,选择显示菜单,然后从中选择多个显示器,然后选择“ Collage”,这将让您选择想要扩展的显示器以及其他一些选择。 。

这是启用的屏幕截图:

这是已启用的屏幕截图


1

单击并拖动,否则可以使用高级图形卡将监视器配置为充当一个大屏幕。


0

在Windows 7上,我可以拖动窗口,使其覆盖两个屏幕。如果右键单击桌面并选择“屏幕分辨率”,则必须在“多个显示器”下选择“扩展这些显示器”。如果再次关闭窗口,它应该记住大小和位置。


是的,我正在寻找一种解决方案,您可以使用快捷方式或类似方式轻松地最大化两个监视器的窗口。
Crackerjack

您仅通过将窗口标题栏拖动到屏幕顶部即可做到这一点
subanki 2010年

@subanki-不,那只会最大化当前监视器上的窗口(您“撞”的
那个

0

如果有人仍然尝试使用autoit来执行此操作,则可以使用以下代码来执行此操作:

HotKeySet("^+{UP}", "Resize_Window") ; CTRL+SHIFT+UP
While 1
    Sleep(1000)
WEnd
Func Resize_Window()
    WinSetState("[ACTIVE]","",@SW_RESTORE)
    WinMove("[ACTIVE]","",0,0,_WinAPI_GetSystemMetrics($SM_CXVIRTUALSCREEN),_WinAPI_GetSystemMetrics($SM_CYVIRTUALSCREEN))
EndFunc

包括WinAPI.au3和WindowsConstants.au3之后,此方法就可以使用。
Max Hohenegger '16

0

我将这种解决方法与Sizer(主页)结合使用-它的小型免费软件实用程序允许您通过右键单击“窗口拉伸”区域来设置预定义的窗口大小。

只需创建配置文件集:

  • 宽度=显示器宽度之和
  • 高度=显示器高度-任务栏高度(= 40)
  • 移至=左上方。

然后只需右键单击窗口的右下端,然后选择配置文件。

在此处输入图片说明


0

我找到了一种无需任何软件或代码即可执行此操作的方法。它不是自动的或完美的,但简单易用且效果很好。

  1. Windows +左或右箭头键可将窗口捕捉到两个监视器的最远端的一半
  2. 抓住窗口的边缘并将其拖到两台显示器的最远端

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.