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

时间:2013-02-13 18:45:34

标签: c# .net directx

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

此处的使用方案/规则如下:

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

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

  3. 其他应用程序中没有其他UI或对话框可以穿透保留用于显示.NET可执行文件输出的预定义屏幕。

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

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

  6. 我知道我可以通过一些驱动辅助显示器或其他显示设备的外部USB控制器来实现这一点,然后手动构建要推送到此接口的内容/图形但我要求我可以使用正常的WDDM执行此操作司机带普通显示器吗?

    修改:为了进一步说明 - 我了解有多种方法可以达到类似的结果,但这里的问题是可以遵守规范/规则的所有上方。

4 个答案:

答案 0 :(得分:4)

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

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

当我读到这个问题时,我的脑子里点了点什么,我想“也许你想要类似于cpu亲和力的东西,你可以在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

答案 1 :(得分:4)

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

  2.   
  3. .NET内容不需要交互性(即没有按键,鼠标点击等)。

  4.   
  5. 其他应用程序中没有其他UI或对话框可以穿透保留用于显示.NET可执行文件输出的预定义屏幕。

  6.   

实现这一目标的一种方法是创建一个停靠窗口(AppBar)。这将具有与Google桌面等任务栏或桌面基座类似的功能。

这两篇文章可能有所帮助:
CodeProject: AppBar using C#
CodeProject: Creating an application like Google Desktop in WPF and C#

解决#3的另一种方法是使用PInvoke(甚至更好,Managed WinAPI)定期扫描计算机以查看打开的窗口。如果发现一个窗口是“非法侵入”,你只需勾住它并移开它。不是最好的方法,但无论如何它都有效。

  

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

将表单的cursor属性设置为空游标。这有效地移除了鼠标光标 停止光标访问屏幕的这一部分是非常棘手的。我最好的选择是使用Global Mouse Hooks来监听光标移动并阻止光标移动到窗口占用的区域。这显然会使表单的cursor属性设置无效,因为光标永远不会在表单上。

  

5。即使PC被锁定(即用户已登录但工作站已从资源管理器锁定),内容也必须可见

我不知道有什么方法可以实现创建锁屏应用程序的缺点,因为标准的Windows行为是关闭除主要应用程序之外的所有显示器。

修改
您可以使用psexec.exe -x在锁定屏幕上显示一个窗口。 PSEXEC是SysInternals套件的一部分,可从http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx下载。

如果您打算这样(在锁定屏幕上显示您的表单),您需要一种方法来确定用户会话何时被锁定,以便您调整表单大小并将其移开。否则,您必须找到一种从应用程序解锁会话的方法。

您可能还想查看此问题How to display UI on logon screen in Windows 7,了解实施锁屏应用的其他方法。

答案 2 :(得分:1)

我正在研究的一个WPF项目已经将所有内容添加到继承自System.Windows.Window的“主容器”中,该系统在启动时根据用户首选项设置为所有可用屏幕,一个窗口,或单个全屏。然后,该控件根据偏好设置自己,如下所示:

    private void SpanAllMonitors()
    {
        WindowStyle = WindowStyle.None;
        ResizeMode = ResizeMode.NoResize;
        Width = SystemParameters.VirtualScreenWidth;
        Height = SystemParameters.VirtualScreenHeight;
        Left = SystemParameters.VirtualScreenLeft;
        Top = SystemParameters.VirtualScreenTop;
    }

    private void SingleScreen()
    {
        WindowStyle = WindowStyle.None;
        ResizeMode = ResizeMode.NoResize;
        Width = SystemParameters.PrimaryScreenWidth;
        Height = SystemParameters.PrimaryScreenHeight;
        // this will take over the 'primary' monitor, additional math
        // should allow you to place it on a secondary or other monitor
        Left = 0;
        Top = 0;
    }

答案 3 :(得分:0)

选择的方法符合所有设计规则......等待它......虚拟化。但是它不符合仅使用.NET可执行文件的要求(入侵WDDM)。

原始PC是虚拟主机,有两位客人。一个用于.NET应用程序,另一个用于最终用户,其中分配了适当的USB等。这种方法自然有很多警告:

  • WDDM没有以任何方式利用,并且可能存在性能问题。对于休闲办公室应用而言,这根本不是问题。
  • 除非使用Hyper-V,否则虚拟化软件始终是第三方。
  • Hyper-V中的Hyper-V是不可能的,因此访客无法进一步虚拟化(至少没有任何合理的速度,因为它将在没有虚拟机管理程序的情况下运行)。
  • 在某些情况下,需要为任何软件提供多个许可证。
  • 两位来宾之间的.NET可执行文件和其他应用程序之间没有IPC或其他交互。

然而,解决方案本身可以完美地工作 - 只要底层主机通电并且不会自行崩溃,用户绝不会覆盖或与附加屏幕上显示的内容进行交互。锁定最终用户PC对其他访客没有影响,等等。