【问题标题】:.Net (C#) Detect if a television is connected.Net (C#) 检测是否连接了电视
【发布时间】:2010-09-20 11:52:28
【问题描述】:

有人知道如何用 c# 检测电视当前是否连接到 PC 吗?

干杯

【问题讨论】:

    标签: c# .net screen monitor television


    【解决方案1】:

    设备是如何连接的?

    每当设备到达/移除时,Windows 都会向系统中当前运行的所有应用程序发送一条名为 WM_DEVICECHANGE 的消息。但要接收此消息,我们的应用程序应该处理“Windows 进程函数”。 C# 应用程序不会默认支持此功能,但可以添加它。您可以扩展表单类。

    为 USB 大容量存储设备执行此操作的代码类似于:

    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using System.Runtime.InteropServices;
    namespace WindowsApplication
    {
        /// <summary>
        /// Summary description for Form1.
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.Container components = null;
    
            public Form1()
            {
                //
                // Required for Windows Form Designer support
                //
                InitializeComponent();
    
                //
                // TODO: Add any constructor code after InitializeComponent call
                //
            }
    
            [StructLayout(LayoutKind.Sequential)] 
                public struct DEV_BROADCAST_VOLUME 
            { 
                public int dbcv_size; 
                public int dbcv_devicetype; 
                public int dbcv_reserved; 
                public int dbcv_unitmask; 
            } 
    
            protected override void WndProc(ref Message m) 
            { 
                //you may find these definitions in dbt.h and winuser.h 
                const int WM_DEVICECHANGE = 0x0219; 
                const int DBT_DEVICEARRIVAL = 0x8000;  // system detected a new device 
                const int DBT_DEVICEREMOVECOMPLETE = 0x8001;  // system detected a new device 
                const int DBT_DEVTYP_VOLUME = 0x00000002;  // logical volume 
                switch(m.Msg)
                {
                    case WM_DEVICECHANGE:
                    switch(m.WParam.ToInt32())
                    {
                        case DBT_DEVICEARRIVAL:
                            { 
                                int devType = Marshal.ReadInt32(m.LParam,4); 
                                if(devType == DBT_DEVTYP_VOLUME) 
                                { 
                                    DEV_BROADCAST_VOLUME vol; 
                                    vol = (DEV_BROADCAST_VOLUME) 
                                        Marshal.PtrToStructure(m.LParam,typeof(DEV_BROADCAST_VOLUME)); 
                                    MessageBox.Show(vol.dbcv_unitmask.ToString("x")); 
                                } 
                            } 
                            break;
                        case DBT_DEVICEREMOVECOMPLETE:
                            MessageBox.Show("Removal");
                            break;
                    }
    
                        break;
                }
                //we detect the media arrival event 
                base.WndProc (ref m); 
    
    
            } 
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            protected override void Dispose( bool disposing )
            {
                if( disposing )
                {
                    if (components != null) 
                    {
                        components.Dispose();
                    }
                }
                base.Dispose( disposing );
            }
    
    
            #region Windows Form Designer generated code
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                // 
                // Form1
                // 
                this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
                this.ClientSize = new System.Drawing.Size(292, 273);
                this.Name = "Form1";
                this.Text = "Form1";
                this.Load += new System.EventHandler(this.Form1_Load);
    
            }
            #endregion
    
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main() 
            {
                Application.Run(new Form1());
            }
    
            private void Form1_Load(object sender, System.EventArgs e)
            {
    
            }
        }
    }
    

    它可能会让你知道如何实现它。

    【讨论】:

    • 你怎么能这样格式化代码?太可怕了。
    【解决方案2】:

    我想你说的是显示器/电视?

    当用户切换到电视时,您可以制作一个带有“TV CONNECTED”的大按钮的 winform 应用程序 :-)

    如果与 PC 的唯一连接只是 VGA 连接器,那么您就不走运了。您总是可以实现一个连接到串行端口的红外传感器来读取来自遥控器的红外信号(无论何时用户点击它)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 2011-09-30
      • 2012-06-27
      • 2013-02-19
      相关资源
      最近更新 更多