是什么决定了我的应用程序运行的显示器?

我用的是 Windows,而且我有两个显示器。

一些应用程序将 一直都是启动在我的主监视器,无论他们在哪里,当我关闭他们。

其他人将总是开始在 次要的监视器,无论他们在哪里,当我关闭他们。

是否有一个注册表设置隐藏在某个地方,我可以操作它来控制默认启动哪些监视器应用程序?

@ rp: 我有 Ultramon,我同意它是不可或缺的,微软应该买下它并把它融入他们的操作系统。但正如您所说,它不允许您控制程序启动到的默认监视器。

184935 次浏览

我很确定主监视器是默认的。如果应用程序编码得当,当它关闭时,它会记住它上一次在哪里,并在那里重新打开,但是——正如您所注意到的——它不是默认行为。

编辑: 我通常的做法是将位置存储在应用程序的设置中。在加载时,如果它们没有值,则默认为屏幕中心。关闭表单时,它记录其位置。那样的话,只要门一打开,就是最后一次打开的地方。我不知道一个简单的方法,告诉它启动到第二个显示器的第一次自动,但是。

—— Kevin Fairchild

不要让我这样做,但我很肯定,这取决于它自己的应用程序。我知道很多总是打开的主监视器,一些将重新打开到相同的监视器,他们以前运行,有些你可以设置。我知道例如,我有快捷方式打开命令窗口到特定的目录,每个都有一个选项在其属性的位置打开窗口的位置。而 Outlook 只能记住并打开它打开的最后一个屏幕。然后其他应用程序会在当前焦点所在的任何窗口中打开。

所以我不确定是否有一种方法可以告诉每个程序在哪里打开。希望这对你有所帮助。

正确编写的 Windows 应用程序,要保存他们的位置从运行到运行将保存结果的 GetWindowPlacement()之前关闭,然后使用启动 SetWindowPlacement()恢复他们的位置。

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

与其他方法相比,WINDOWPLACEMENT路由有许多优点:

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

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

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

对于非 Win32应用程序,重要的是要确保你用来保存/恢复窗口位置的方法最终使用相同的底层调用,否则(像 Java Swing 的 setBounds()/getBounds()问题) ,你最终会编写大量额外的代码来重新实现 WINDOWPLACEMENT函数中已经存在的功能。

我已经注意到,如果我把一个快捷方式在我的桌面上的一个屏幕上启动的应用程序可能会出现在该屏幕上(如果该应用程序不会重新定位自己)。

这也适用于从文件资源管理器运行的事情-如果资源管理器是在一个屏幕上启动的应用程序将选择该监视器使用。

同样-我认为这是当启动应用程序指定默认(窗口管理)的位置。大多数应用程序似乎以某种方式覆盖这种默认行为。

像这样创建一个简单的窗口可以做到这一点:

HWnd = CreateWindow (windowClass,windowTitle,WS _ VISIBLE | WS _ OVERLAPPEDWINDOW,CW _ USEDEFAULT,SW _ SHOW,CW _ USEDEFAULT,0,NULL,NULL,hInst,NULL) ;

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

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

要弄清楚这个显示器到底有多大,请查看 GetSystemMetrics。

这是我的发现。如果你想让一个应用程序默认打开在你的二级监视器上,做以下事情:

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。

所以我在 Adobe Reader 9.0上遇到了这个问题。不知怎么的,程序忘记打开我的右边显示器,并一直打开我的左边显示器。大多数程序允许你拖动它,最大化屏幕,然后关闭它,它就会记住。对于 Adobe,我必须在最大化之前把它拖过来,然后关闭,这样 Windows 才能记住下次打开它的是哪个屏幕。一旦你把它设置到正确的显示器上,你就可以最大化它了。我认为这是愚蠢的,因为几乎所有的 Windows 程序都会自动记住它,而不会试图为 XP 设置一种记住它的方法。

所以我同意有一些应用程序,你可以通过最大化或右键点击和移动/调整屏幕,然后关闭和重新打开一个屏幕上配置打开。然而,还有一些只会在主屏幕上打开。

我已经解决的问题是: 把你喜欢的固定应用程序打开的显示器设置为显示器1,另一个显示器设置为显示器2,然后把你的显示器2设置为主屏幕,这样你的桌面设置和开始栏就保持不变了。希望这个能帮上忙。

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

右键单击快捷方式并选择属性。 确保你在“快捷方式”标签上。 选择“运行”下拉框并将其更改为“最大化”。

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