2009-12-08 51 views
1

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

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


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


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

+1

你是怎么意思模拟它的?制作全屏win32应用程序的方法是创建窗口无边框,没有标题栏并使屏幕变大。 – Toad 2009-12-08 08:42:06

+1

还有另一种方法 - 初始化DirectX时选择全屏作为选项 – 2009-12-08 12:13:40

+0

您可以给出一个示例上下文吗?你在寻找类似游戏的行为吗?或者(因为没有更好的描述),一个Macintosh暴露的行为(全屏覆盖,可以轻松解散)。最小化丢失焦点会被严重使用吗? – Fox 2009-12-08 13:48:11

回答

2

许多应用程序使用的短语分歧和混乱的应用“全屏”。

简单的全屏应用程序 - 占据全屏幕区域。 DirectX应用程序可以请求全屏独占模式。这种模式对DirectX应用程序的优点是,可以独占访问(全屏)屏幕,然后允许更改分辨率,位深度等,以及获得垂直同步同步硬件缓冲的访问权限,其中屏幕表面翻转'之间的显示间隔,以便'撕'不会发生。

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

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

0

我想你是指像窗口聚合器这样的应用程序,它可以“插入”系统并从应用程序之外进行操作。

查看免费软件应用程序PuttyCM的代码(用于将Putty(SSH)shell窗口聚合为标签)。 IIRC,它确保传递给应用程序的窗口指针具有已设置的标志。

从不同的地方运行的应用程序,你可能需要确定它的一些方法 - 注册表项/安装日志等