我使用的是 Windows,我有两台显示器。
某些应用程序将始终在我的主监视器上启动,无论我关闭它们时它们在哪里。
其他人将始终在辅助监视器上启动,无论我关闭它们时他们在哪里。
是否有隐藏在某处的注册表设置,我可以操纵它来控制默认情况下启动哪些监视器应用程序?
@rp:我有 Ultramon,我同意它是不可或缺的,以至于微软应该购买它并将其整合到他们的操作系统中。但是正如您所说,它不允许您控制程序启动的默认监视器。
我使用的是 Windows,我有两台显示器。
某些应用程序将始终在我的主监视器上启动,无论我关闭它们时它们在哪里。
其他人将始终在辅助监视器上启动,无论我关闭它们时他们在哪里。
是否有隐藏在某处的注册表设置,我可以操纵它来控制默认情况下启动哪些监视器应用程序?
@rp:我有 Ultramon,我同意它是不可或缺的,以至于微软应该购买它并将其整合到他们的操作系统中。但是正如您所说,它不允许您控制程序启动的默认监视器。
这是我发现的。如果您希望应用程序默认在辅助显示器上打开,请执行以下操作:
1. Open the application.
2. Re-size the window so that it is not maximized or minimized.
3. Move the window to the monitor you want it to open on by default.
4. Close the application. Do not re-size prior to closing.
5. Open the application.
It should open on the monitor you just moved it to and closed it on.
6. Maximize the window.
默认情况下,该应用程序现在将在此监视器上打开。如果要将其更改为另一台显示器,只需再次执行步骤 1-6。
正确编写的 Windows 应用程序想要保存其位置从运行到运行将保存GetWindowPlacement()
关闭前的结果,然后SetWindowPlacement()
在启动时使用以恢复其位置。
通常,应用程序会将结果存储GetWindowPlacement()
在注册表中REG_BINARY
以方便使用。
与其他方法相比,该WINDOWPLACEMENT
路线具有许多优点:
SetWindowPlacement()
将自动确保窗口不完全脱离屏幕最后,正确处理窗口恢复的程序将考虑nCmdShow
从 shell 传入的参数。此参数在启动应用程序的快捷方式中设置(Normal、Minimized、Maximize):
if(nCmdShow != SW_SHOWNORMAL)
placement.showCmd = nCmdShow; //allow shortcut to override
对于非 Win32 应用程序,重要的是要确保您用于保存/恢复窗口位置的方法最终使用相同的底层调用,否则(如 Java Swing 的setBounds()
/getBounds()
问题)您最终将编写大量额外代码重新实现功能中已经存在的WINDOWPLACEMENT
功能。
获取 UltraMon。迅速地。
http://realtimesoft.com/ultramon/
它不允许您指定应用程序在哪个监视器上启动,但它允许您将应用程序移动到另一个监视器,并保持其纵横比不变,只需单击鼠标即可。这是一个非常方便的实用程序。
大多数程序将从您上次离开的地方开始。因此,如果您有两台显示器在工作,但家里只有一台,则可以在家中启动笔记本电脑,而看不到在另一台显示器上运行的应用程序(现在不存在)。UltrMon 还允许您快速轻松地将那些孤立的应用程序移回主屏幕。
Shift + Win + [left,right] arrow keys
这不完全是这个问题的答案,但我用捷径处理了这个问题。您可以使用它将当前活动窗口移动到另一个监视器。
我相当确定主显示器是默认的。如果应用程序编码得体,当它关闭时,它会记住它上次所在的位置并将在那里重新打开,但是 - 正如您所注意到的 - 这不是默认行为。
编辑:我通常这样做的方式是将位置存储在应用程序的设置中。加载时,如果它们没有值,则默认为屏幕中心。在关闭表格时,它会记录其位置。这样,每当它打开时,它就是最后一次打开的地方。但是,我不知道有一种简单的方法可以让它第一次自动启动到第二台显示器上。
——凯文·费尔柴尔德
重要提示:如果您记得应用程序的位置并关闭,然后在该位置重新启动,请记住,在您的应用程序关闭时,用户的监视器配置可能已更改。
例如,笔记本电脑用户经常更改他们的显示配置。对接时,可能会有第二台显示器在未对接时消失。如果用户关闭了在第二台监视器上运行的应用程序并在监视器断开连接时重新打开该应用程序,将窗口恢复到之前的坐标将使其完全脱离屏幕。
要弄清楚显示器到底有多大,请查看 GetSystemMetrics。
所以我在使用 Adobe Reader 9.0 时遇到了这个问题。不知何故,程序忘记在我的右显示器上打开,并且一直在我的左显示器上打开。大多数程序允许您将其拖过,最大化屏幕,然后将其关闭,它会记住。好吧,使用 Adobe,我必须将它拖过去然后关闭它,然后再将其最大化,以便 Windows 记住下次在哪个屏幕中打开它。将其设置为正确的显示器后,您就可以将其最大化。我认为这是愚蠢的,因为几乎所有的 Windows 程序都会自动记住它,而无需尝试为 XP 提供一种记住的方法。
所以我同意有些应用程序可以配置为通过最大化或右键单击和移动/调整屏幕大小在一个屏幕上打开,然后关闭并重新打开。但是,还有一些只能在主屏幕上打开。
我所做的解决方法是:将您喜欢打开顽固应用程序的显示器设置为显示器 1,将另一台显示器设置为 2,然后将显示器 2 更改为主显示器 - 这样您的桌面设置和开始栏就会保留。希望这可以帮助。
不要强迫我这样做,但我很确定这取决于它本身的应用程序。我知道很多总是在主显示器上打开,有些会重新打开到之前运行的同一台显示器,有些你可以设置。例如,我知道我有打开特定目录的命令窗口的快捷方式,并且每个快捷方式在其属性中都有一个用于打开窗口位置的选项。虽然 Outlook 只记住并在最后一个屏幕中打开它。然后是其他应用程序在当前焦点所在的任何窗口中打开。
所以我不确定有没有办法告诉每个程序在哪里打开。希望对一些人有所帮助。
我注意到,如果我在一个屏幕上的桌面上放置一个快捷方式,则启动的应用程序可能会出现在该屏幕上(如果该应用程序没有自行重新定位)。
这也适用于从 Windows 资源管理器运行的东西——如果资源管理器在一个屏幕上,启动的应用程序将选择要使用的监视器。
再次 - 我认为这是启动应用程序指定默认(Windows 管理)位置的时候。大多数应用程序似乎以某种方式覆盖了这种默认行为。
像这样创建的一个简单窗口将执行此操作:
hWnd = CreateWindow(windowClass, windowTitle, WS_VISIBLE | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, SW_SHOW, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL);
右键单击快捷方式并选择属性。确保您位于“快捷方式”选项卡上。选择运行下拉框并将其更改为最大化。
这可能有助于在主监视器上全屏启动程序。