c# - Windows 7 有时无法检测到 HDMI 电视?可以在代码中调用 Detect 吗?

标签 c# .net winapi windows-7 monitors

我有一台每天自动启动的独立公共(public)信息亭电脑。它连接到高清电视,有时检测不到。我必须亲自去 PC,转到屏幕分辨率,然后按检测它的工作原理。

我的问题是如何知道我希望它显示的显示器是否已在代码中正确连接?

谢谢

最佳答案

我确实设法在 MSDN 站点上找到了一些代码,其中用户正在使用代码来确定所连接的监视器类型。我希望这对您来说是一个很好的起点。

using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;

namespace CRT
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public class NativeMethods

        {
            [DllImport("user32.dll", EntryPoint = "MonitorFromWindow", SetLastError = true)]
            public static extern IntPtr MonitorFromWindow(
                [In] IntPtr hwnd, uint dwFlags);

            [DllImport("dxva2.dll", EntryPoint = "GetNumberOfPhysicalMonitorsFromHMONITOR", SetLastError = true)]
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool GetNumberOfPhysicalMonitorsFromHMONITOR(
                IntPtr hMonitor, ref uint pdwNumberOfPhysicalMonitors);

            [DllImport("dxva2.dll", EntryPoint = "GetPhysicalMonitorsFromHMONITOR", SetLastError = true)]
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool GetPhysicalMonitorsFromHMONITOR(
                IntPtr hMonitor,
                uint dwPhysicalMonitorArraySize,
                [Out] NativeStructures.PHYSICAL_MONITOR[] pPhysicalMonitorArray);

            [DllImport("dxva2.dll", EntryPoint = "DestroyPhysicalMonitors", SetLastError = true)]
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool DestroyPhysicalMonitors(
                uint dwPhysicalMonitorArraySize, [Out] NativeStructures.PHYSICAL_MONITOR[] pPhysicalMonitorArray);

            [DllImport("dxva2.dll", EntryPoint = "GetMonitorTechnologyType", SetLastError = true)]
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool GetMonitorTechnologyType(
                IntPtr hMonitor, ref NativeStructures.MC_DISPLAY_TECHNOLOGY_TYPE pdtyDisplayTechnologyType);

            [DllImport("dxva2.dll", EntryPoint = "GetMonitorCapabilities", SetLastError = true)]
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool GetMonitorCapabilities(
                IntPtr hMonitor, ref uint pdwMonitorCapabilities, ref uint pdwSupportedColorTemperatures);
        }

        public class NativeConstants
        {
            public const int MONITOR_DEFAULTTOPRIMARY = 1;

            public const int MONITOR_DEFAULTTONEAREST = 2;

            public const int MONITOR_DEFAULTTONULL = 0;
        }

        public class NativeStructures
        {
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
            public struct PHYSICAL_MONITOR
            {
                public IntPtr hPhysicalMonitor;

                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string szPhysicalMonitorDescription;
            }

            public enum MC_DISPLAY_TECHNOLOGY_TYPE
            {
                MC_SHADOW_MASK_CATHODE_RAY_TUBE,

                MC_APERTURE_GRILL_CATHODE_RAY_TUBE,

                MC_THIN_FILM_TRANSISTOR,

                MC_LIQUID_CRYSTAL_ON_SILICON,

                MC_PLASMA,

                MC_ORGANIC_LIGHT_EMITTING_DIODE,

                MC_ELECTROLUMINESCENT,

                MC_MICROELECTROMECHANICAL,

                MC_FIELD_EMISSION_DEVICE,
            }
        }

        public Window1() { InitializeComponent(); }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            WindowInteropHelper helper = new WindowInteropHelper(this);

            IntPtr hMonitor = NativeMethods.MonitorFromWindow(helper.Handle, NativeConstants.MONITOR_DEFAULTTOPRIMARY);
            int lastWin32Error = Marshal.GetLastWin32Error();

            uint pdwNumberOfPhysicalMonitors = 0u;
            bool numberOfPhysicalMonitorsFromHmonitor = NativeMethods.GetNumberOfPhysicalMonitorsFromHMONITOR(
                hMonitor, ref pdwNumberOfPhysicalMonitors);
            lastWin32Error = Marshal.GetLastWin32Error();

            NativeStructures.PHYSICAL_MONITOR[] pPhysicalMonitorArray =
                new NativeStructures.PHYSICAL_MONITOR[pdwNumberOfPhysicalMonitors];
            bool physicalMonitorsFromHmonitor = NativeMethods.GetPhysicalMonitorsFromHMONITOR(
                hMonitor, pdwNumberOfPhysicalMonitors, pPhysicalMonitorArray);
            lastWin32Error = Marshal.GetLastWin32Error();

            uint pdwMonitorCapabilities = 0u;
            uint pdwSupportedColorTemperatures = 0u;
            var monitorCapabilities = NativeMethods.GetMonitorCapabilities(
                pPhysicalMonitorArray[0].hPhysicalMonitor, ref pdwMonitorCapabilities, ref pdwSupportedColorTemperatures);
            lastWin32Error = Marshal.GetLastWin32Error();

            NativeStructures.MC_DISPLAY_TECHNOLOGY_TYPE type =
                NativeStructures.MC_DISPLAY_TECHNOLOGY_TYPE.MC_SHADOW_MASK_CATHODE_RAY_TUBE;
            var monitorTechnologyType = NativeMethods.GetMonitorTechnologyType(
                pPhysicalMonitorArray[0].hPhysicalMonitor, ref type);
            lastWin32Error = Marshal.GetLastWin32Error();

            var destroyPhysicalMonitors = NativeMethods.DestroyPhysicalMonitors(
                pdwNumberOfPhysicalMonitors, pPhysicalMonitorArray);
            lastWin32Error = Marshal.GetLastWin32Error();

            this.lbl.Content = type;
        }
    }
}

关于c# - Windows 7 有时无法检测到 HDMI 电视?可以在代码中调用 Detect 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7104723/

相关文章:

c# - 相同的文本具有不同的字节大小

c# - WPF WebView 不显示

.net - 为什么指针是引用类型?

c# - 将图像另存为 Tiff

c# - GetChildAtPoint 仅返回禁用的控件?

c# - 理解异步和等待

c# - 在结对编程时是否可以使用任何基本的字符串混淆?

c - 如何响应有关列表框项目中右键的鼠标消息?

c++ - 如何使用 Windows 内存 dc (c++) 创建 OpenGL 上下文

c++ - 使用 C++ 在 cmd 上绘图