在Windows XP / Vista / 7/8上运行.NET(任何版本) - 是否可以为全屏应用程序保留一个屏幕并显示数据/图形/任何内容,同时保留其他任何屏幕Windows UI用户交互,例如桌面或其他应用程序?
此处的使用方案/规则如下:
PC必须能够按原样运行所有程序。
.NET内容不需要交互性(即没有按键,鼠标点击等)。
其他应用程序中没有其他UI或对话框可以穿透保留用于显示.NET可执行文件输出的预定义屏幕。
具有.NET内容的预定义屏幕必须没有可见的鼠标光标,其他屏幕必须具有光标边界,就好像根本没有额外的屏幕(即光标必须停在一个或多个桌面。)
即使PC被锁定(即用户已登录但工作站已从资源管理器锁定),内容也必须可见。
我知道我可以通过一些驱动辅助显示器或其他显示设备的外部USB控制器来实现这一点,然后手动构建要推送到此接口的内容/图形但我要求我可以使用正常的WDDM执行此操作司机带普通显示器吗?
修改:为了进一步说明 - 我了解有多种方法可以达到类似的结果,但这里的问题是可以遵守规范/规则的所有上方。
答案 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
以为我会把它丢在那里,它可能没有帮助,但希望这应该给你一些方向。
编辑:我也发现了这个......可能有些用处
答案 1 :(得分:4)
PC必须能够按原样运行所有程序。
.NET内容不需要交互性(即没有按键,鼠标点击等)。
- 醇>
其他应用程序中没有其他UI或对话框可以穿透保留用于显示.NET可执行文件输出的预定义屏幕。
实现这一目标的一种方法是创建一个停靠窗口(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等。这种方法自然有很多警告:
然而,解决方案本身可以完美地工作 - 只要底层主机通电并且不会自行崩溃,用户绝不会覆盖或与附加屏幕上显示的内容进行交互。锁定最终用户PC对其他访客没有影响,等等。