c# - 是否可以在 Windows 上使用 .NET 完全接管多个屏幕中的一个屏幕?

标签 c# .net directx

对于在 Windows XP/Vista/7/8 上运行的 .NET(任何版本)——是否可以为全屏应用程序保留一个屏幕并在其上显示数据/图形/任何内容,同时保持任何其他屏幕可供使用Windows UI 用户交互,例如桌面或其他应用程序?

这里的使用场景/规则如下:

  1. PC 必须能够按原样运行所有程序。

  2. .NET 内容不需要交互(即不需要按键、鼠标点击等)。

  3. 其他应用程序的其他 UI 或对话框无法穿透为显示 .NET 可执行文件的输出而保留的一个预定义屏幕。

  4. 具有 .NET 内容的预定义屏幕不得有可见的鼠标光标,并且其他屏幕必须有其光标边界,就好像根本没有额外的屏幕一样(即光标必须停在鼠标光标的边缘)一个或多个桌面)。

  5. 即使 PC 已锁定(即用户已登录但工作站已从 Explorer 锁定),内容也必须可见。

我知道我可以使用一些驱动辅助显示器或其他显示设备的外部 USB Controller 来实现这一点,然后手动构建要推送到该界面的内容/图形,但我想问我可以使用普通 WDDM 来实现吗带普通显示器的驱动程序?

编辑:为了进一步澄清 - 我知道有多种方法可以达到类似的结果,但这里的问题是是否可以遵守所有规范/规则以上。

最佳答案

在我看来,您正在设计一个纯粹用于输出(即显示图形/图表、视频等)的 .NET 应用程序。该应用程序必须有一个专用的监视器,并且没有其他应用程序(甚至光标应该能够进入监视器的边界)。

我的直觉是,虽然您可以将您的应用程序强制到特定监视器(XBMC 具有此功能),但我怀疑您是否可以阻止所有其他应用程序进入监视器的显示区域。

当我读到这个问题时,我脑子里突然闪过一些东西,我想“也许你想要类似于 cpu affinity 的东西,你可以在 Windows 中设置它,并强制你的应用程序只使用特定的 cpu 核心......也许有显示器/显示区域有类似的东西吗?”

果然,Windows 提供了这些功能:

http://msdn.microsoft.com/en-gb/library/windows/desktop/dd375340(v=vs.85).aspx

http://msdn.microsoft.com/en-gb/library/windows/desktop/dd375338(v=vs.85).aspx

你应该能够毫不费力地调用这些。但是,这只会解决您只能强制您的应用程序使用特定监视器的问题。至于系统中的所有其他应用程序,我怀疑您是否能够轻松控制它们的显示亲和性。

粗略地猜测,您需要使用另一个 Win32 API 调用来获取对系统中所有窗口句柄的引用,并检查它们的显示亲和性,如果它们显示在您的专用显示器中,则将它们移动到其他地方。

这可能有助于获取所有窗口句柄:

How to get list or enumerate all handles of unmanaged windows with same class and name

http://msdn.microsoft.com/en-us/library/ms633497%28VS.85%29.aspx

只是想我会把它放在那里,它可能没有帮助,但希望这能给你更多的指导。

编辑:我也发现了这个……可能会有一些用处

Reserve screen area in Windows 7

关于c# - 是否可以在 Windows 上使用 .NET 完全接管多个屏幕中的一个屏幕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14860723/

相关文章:

c# - 如何在 C# 中最小化/恢复窗口

c# - WPF 应用程序无法在某些 PC 上运行

c# - 屏幕截图的屏幕覆盖

c# - 并行任务与委托(delegate)

c# - 选择最后一个 XML 节点

c++ - 没有 ->Release() 的 DirectX

python - 如何使用pywinauto模拟游戏中的按键

c# - .NET 标准库能否以某种方式使用支持 .NET Framework 4.6.1 的 nuget 包

.net - 堆栈溢出时的编辑控制

c++ - 在不将前缓冲区复制回系统内存的情况下计算 gpu 前缓冲区中像素的平均值