拔出和重新插入第二台显示器时,请记住窗口的大小和位置


99

这里有些糟透了:

  1. 将外接显示器插入笔记本电脑(在我的情况下为Mac OS X Leopard)。
  2. 安排窗口以将IDE放在一个屏幕上,将浏览器放在另一个屏幕上。(等等)调整大小,重新排列,大惊小怪,大惊小怪,大惊小怪。)
  3. 拔下显示器以参加会议或其他任何操作。
  4. 转到1。

我想将步骤2替换为“计算机准确记住我的操作方式,然后将其放回去”。

(我个人只需要Mac的解决方案,但是在这里收集其他系统的解决方案可能对其他人有用。我确信这是一个常见问题。)

Answers:


56

看看无绳犬的住宿吧。我相信它确实可以满足您的需求。


2
我试过了 它不适用于X11窗口,但其他方面似乎与广告一样。感谢您的指导!可能这是我们目前与Mac解决方案最接近的解决方案。
dreeves,2010年

X11窗口不是“真正的” NSWindow实例(至少它们不是我上次检查的实例),因此Stay对此毫无关系并不奇怪:)很高兴其他方法可以解决!

1
这看起来不错,但不适用于Lion中的全屏应用程序。当我有1个显示器时,我以全屏模式运行Safari,并且在附加了2个显示器后,我想退出全屏并将Safari移至第二个显示器。Stay不会移动任何全屏应用程序。

1
看起来很合适。但是,使用3个外部显示器时,通常在位置方面存在问题,并且只解决了50%的问题。所以我仍然需要做很多手工工作。我只是卸载了它。哦,它只有30天的试用期!
恩斯特恩斯特

15

Slate是一款功能非常强大的免费 Mac应用程序,可以完全满足您的需求。当您插入辅助监视器时,它将自动检测到新监视器,并且所有窗口将按照您喜欢的方式进行移动和调整大小。您可以为所有应用程序定义自定义位置和大小,包括全屏,半屏和基于网格。

关于Slate的最酷的事情之一是,您可以基于已连接的监视器数量来定义不同的布局。例如,如果您自己使用笔记本电脑,则可能希望所有应用程序都充满整个屏幕。但是,当您拥有较大的辅助显示器时,可能需要在浏览器,邮件和音乐之间拆分屏幕。石板很容易做到这一点。

您还可以为特定的布局和操作定义键盘快捷键,例如按一定百分比微调和调整窗口大小。

以下是我的配置文件。我将所有应用程序全屏显示在所有显示器上,但是您可以对其进行更改以使其尺寸减小一半或其他大小:

# Monitor Aliases
alias mon-laptop    0    # variable for my laptop monitor
alias mon-hp        1    # my external HP monitor

# Window Position Regions
alias hp-full        move screenOriginX;screenOriginY screenSizeX;screenSizeY         ${mon-hp}
alias hp-left        move screenOriginX;screenOriginY screenSizeX/2;screenSizeY         ${mon-hp}
alias hp-right       move screenOriginX+screenSizeX/2;screenOriginY screenSizeX/2;screenSizeY         ${mon-hp}
alias laptop-full        move screenOriginX;screenOriginY screenSizeX;screenSizeY         ${mon-laptop}
alias laptop-left        move screenOriginX;screenOriginY screenSizeX/2;screenSizeY         ${mon-laptop}
alias laptop-right       move screenOriginX+screenSizeX/2;screenOriginY screenSizeX/2;screenSizeY         ${mon-laptop}
alias laptop-righttop    move screenOriginX+screenSizeX/2;screenOriginY screenSizeX/2;screenSizeY/2       ${mon-laptop}
alias laptop-rightbottom move screenOriginX+screenSizeX/2;screenOriginY+screenSizeY/2    screenSizeX/2;screenSizeY/2       ${mon-laptop}

# Window layouts for when I have 2 monitors
layout 2monitor 'Google Chrome':REPEAT ${hp-full}
layout 2monitor 'iCal':REPEAT ${hp-full}
layout 2monitor 'Coda':REPEAT ${hp-full}
layout 2monitor 'Mail':REPEAT ${laptop-full}
layout 2monitor 'Rdio':REPEAT ${laptop-full}
layout 2monitor 'Spotify':REPEAT ${laptop-full}
layout 2monitor 'Evernote':REPEAT ${laptop-full}

# Single monitor window layouts
layout 1monitor 'Google Chrome':REPEAT ${laptop-full}
layout 1monitor 'iCal':REPEAT ${laptop-full}
layout 1monitor 'Coda':REPEAT ${laptop-full}
layout 1monitor 'Mail':REPEAT ${laptop-full}
layout 1monitor 'Rdio':REPEAT ${laptop-full}
layout 1monitor 'Spotify':REPEAT ${laptop-full}
layout 1monitor 'Evernote':REPEAT ${laptop-full}

# Keyboard shortcuts for each layout
bind l:shift;ctrl layout 2monitor
bind g:shift;ctrl grid padding:5 0:2,1 1:2,2

# Auto-detect when a monitor is plugged in or out
default 2monitor count:2
default 1monitor count:1

这是Slate的GitHub页面上的功能列表:

  • 高度可定制
  • 将击键绑定到:
    • 移动和/或调整窗口大小
    • 定向聚焦窗
    • 激活预设布局
    • 创建,删除和激活Windows当前状态的快照
  • 为不同的监视器配置设置默认布局,这些布局将在检测到该配置时激活。
  • 窗口提示:更改窗口焦点的直观方法
  • [Beta]一个更好,更可定制的应用程序切换器。

这是有关如何充分利用Slate 的出色教程


它还记得上次插入外部显示器并恢复它们时窗的位置吗?应用程序“ Stay”几乎可以做到这一点,但是它仍然无法记住窗口(尤其是Chrome),因此我仍在寻找更好的东西。
dreeves,2014年

@dreeves是的,它对我有用。我只是使用Slate的菜单项“ Take Snapshot”和“ Activate Snapshot”成功完成了手动操作;如果在使计算机进入睡眠状态之前和之后单击它们,则将保存并恢复所有窗口位置。从文档看来,Slate可以使用其default指令自动执行“激活快照” 。我不知道您是否可以自动执行“拍摄快照”部分。
罗里·奥肯

2
我想指出的是,对于OP用例,他们只需单击“保存快照”并在菜单中还原快照。只要您只需要一个窗口配置,它就可以正常工作而不会弄乱其他任何东西。
Muhd

3
石板不再被维护,他们建议现在使用Hammerspoon。
当然

8

我已经用一个小的AppleScript和一个小的免费软件实用程序Quicksilver解决了这个问题。

  1. 将此小型AppleScript保存在计算机上不会改变的位置:

    try
        tell application "Adium"
            activate
            tell window "contacts"
                set the bounds to {1281, 200, 1460, 850}
            end tell
            tell chat windows
                set the bounds to {1281, 800, 1800, 1200}
            end tell
        end tell
    end try
    
    try
        tell application "iTunes"
            activate
            set the bounds of the first window to {1750, 520, 2700, 1150}
        end tell
    end try
    
    try
        tell application "Terminal"
            activate
            set the bounds of the first window to {2450, 320, 3180, 950}
        end tell
    end try
    
    try
        tell application "Firefox"
            activate
            set the bounds of the first window to {1460, 20, 2800, 950}
        end tell
    end try
    
  2. 您将需要自定义在监视器上想要的应用程序,并且窗口以您喜欢它们的方式限制。我是一名程序员,上面的配置是我运行第二台监视器的方式。

  3. 安装Quicksilver

    我选择使其在Dock中不可见,而只是作为一个小的任务栏守护程序运行

  4. 在Quicksilver中设置键盘命令,然后将步骤1中的AppleScript拖放到窗口中作为要执行的操作。我将其绑定到CommandShiftA。很棒!


3
如果您要管理大量的应用程序,则不是特别可扩展。也不容易管理!硬编码范围确实没什么好玩的。
fatuhoku 2012年

您可以设置应用程序出现的桌面吗?
dangerousdave

3

拔下显示器电源之前,请关闭所有不完全位于主显示器上的部件。应用程序通常在关闭时保存其状态(包括窗口放置),并在打开时读取它们,因此,如果这两个时间都存在第二个监视器,则应该没事。

您可以利用允许一次打开多个实例,但仅在关闭状态下保存状态的应用程序。关闭多监视器实例(这将导致状态被保存)。拔下第二台显示器的电源。如果正在运行第二个实例,则应将其重新放置在主监视器上,或者可以启动另一个实例。在再次插入第二个监视器并启动另一个实例(然后在启动时将读取多监视器配置)之前,请勿关闭该实例。然后,您可以退出单监视器实例(保存该状态),然后退出多监视器实例(覆盖单监视器状态)。

一个更复杂的选项可能包括在打开应用程序之前弄清楚状态的保存位置,备份状态以及编写批处理文件/脚本以将其还原,这将允许您创建一个链接以在启动应用程序时自动执行此操作。

最后,您的平台可能会有这样的实用程序,或者编写一个实用程序可能不太复杂。对于Windows,有一个名为ShiftWindow的程序可以在应用程序启动或某个热键上重新定位窗口。恐怕我不太了解MacOS,无法说出是否存在类似的实用程序。这可能是理想的解决方案,仅次于让OS直接支持此类事物。


1
谢谢!不是我希望的答案,而是一个很好的领先者!
dreeves

3

我只是关注了http://cordlessdog.com/stay/,对我来说效果很好,尽管有点滞后

在Mac上保持安装状态后,可以启动它并按需要存储Windows。因此,无论何时断开显示器并重新连接,您都将恢复所有窗口。

您可能必须将stay添加为启动应用程序,因为每次重启Mac时都必须启动它。


2

我没有任何外部应用程序就解决了这个问题。

所有您需要做的就是确保您的笔记本电脑是“台式机1”,而外接显示器是“台式机2”

您可以通过在系统偏好设置>显示>排列中将白色菜单栏移至笔记本电脑屏幕来完成此操作


1

至少在Windows上,如果在切换监视器之前将它们最大化,则许多应用程序将恢复自身。在会议期间,不要理会它们,然后在重新连接后恢复它们。

它仍然是一个不完整的修复程序(而且很麻烦),但是如果我希望有机会复活精心放置的窗户,这是我唯一知道的事情。ShiftWindow听起来很有趣...

如果您从两台显示器降到一台,Al​​t + Spacebar + M,则如果您“丢开”窗户,箭头键将是救生员(再次使用Windows,对不起)。


1

http://www.irradiatedsoftware.com/twoup/index.html

我是通过Lifehacker找到的,对我来说非常有用。我使用的是专业版SizeUp,而不是免费的TwoUp,它非常完美。


您是说这解决了我提出的问题吗?您链接到的页面似乎没有提及任何内容。
dreeves,2009年

1
不,这根本无法解决问题。使用SizeUp可以更快地将窗口移至所需位置,但仍必须手动在每个窗口之间切换,并告诉SizeUp您要将每个窗口移至何处。
罗里·奥肯

1

我是Windows用户,一直在寻找如何关闭Windows 7的新功能,以将所有窗口从未插入的外接显示器上移开。我发现收据(用于ATI视频卡)将注册表中的所有DMMEnableDDCPolling值设置为0。如果监视器已关闭,它将禁用自动检查。现在,如果将显示器拔下并再次插入,则所有窗口都将保持在同一位置。

这是对我有帮助的答案:https : //superuser.com/questions/120983/how-to-disable-monitor-auto-detection-in-windows-7(Alex的回答)


1
这与Mac无关吗?

5
否。但是该问题也被标记为“窗口”(尽管OP可能是指程序窗口;)。无论如何,对于Windows,有几个方便的实用程序可以完成该任务。我个人使用了Basta的ZMover,效果很好。另一种选择是DeskSoft的WindowManager。但是这些当然不会帮助OSX用户。
Ville 2013年
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.