c#接了两个显示器,怎么把第二个显示器扩展出来

bestlygg 2014-07-24 09:38:37

有没有系统可以调用的接口
...全文
1029 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
bossaiaboy 2015-07-14
  • 打赏
  • 举报
回复
楼主问题解决了吗?
道玄希言 2014-07-24
  • 打赏
  • 举报
回复
检测显示器设备………… 现在显卡基本都带了 HDMI 接口的吧 HDMI 接口是即插即用的, DVI 不是,这些情况都要考虑的。 我们做多屏是将多显示器设置为一主屏,其他为扩展显示。 程序界面用坐标定位…… 好像HDMI接口的显示器,插上去,直接就是扩展显示了……
save4me 2014-07-24
  • 打赏
  • 举报
回复
需要现成开源项目和程序: multi-monitor-dock-util
bestlygg 2014-07-24
  • 打赏
  • 举报
回复
引用 8 楼 save4me 的回复:
你截图里面的功能,获取连接显示器信息和切换主显示器用到三个API函数

[DllImport("user32.dll")]
static extern bool EnumDisplayDevices(string lpDevice, 
       uint iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, uint dwFlags);

[DllImport("user32.dll")]
public static extern bool EnumDisplaySettings(string deviceName, 
       int modeNum, ref DEVMODE devMode);

[DllImport("user32.dll")]
static extern DISP_CHANGE ChangeDisplaySettingsEx(string lpszDeviceName, 
       ref DEVMODE lpDevMode, IntPtr hwnd, uint dwflags, IntPtr lParam);
可以参考: How to create a display switcher for Windows XP
这是我后面要做的,但是我前面要做的是检测显示器设备,并且扩展出来,我才能做后面的事情
save4me 2014-07-24
  • 打赏
  • 举报
回复
中文的话,可以参考: c# 多显示器设置主屏幕(Set primary screen for multiple monitors)
引用 8 楼 save4me 的回复:
你截图里面的功能,获取连接显示器信息和切换主显示器用到三个API函数

[DllImport("user32.dll")]
static extern bool EnumDisplayDevices(string lpDevice, 
       uint iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, uint dwFlags);

[DllImport("user32.dll")]
public static extern bool EnumDisplaySettings(string deviceName, 
       int modeNum, ref DEVMODE devMode);

[DllImport("user32.dll")]
static extern DISP_CHANGE ChangeDisplaySettingsEx(string lpszDeviceName, 
       ref DEVMODE lpDevMode, IntPtr hwnd, uint dwflags, IntPtr lParam);
可以参考: How to create a display switcher for Windows XP
save4me 2014-07-24
  • 打赏
  • 举报
回复
你截图里面的功能,获取连接显示器信息和切换主显示器用到三个API函数

[DllImport("user32.dll")]
static extern bool EnumDisplayDevices(string lpDevice, 
       uint iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, uint dwFlags);

[DllImport("user32.dll")]
public static extern bool EnumDisplaySettings(string deviceName, 
       int modeNum, ref DEVMODE devMode);

[DllImport("user32.dll")]
static extern DISP_CHANGE ChangeDisplaySettingsEx(string lpszDeviceName, 
       ref DEVMODE lpDevMode, IntPtr hwnd, uint dwflags, IntPtr lParam);
可以参考: How to create a display switcher for Windows XP
bestlygg 2014-07-24
  • 打赏
  • 举报
回复
引用 6 楼 Z65443344 的回复:
这个有什么意义么,用户接了两个显示器,不是应该自己设置让两个显示器都显示么? 难道用户自己禁用了其中一个,你程序想强制让显示器启用? 如果用户就是想禁用,他直接连显示器电源都关闭了,你程序做什么都没用.
你没遇到过刚装机的那种情况,就是一开机,就只有2个显示,而且都是一样的屏幕,要的就是把显示器扩展成1,2
於黾 2014-07-24
  • 打赏
  • 举报
回复
这个有什么意义么,用户接了两个显示器,不是应该自己设置让两个显示器都显示么? 难道用户自己禁用了其中一个,你程序想强制让显示器启用? 如果用户就是想禁用,他直接连显示器电源都关闭了,你程序做什么都没用.
wind_cloud2011 2014-07-24
  • 打赏
  • 举报
回复
这是调用显示控制器的,有很多参数, ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_VideoController"); ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_VideoController"); string sHardDiskSerialNumber = ""; foreach (ManagementObject info in searcher.Get()) { string a = "适配器兼容性 " + info["AdapterCompatibility"].ToString(); string b = "适配器类型 " + info["AdapterDACType"].ToString(); string c = "视频模式描述" + info["VideoModeDescription"].ToString(); string d = "字幕" + info["Caption"].ToString(); string e = "目前比特每像素" + info["CurrentBitsPerPixel"].ToString(); string f = "目前的水平分辨率" + info["CurrentHorizontalResolution"].ToString(); string g = "视频处理器" + info["VideoProcessor"].ToString(); string h = "最大刷新率" + info["MaxRefreshRate"].ToString(); string i = "设备ID" + info["DeviceID"].ToString(); string j = "描述" + info["Description"].ToString(); string k = info["VideoMemoryType"].ToString(); 不过,我没找到第二个接口的方法
wind_cloud2011 2014-07-24
  • 打赏
  • 举报
回复
那我也理解错了,
wind_cloud2011 2014-07-24
  • 打赏
  • 举报
回复
有,用screen this.DesktopBounds = Screen.AllScreens[1].Bounds;
bestlygg 2014-07-24
  • 打赏
  • 举报
回复
引用 1 楼 wangnaisheng 的回复:
http://www.cnblogs.com/zzcong/archive/2012/06/13/2547877.html http://www.cnblogs.com/lizi/archive/2012/02/21/2361229.html
你理解错我的意思了,我是要把第二块显示器检测出来,然后让第二块显示器可以用,不是将form放到第二块显示器上运行
bestlygg 2014-07-24
  • 打赏
  • 举报
回复
引用 14 楼 save4me 的回复:
EnumDisplayDevices就是检测枚举显示器设备API函数
引用


namespace ChangeDisplaySettingApp
{
    public partial class Form1 : Form
    {
        public enum DMDO
        {
            DEFAULT = 0,
            D90 = 1,
            D180 = 2,
            D270 = 3
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        struct DEVMODE
        {
            public const int DM_DISPLAYFREQUENCY = 0x400000;
            public const int DM_PELSWIDTH = 0x80000;
            public const int DM_PELSHEIGHT = 0x100000;
            private const int CCHDEVICENAME = 32;
            private const int CCHFORMNAME = 32;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)]
            public string dmDeviceName;
            public short dmSpecVersion;
            public short dmDriverVersion;
            public short dmSize;
            public short dmDriverExtra; 
            public int dmFields;  
            public int dmPositionX;
            public int dmPositionY;
            public DMDO dmDisplayOrientation;
            public int dmDisplayFixedOutput;
            public short dmColor;
            public short dmDuplex;
            public short dmYResolution;
            public short dmTTOption;
            public short dmCollate;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHFORMNAME)]
            public string dmFormName;
            public short dmLogPixels;
            public int dmBitsPerPel;
            public int dmPelsWidth;
            public int dmPelsHeight;
            public int dmDisplayFlags;
            public int dmDisplayFrequency;
            public int dmICMMethod;
            public int dmICMIntent;
            public int dmMediaType;
            public int dmDitherType;
            public int dmReserved1;
            public int dmReserved2;
            public int dmPanningWidth;
            public int dmPanningHeight;
            public override string ToString()
            {
                return string.Format("分辨率:{0}*{1};颜色质量:{2}位;刷新率:{3};", this.dmPelsWidth, this.dmPelsHeight, this.dmBitsPerPel, this.dmDisplayFrequency);
            }
        }

        public enum DeviceFlags
        {
            CDS_FULLSCREEN = 0x4,
            CDS_GLOBAL = 0x8,
            CDS_NORESET = 0x10000000,
            CDS_RESET = 0x40000000,
            CDS_SET_PRIMARY = 0x10,
            CDS_TEST = 0x2,
            CDS_UPDATEREGISTRY = 0x1,
            CDS_VIDEOPARAMETERS = 0x20,

        }
        enum ChangeReturnValue
        {
            DISP_CHANGE_SUCCESSFUL = 0,
            DISP_CHANGE_RESTART = 1,
            DISP_CHANGE_FAILED = -1,
            DISP_CHANGE_BADMODE = -2,
            DISP_CHANGE_NOTUPDATED = -3,
            DISP_CHANGE_BADFLAGS = -4,
            DISP_CHANGE_BADPARAM = -5,
            DISP_CHANGE_BADDUALVIEW = -6
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct DISPLAY_DEVICE
        {
            public int cb;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string DeviceName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string DeviceString;
            public int StateFlags;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string DeviceID;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string DeviceKey;
            public DISPLAY_DEVICE(int flags)
            {
                cb = 0;
                StateFlags = flags;
                DeviceName = new string((char)32, 32);
                DeviceString = new string((char)32, 128);
                DeviceID = new string((char)32, 128);
                DeviceKey = new string((char)32, 128);
                cb = Marshal.SizeOf(this);
            }
            
        }

        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        private static extern bool EnumDisplayDevices(string lpDevice, int iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, int dwFlags);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern ChangeReturnValue ChangeDisplaySettings([In] ref DEVMODE lpDevMode, int dwFlags);//修改主显示器属性

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern bool EnumDisplaySettings(string lpszDeviceName, int iModeNum, ref DEVMODE lpDevMode);//获取指定显示器属性

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern long ChangeDisplaySettingsEx(string lpszDeviceName, [In] ref DEVMODE lpDevMode, IntPtr hwnd, int dwflags, IntPtr lParam);//修改指定显示器属性

        

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            int DispNum = 0;
             DISPLAY_DEVICE DisplayDevice;
             DEVMODE defaultMode;
           //  IntPtr hdc;
            // int nWidth;
             bool bFoundSecondary = false;

            
            try
            {
                  // Initialize DisplayDevice
                 DisplayDevice =  new DISPLAY_DEVICE();
                 DisplayDevice.cb = Marshal.SizeOf(typeof(DISPLAY_DEVICE));
                 defaultMode = new DEVMODE();
                 defaultMode.dmSize = (short)Marshal.SizeOf(typeof(DEVMODE));
                 // Get display device
                 while ((EnumDisplayDevices(null, DispNum, ref DisplayDevice, 0)) 
                    ) //&&(bFoundSecondary == false))
                 {
                    
                     // DisplayDevice.DeviceName = "\\\\.\\DISPLAY" +(DispNum+1);
                     
                     if (!EnumDisplaySettings(DisplayDevice.DeviceName, -1,ref defaultMode))
                     {
                         return;
                     }


                     if ((DisplayDevice.StateFlags & 4) == 0)
                     {
                         // Found the first secondary device
                         bFoundSecondary = true;
                         defaultMode.dmPositionX += 1920;
                         //defaultMode.dmFields = DM_POSITION;
                         ChangeDisplaySettingsEx(DisplayDevice.DeviceName,
                                                         ref defaultMode,
                                                         IntPtr.Zero,
                                                         0,
                                                         IntPtr.Zero);

                         // A second call to ChangeDisplaySettings updates the monitor.
                         ChangeDisplaySettings(ref defaultMode, 0);
                         
                     }

                     // Reinitialize DisplayDevice
                     DisplayDevice = new DISPLAY_DEVICE();
                     DisplayDevice.cb = Marshal.SizeOf(typeof(DISPLAY_DEVICE));
                     DispNum++;
                      // EnumDevices();
                 }

            }
            catch
            { }

        }

        public string[] EnumDevices()
        {
            string[] Enum = null;
            System.Collections.ArrayList arrayList = new System.Collections.ArrayList();

            DISPLAY_DEVICE display_device = new DISPLAY_DEVICE();

            int deviceNumber = 0;
            bool result = true;
            while (result)
            {
                result = EnumDisplayDevices(null, deviceNumber, ref display_device, 0);
                if (result == true)
                {
                    arrayList.Add("deviceNumber:" + deviceNumber.ToString());
                    arrayList.Add("display_device.DeviceID:" + display_device.DeviceID.Trim());
                    arrayList.Add("display_device.DeviceKey:" + display_device.DeviceKey.Trim());
                    arrayList.Add("display_device.DeviceName:" + display_device.DeviceName.Trim());
                    arrayList.Add("display_device.DeviceString:" + display_device.DeviceString.Trim());
                    arrayList.Add("display_device.StateFlags:" + display_device.StateFlags.ToString());

                    if ((display_device.StateFlags & 4) != 0)
                    {
                        arrayList.Add("Primary Monitor");
                    }

                }
                deviceNumber++;
            }
            MessageBox.Show(deviceNumber.ToString());
            Enum = (string[])arrayList.ToArray(typeof(string));
            return Enum;
        }

    }


}
能不能帮我看一下,我在
 if (!EnumDisplaySettings(DisplayDevice.DeviceName, -1,ref defaultMode))
                     {
                         return;
                     }
就直接return了,EnumDisplayDevices获取DisplayDevice的信息获取不到,DisplayDevice.DeviceName的值是“\\”
xiaoforward 2014-07-24
  • 打赏
  • 举报
回复
电脑是双显卡的吗,看看另一显卡的驱动安装好了没有!
save4me 2014-07-24
  • 打赏
  • 举报
回复
EnumDisplayDevices就是检测枚举显示器设备API函数 添加和移除显示器,参考代码DispalyControlHelpers.cs 要扩展显示器,就是设置主屏幕的dmPosition.x = 0,然后设置第二屏的dmPosition.x += 第一屏的宽度 (假设两个屏都是水平放置的),然后调用ChangeDisplaySettingsEx去更新设置。
引用 10 楼 liuyi1398214531 的回复:
这是我后面要做的,但是我前面要做的是检测显示器设备,并且扩展出来,我才能做后面的事情
道玄希言 2014-07-24
  • 打赏
  • 举报
回复
想程序检测、控制这里的显示器设置,貌似…… DVI 接口的需要,因为在系统运行后,减少DVI接口上的显示器,程序会自动跳回来,但是增加了,程序不会动 HDMI 接口的,好像是自动会跳回去了…… 程序中不需要代码控制 我们做的系统,将播放界面放HDMI 端口的显示设备播放,就没写你说的那部分代码,只是在播放界面启动时, 加入了界面坐标。

110,525

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧