【问题标题】:Simulate fullscreen模拟全屏
【发布时间】:2009-12-08 08:14:43
【问题描述】:

我见过一个通过删除标题栏和窗口边框来模拟全屏应用程序的应用程序。我做了一些研究,发现了 getWindowLongPtr() 。

现在我的问题是:如何找到和识别应用程序并获得适当的窗口句柄?如何区分应用程序的多个实例(从磁盘上的不同位置运行)?


只是为了让“模拟”更精确。如果您让应用程序全屏显示并单击不同的监视器,它会自行最小化。如果应用程序在一个窗口中运行并且您单击不同的监视器,则该窗口不会更改。如果您移除窗口的边框并将其放置在左侧或右侧显示器上,您仍然可以在不最小化应用程序的情况下使用其他显示器。看起来应用程序仍然在其中一台显示器上全屏运行。


例如:您可以将 Eve (www.eveonline.com) 设置为全屏和窗口模式。在全屏模式下,如果没有 Eve 将自身最小化,您将无法单击第二个显示器。在窗口模式下可以。有像 evemover 这样的工具可以让你在一台显示器上设置你的窗口,看起来像全屏,但处于窗口模式。这就是我想要归档的。 Evemover 实际上提供了它的一些源代码,这就是为什么我知道删除边框和设置位置是使用带有 setWindowLongPtr 和 setWindowPos 的 Win32-API 完成的。

【问题讨论】:

  • 模拟是什么意思?制作全屏win32应用程序的方法是创建无边框的窗口,没有标题栏,并使屏幕全屏。
  • 还有另一种方法 - 初始化 DirectX 时选择全屏作为选项
  • 你能举个例子吗?你在看类似游戏的行为吗?或者(由于缺乏更好的描述),类似 Macintosh 的行为(可以轻松消除的全屏覆盖)。是否会大量使用最小化失去焦点?
  • (编辑到上面)它会困住鼠标吗?

标签: c++ winapi


【解决方案1】:

许多应用程序使用“全屏”一词的不同且令人困惑的应用程序。

一个简单的全屏应用程序 - 占据全屏区域。 DirectX 应用程序可以请求全屏独占模式。这种模式对 DirectX 应用程序的优势在于,通过独占访问(全)屏幕,它们可以更改分辨率、位深度等,以及访问垂直同步同步硬件缓冲,其中屏幕表面被“翻转” ' 显示间隔之间,以免发生“撕裂”。

无论如何,Windows 桌面理解“全屏窗口” - 占据显示器整个区域并且没有非客户端元素的窗口。当创建这样的窗口时,桌面小工具和任务栏之类的东西会自动隐藏起来。现代游戏已将这种模式称为“全屏窗口”。

回到您的问题:“FindWindow”是用于发现其他应用程序窗口的 API。获取创建窗口的应用程序的路径要困难得多。 GetWindowThreadProcessId 可以为您获取拥有进程的进程 ID。 OpenProcess 将为您提供一个句柄,您可以将其传递给 QueryFullProcessImageName(在 Vista 及更高版本上实现)以获取该进程的完整路径。

【讨论】:

    【解决方案2】:

    我认为您指的是诸如窗口聚合器之类的应用程序,它们“插入”到系统并从应用程序外部进行操作。

    查看免费软件应用程序 PuttyCM 的代码(用于将 Putty (SSH) 外壳窗口聚合为选项卡)。 IIRC,它确保传递给应用程序的窗口指针已经设置了标志。

    在从不同地方运行的应用程序上,您可能需要某种方式来识别它 - 注册表项/安装日志等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      相关资源
      最近更新 更多