【问题标题】:Show presentation timer on only one of two cloned displays仅在两个克隆显示器之一上显示演示计时器
【发布时间】:2012-01-21 11:49:26
【问题描述】:

如果显示器被克隆,是否可以仅在一个显示器上显示应用程序?我的目标是开发一个计时器,它会在演示期间显示在笔记本电脑的显示屏上,而不是投影仪上。

我正在寻找类似 Windows 的“识别显示器”功能,它在不同的显示器上显示数字 1 和 2,即使在克隆模式下也是如此。

谢谢

编辑

我发现了possible duplicate 这个问题。在这种情况下,接受的答案是使用Screens.AllScreens 来发现屏幕数量。就我而言,这还不够。对已接受答案的评论链接到关于 directly painting on the desktop 的线程。我使用以下代码进行了尝试,但文本出现在两个显示器上。获取输入的Hdc的代码来自一篇关于screen captures的文章。我不确定为其他参数设置什么(它们在文章中是 IntPtr.Zero)

[DllImport("gdi32.dll")]
static extern IntPtr CreateDC(IntPtr lpszDriver, string lpszDevice, IntPtr lpszOutput, IntPtr lpszInitData);

[DllImport("gdi32.dll")]
static extern IntPtr DeleteDC(IntPtr hdc);

private void PaintOnDesktop(string stringToPrint, Font font, Brush brush, PointF position) {
    string deviceName = Screen.AllScreens[0].DeviceName;
    IntPtr targetHdc = CreateDC(IntPtr.Zero, deviceName, IntPtr.Zero, IntPtr.Zero);
    using (Graphics g = Graphics.FromHdc(targetHdc)) {
        g.DrawString(stringToPrint, font, brush, position);
    }
    DeleteDC(targetHdc);
}

编辑 2

显然在C#中没有办法做到这一点,所以我将C#标签更改为设备驱动程序。

【问题讨论】:

  • 我怀疑在用户模式下绝对没有办法做到这一点。即使有可能,您也必须破解显示驱动程序。我认为无论如何违反用户的配置都是一个坏主意。也许您真正想要的是暂时切换到非克隆模式然后再返回?
  • 感谢您的回复。我认为在克隆模式和非克隆模式之间来回切换是不可能的。我想在我的笔记本电脑屏幕上设置一个每秒更新一次的计时器。我认为这会导致极度闪烁。知道如何直接使用驱动程序吗?没有必要将整个应用程序打印到其中一个显示器上。打印文本也可以。
  • 我知道你在追求什么。将其克隆出来确实很有意义。希望您能找到一种方法来做到这一点,但要为 B 计划做好准备。(不,我不知道如何使用自定义显示驱动程序来做到这一点)

标签: device-driver presentation multiple-monitors


【解决方案1】:

实现此效果的唯一方法是“手动”“克隆”屏幕,即不使用驱动程序的此功能,这当然会导致一些延迟。 UltraMon 有这样的功能,专为不支持多显示器克隆的显卡或操作系统而设计。它基本上是通过快速截取桌面并将其显示在另一个(扩展)监视器上的表单上来完成的。

导致的延迟仅出现在其中一台显示器上,因此,如果这是用于演示的情况,我建议将“您的”显示器(可能是您笔记本电脑上的主要显示器)设置为延迟的接收者,所以观众看不到。然后,您当然可以在任一屏幕上绘制一个计时器表单。

【讨论】:

  • 感谢您的回答。我仍然希望有人可以添加一些有关如何通过驱动程序实现此目的的信息。在我看来,这将是一个更清洁的选择。我认为这应该是可能的,因为 Windows 对话框可以做到这一点。也许我应该删除 c# 标签?
猜你喜欢
  • 1970-01-01
  • 2016-08-29
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
相关资源
最近更新 更多