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

时间:2020-03-05 18:50:18  来源:igfitidea点击:

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

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

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

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

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

解决方案

回答

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

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

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

回答

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

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

回答

获取UltraMon。迅速地。

http://realtimesoft.com/ultramon/

它不能让我们指定启动应用程序的监视器,但是可以让我们将应用程序移动到另一台监视器,并只需单击一下鼠标即可保持其纵横比不变。这是一个非常方便的实用程序。

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

回答

编写正确的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"功能中已经存在的功能。

回答

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

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

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

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

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记住一种方法。