检测何时连接新显示器

时间:2012-08-16 08:15:00

标签: c# winforms

我正在编写一个需要两个显示器的应用程序:一个用于控制面板,另一个用于输出。我所拥有的是:如果只有一个显示,则应用程序会在其上显示两个表单,但如果有两个,则输出表单将转到另一个。 问题是这只会在应用程序启动时发生。换句话说,如果应用程序在连接第二个显示器之前已经运行,则除非用户手动将输出发送到新显示器(假设他们知道如何操作),否则不会发生任何事情。 我想要的是,当连接新显示器时,即使应用程序运行,输出表单也会自动发送给它。我认为这与在线程中轮询端口有关,但我不知道该怎么做。任何人都可以帮忙解决这个问题吗?如果有更好的解决方案,我很乐意欢迎它。

(我本来会提供部分代码,但我是通过手机输入的)

3 个答案:

答案 0 :(得分:8)

看这里:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx

有一个例子可以帮助你。尝试这样的事情:

protected override void WndProc(ref Message m) 
    {
        const uint WM_DISPLAYCHANGE = 0x007e;

        // Listen for operating system messages. 
        switch (m.Msg)
        {
            case WM_DISPLAYCHANGE:

                // The WParam value is the new bit depth
                uint width = (uint)(m.LParam & 0xffff);
                uint height = (uint)(m.LParam >> 16);
                break;                
        }
        base.WndProc(ref m);
    }

答案 1 :(得分:0)

您可以添加一个计时器来检查,例如如果屏幕数量超过一个,则每2秒钟。代码可能如下所示:

timer_tick()
{
    if(Screen.AllScreens.Length >= 2)
    {
        //run code to use the second screen
    }
}

对于C#中的初学者来说很容易使用。

答案 2 :(得分:0)

您可以使用WndProcScreen.AllScreens.Length

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
    protected override void WndProc(ref Message m)
    {
        if (Screen.AllScreens.Length > 1) //example
        {


        }
        base.WndProc(ref m);
    }

更多信息: