winforms 连接新显示器时进行检测

f45qwnt8  于 2023-06-30  发布在  其他
关注(0)|答案(3)|浏览(114)

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

iqjalb3h

iqjalb3h1#

看这里:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx
有一个例子可以帮助你。试试这样的东西:

public class MyForm : System.Windows.Forms.Form
{
    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);
    }
}
2cmtqfgy

2cmtqfgy2#

可以使用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);
    }
uqcuzwp8

uqcuzwp83#

您可以包括一个计时器,用于检查例如如果屏幕数量多于一个,则每2秒显示一次。代码可能如下所示:

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

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

相关问题