如何防止应用程序在未使用(已关闭)的显示器上打开?

如何防止应用程序在未使用(已关闭)的显示器上打开?

我有一个应用程序(精细节拍器),它总是想在未使用的显示器(3/3)上打开(我大部分时间都将其关闭)。

此外,标准移动方法不起作用(alt + 右键单击​​或 windows + 箭头)。

有人有一种好方法可以强制应用程序使用唯一打开的显示器,或者有一种实用程序可以将应用程序移动到打开的显示器吗?

答案1

从网络上的其他答案中复制了这些内容并将它们编译在这里以方便您访问(添加了一些内容以方便阅读):

  1. 打开应用程序。
  2. 重新调整窗口大小,使其不最大化或最小化。
  3. 将窗口移动到您希望其默认打开的显示器。
  4. 关闭应用程序。关闭前请勿调整大小。
  5. 打开应用程序。它应该在你刚刚移动并关闭它的显示器上打开。
  6. 最大化窗口。

其之所以有效有两个原因。

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

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

与其他方法相比,它WINDOWPLACEMENTroute有许多优点:

处理自上次运行以来屏幕分辨率发生变化的情况:SetWindowPlacement() 将自动确保窗口不会完全超出屏幕保存状态(最小化/最大化),但也保存恢复的(正常)大小和位置正确处理桌面指标,补偿任务栏位置等。(即使用“工作区坐标”而不是“屏幕坐标” - 依赖于保存屏幕坐标的技术可能会受到“移动窗口”问题的影响,如果用户的工具栏位于屏幕顶部,则窗口每次都会出现一点低的位置)。最后,正确处理窗口恢复的程序将考虑从 shell 传入的 nCmdShow 参数。此参数在启动应用程序的快捷方式中设置(正常、最小化、最大化):

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

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

或者,您也可以使用其他应用程序,例如:http://realtimesoft.com/ultramon/

或者简单地使用 Shift + Win + [左、右] 箭头键快捷键将应用程序从一个显示器移动到另一个显示器。您可以使用它将当前活动窗口移动到另一个显示器。

我希望这些答案对你有帮助。

参考: 使用多台显示器时,如何使应用程序在正确的显示器上打开? https://stackoverflow.com/questions/52755/what-determines-the-monitor-my-app-runs-on http://www.tenforums.com/general-support/14348-forcing-program-open-second-monitor-rather-than-main.html

答案2

快捷键 Win+ Shift+Left arrowWin++ 将把活动窗口移动到左侧或右侧监视器(实际上是下一个或上一个监视器)ShiftRight arrow


另一种可能性是使用免费自动热键。它将桌面视为一个空间,其中所有显示器按顺序连接在一起。这让您可以轻松地在显示器之间移动窗口。

以下示例脚本将触发按键,F9将标题部分指定的窗口向左移动 1080 像素,假设关闭的显示器宽度为 1080 像素,因此将其放置在前一个显示器上。

SetTitleMatchMode, 2
F9::WinMove, RSA, , -1080

安装 AutoHotKey 后,将上述文本放入一个.ahk文件中并双击进行测试。您可以通过右键单击托盘栏中的绿色 H 图标并选择退出来停止脚本。要让它在登录时运行,请将其放在 的启动组中 C:\Users\USER-NAME\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

有用的 AutoHotkey 文档:

相关内容