什么决定了我的应用程序运行的监视器?


78

我正在使用Windows,并且有两个监视器。

某些应用程序将始终在我的主监视器上启动,无论它们在关闭时处于何处。

其他人将始终在辅助监视器上启动,无论我关闭它们时在哪里。

是否有某个注册表设置隐藏在某个地方,我可以操纵该注册表设置来控制默认情况下启动到哪个监视器应用程序?

@rp:我有Ultramon,并且我同意它是必不可少的,以至于Microsoft应该购买它并将其整合到他们的OS中。但是正如您所说,它不能让您控制程序启动时所使用的默认监视器。


2
Ultramon是必备工具。我已经使用多年了。
2012年

这个高流量的问题开始看起来像是Ultramon的广告。DisplayFusion也应该被提及。我与公司无关,只是喜欢产品对我的作用。第三个知名的是“ Actual Multiple Monitors”
zx81 2015年

1
@ zx81:值得注意的是,当我在08年写这篇文章时,我有Windows XP。UltraMon当时很有用,但是我不能在较新版本的Windows中使用它。
JosephStyons 2015年

Answers:


45

编写正确的Windows应用程序要在运行之间保存其位置,将保存GetWindowPlacement()关机前的结果,然后SetWindowPlacement()在启动时使用以恢复其位置。

通常,应用程序会将的结果存储GetWindowPlacement()在注册表中,REG_BINARY以方便使用。

WINDOWPLACEMENT与其他方法相比,该路线具有许多优势:

  • 处理自上次运行以来屏幕分辨率发生变化的情况:SetWindowPlacement()将自动确保窗口不完全脱离屏幕
  • 保存状态(最小化/最大化),但也保存恢复的(正常)大小和位置
  • 正确处理桌面指标,补偿任务栏位置等。(例如,使用“工作区坐标”而不是“屏幕坐标”-依赖保存屏幕坐标的技术可能会遇到“行走窗口”问题,即始终出现窗口)如果用户在屏幕顶部有一个工具栏,则每次降低一点)。

最后,正确处理窗口还原的程序将考虑nCmdShow从shell传入的参数。在启动应用程序的快捷方式(正常,最小化,最大化)中设置此参数:

if(nCmdShow != SW_SHOWNORMAL)
    placement.showCmd = nCmdShow; //allow shortcut to override

对于非Win32应用程序,重要的是要确保用于保存/还原窗口位置的方法最终使用相同的基础调用,否则(如Java Swing的setBounds()/getBounds()问题),您将最终编写很多额外的代码重新实现功能中已经存在的WINDOWPLACEMENT功能。


感谢您的好答案。如果需要,至少可以使用此信息手动设置一些程序以在特定位置启动。
JosephStyons

还应注意,SetWindowPlacement()应该检查该位置是否确实存在。一种常见的情况是使笔记本电脑在连接到双显示器的同时进入睡眠状态,然后仅用一台笔记本电脑将其唤醒,在这种情况下,虚拟屏幕空间会大大减小。
JosephStyons 2015年

57

这就是我所发现的。如果您希望默认情况下在辅助监视器上打开应用程序,请执行以下操作:

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。


1
感谢这项工作。我想补充的一点是,如果该应用程序是由某个程序启动的,例如启动IE,则必须启动iexplore并遵循列出的TryingToHelp。有用。就我而言,我有一个任务计划程序,该程序以给定的url作为参数启动IE。调整任务计划程序启动的IE的大小并对其进行移动没有帮助。
yantaq 2014年

不幸的是,在Win7上不适用于我。第1-5步可以正常工作,如果我没有最大化执行该程序,则该程序(TeXstudio)在适当的监视器上启动。当我最大化然后关闭时,下一个开始将出现在另一个显示器上。
Maxim.K,2016年

我可以使它适用于某些应用程序,但是在Windows 10上,PowerShell总是在笔记本电脑屏幕上启动,而从不需要在其上启动的外接显示器上启动。
Nate

1
让我添加以下说明:就我而言,当我双击.PDF文件时,此操作无效。然后我发现,真正打开应用程序而不是双击关联文件会有所不同。在这种情况下,通过开始菜单打开Adobe Acrobat,然后执行您描述的步骤(即,将窗口移至所需的监视器,然后关闭它)就可以了。另外,在关闭应用程序窗口之前,请确保该应用程序窗口完全适合目标屏幕并且不会与第二台显示器重叠。
马特

1
这行不通。它需要该应用程序才能真正保存其设置和设置,而且许多应用程序的设计都不正确。非常烦人...但是生活的一部分。
AbstractDissonance

11

获取UltraMon。很快。

http://realtimesoft.com/ultramon/

它不能让您指定启动应用程序的监视器,但是可以让您将应用程序移动到另一台监视器,并通过单击鼠标保持其宽高比不变。这是一个非常方便的实用程序。

大多数程序将从您上次离开的位置开始。因此,如果您有两台显示器在工作,而在家中只有一台显示器,则可以在家中启动笔记本电脑,而看不到另一台显示器上正在运行的应用程序(现在不存在)。UltrMon还使您可以轻松快捷地将这些孤立的应用程序移回主屏幕。


我在家中和工作中使用UltraMon。真的,不知道人们如何生活。大声笑。使用“智能任务栏”时,有时可能会有些松软,但效果很好,而且通常足以让我坚持使用它。-凯文·费尔柴尔德
Kevin Fairchild)

真是个俗气的网站。是2009年的人!但是有趣的产品。感谢您的链接:)

我正处于这种情况下-一台笔记本电脑在工作时停靠了双显示器,但是我不在时只有一点点笔记本电脑屏幕。当应用程序加载到过去可见的区域时,这令人惊讶地令人沮丧-MS Outlook是最大的违规者之一。我会得到一份Ultramon的副本,希望它会使生活变得更轻松。谢谢!
SqlRyan

如果要提到软件,则应该在2015年将DisplayFusion列入清单。在“偏好设置/窗口查找”中,您可以指定应打开特定应用程序的位置。我喜欢该列表由当前打开的程序填充,因此您不必寻找它们。
zx81 2015年

要移动“捕获”在另一个屏幕上的应用程序,请在该应用程序聚焦时使用[win] + [箭头]。这将使应用程序在屏幕之间移动。当它出现时停止。适用于Win 7+
Ceekay '16

11

这并非完全是这个问题的答案,但我通过Shift + Win + [left,right] arrow keys捷径解决了这个问题。您可以将当前活动的窗口移动到另一个监视器。


这对我有用,但是没有Shift键,即Win + [left,right]-在使用一台显示器和缺少一个显示器的应用程序时为我提供了帮助!
Dazed

重要说明:如果使用此技术,则窗口将不保存当前窗口位置。为此,您必须至少用鼠标移动/调整窗口一次。
Tim Pohlmann

4

我相当确定主监视器是默认监视器。如果该应用程序的编码方式不错,则在关闭该应用程序时,它会记住该应用程序的最新位置,然后会在该位置重新打开,但是-您已经注意到-这不是默认行为。

编辑:我通常的方法是将位置存储在应用程序的设置中。加载时,如果没有任何值,则默认为屏幕中心。关闭表单后,它将记录其位置。这样,无论何时打开,它都在最后。但是,我不知道有一种简单的方法可以告诉它第一次自动在第二台监视器上启动。

-凯文·费尔柴尔德(Kevin Fairchild)


3

重要说明:如果您记住应用程序的位置并关闭,然后在该位置再次启动,请记住,在关闭应用程序时,用户的监视器配置可能已更改。

例如,笔记本电脑用户经常更改其显示配置。停靠时,可能会有第二个监视器,当停靠时会消失。如果用户关闭在第二个监视器上运行的应用程序,并且在断开监视器的连接时重新打开该应用程序,则将窗口还原到先前的坐标将使其完全不在屏幕上。

要弄清楚显示屏的实际尺寸,请查看GetSystemMetrics。


2

所以我在Adobe Reader 9.0中遇到了这个问题。程序以某种方式忘记在我的右显示器上打开,而一直在我的左显示器上打开。大多数程序允许您将其拖动,最大化屏幕,然后将其关闭,这样它就会记住。嗯,对于Adobe,我必须先将其拖动然后关闭,然后再最大化它,以便Windows记住下次要打开哪个屏幕。将其设置为正确的监视器后,即可将其最大化。我认为这很愚蠢,因为几乎所有Windows程序都会自动记住它,而无需尝试为XP记住一种方法。


并未真正回答问题,但帮助了我:)
DN

1

因此,我同意可以将某些应用程序配置为在一个屏幕上打开,方法是最大化或右键单击并移动/调整屏幕大小,然后关闭并重新打开。但是,还有其他一些只能在主屏幕上打开。

解决方法:将您喜欢打开顽固应用的显示器设置为显示器1,将其他显示器设置为2,然后将显示器2更改为主要显示器-这样便保留了桌面设置和开始栏。希望这可以帮助。


0

不要拘泥于此,但是我很确定这取决于它自身的应用程序。我知道有很多总是在主监视器上打开的,有些会重新打开到以前运行的监视器,有些则可以设置。例如,我知道我有打开命令窗口到特定目录的快捷方式,每个快捷方式都在其属性中提供了用于打开窗口的位置的选项。虽然Outlook只是记住并在上一个屏幕中打开了它,所以打开了其他应用程序在当前焦点所在的任何窗口中打开。

因此,我不确定是否有办法告诉每个程序在哪里打开。希望对您有所帮助。


0

我注意到,如果我在一个屏幕上的桌面上放置快捷方式,则启动的应用程序可能会出现在该屏幕上(如果该应用程序本身未重新定位)。

这也适用于从Windows资源管理器运行的东西-如果资源管理器在一个屏幕上,则启动的应用程序将选择要使用的监视器。

再次-我认为这是启动应用程序指定默认(Windows托管)位置时的情况。大多数应用程序似乎都以某种方式覆盖了此默认行为。

像这样创建的一个简单窗口将执行以下操作:

hWnd = CreateWindow(windowClass,windowTitle,WS_VISIBLE | WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,SW_SHOW,CW_USEDEFAULT,0,NULL,NULL,hInst,NULL);


-3

右键单击快捷方式,然后选择属性。确保您位于“快捷方式”选项卡上。选择“运行”下拉框,并将其更改为“最大化”。

这可能有助于在主监视器上全屏启动程序。


3
这实际上并不能回答问题,这是一个古老的问题。
Ajean 2014年
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.