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

我使用的是Windows,而我有两台显示器。

有些应用程序将始终在我的主监视器上启动,无论我何时closures它们。

其他人总是从辅助监视器上开始,不pipe他们在什么时候closures它们。

有没有一个registry设置的地方,我可以操纵来控制哪些监视器应用程序默认启动?

@rp:我有Ultramon,我同意微软应该买它并把它整合到他们的操作系统中是不可或缺的。 但正如你所说,它不会让你控制程序启动的默认监视器。

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

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

WINDOWPLACEMENT路线比其他方法有许多优点:

  • 处理屏幕分辨率自上次运行以来更改的情况: SetWindowPlacement()将自动确保窗口不完全在屏幕外
  • 保存状态(最小化/最大化),但也保存恢复(正常)的大小和位置
  • 正确处理桌面指标,补偿任务栏位置等(即使用“工作空间坐标”而不是“屏幕坐标” – 依靠保存屏幕坐标的技术可能遭受总是出现窗口的“行走窗口”问题如果用户在屏幕顶部有一个工具栏,则每次稍微降低一点)。

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

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

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

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

 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进行操作。

得到UltraMon。 很快。

http://realtimesoft.com/ultramon/

它不会让你指定一个应用程序启动的监视器,但它可以让你移动应用程序到另一个监视器,并保持其纵横比完好无损,只需点击一下鼠标。 这是一个非常方便的工具。

大多数节目将在你最后离开的地方开始。 所以,如果你有两台显示器在工作,但只有一个在家里,你可以在家里启动你的笔记本电脑,而不会看到其他显示器上运行的应用程序(现在不在那里)。 UltrMon还可以让您快速轻松地将这些孤儿应用程序移回主屏幕。

这不完全是这个问题的答案,但我用Shift + Win + [left,right] arrow keys快捷方式处理这个问题。 您可以将当前活动窗口移动到另一台显示器。

我相当确定主监视器是默认的。 如果应用程序编码体面,当它closures,它会记住它在哪里,并将在那里重新打开,但正如你已经注意到 – 这不是一个默认行为。

编辑:我通常这样做的方式是有位置存储在应用程序的设置。 加载时,如果没有值,则默认为屏幕中心。 在表格结束时,它logging下它的位置。 这样,每当它打开,它就是最后一个地方。 但是,我不知道一个简单的方法来告诉它第一次自动启动到第二台显示器上。

– 凯文·仙童

重要说明:如果您记得应用程序的位置并关机,然后在该位置重新启动,请记住在closures应用程序时用户的显示器configuration可能已更改。

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

为了弄清楚显示器有多大,请查看GetSystemMetrics。

所以我有这个问题与Adobe Reader 9.0。 不知怎的,程序忘了打开我的右边的显示器,并一直打开我的左侧显示器。 大多数程序允许你拖动它,最大化屏幕,然后closures它,它会记住。 那么,在使用Adobe之前,我必须拖动它,然后在最大化之前将其closures,以使Windows记住下次打开哪个屏幕。 一旦你把它设置到正确的显示器,那么你可以最大化它。 我认为这很愚蠢,因为几乎所有的Windows程序都会自动记住它,而不会尝试为XP记住方法。

所以我同意有一些应用程序可以configuration为通过最大化或右键单击并移动/resize屏幕在一个屏幕上打开,然后closures并重新打开。 但是,也有其他人只能在主屏幕上打开。

我已经做了解决:设置显示器你喜欢固执的应用程序打开,作为显示器1和您的其他显示器为2,然后更改您的显示器2是主要的 – 所以您的桌面设置和开始栏保持不变。 希望这可以帮助。

不要抱着我,但我很确定这取决于它自己的应用程序。 我知道许多人总是在主显示器上打开,有些会重新打开他们以前运行的显示器,有些可以设置。 我知道例如我有快捷方式打开命令窗口到特定的目录,每个都有一个属性选项来打开窗口的位置。而Outlook只是记得,并在最后一个屏幕打开它是打开英寸然后其他应用程序打开当前焦点所在的窗口。

所以我不确定是否有办法告诉每个程序在哪里打开。 希望有一些帮助。

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

这也适用于从Windows资源pipe理器运行的东西 – 如果资源pipe理器在一个屏幕上,启动的应用程序将select该监视器使用。

再次 – 我认为这是当启动应用程序指定默认(Windowspipe理)的位置。 大多数应用程序似乎以某种方式覆盖了这个默认行为。

一个像这样创build的简单的窗口将这样做:

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

右键单击该快捷方式并select属性。 确保您在“快捷方式”选项卡上。 select运行下拉框并将其更改为最大化。

这可能有助于在主显示器上以全屏模式启动程序。