2012-11-06 122 views
0

我想要一個控制元素來顯示正在運行的程序中關於連接的USB設備的更改。搜索後,我設法找到USB設備並將其打印出來。我也處理獲取有關移除和連接的信息。移除或插入新USB設備後的COM端口更新

但現在有一個問題,當我結合兩個部分它不起作用。 這裏是我的代碼:

namespace usbPortAbfrage 
{ 
    public partial class Form1 : Form 
    { 
     ArrayList result = new ArrayList(); 
     public Form1() 
     { 
      InitializeComponent(); 
      bla(); 
     } 

     public ArrayList GetComFriendlyNames() 
     { 
      ArrayList names = new ArrayList(); 
      try 
      { 
       ManagementObjectSearcher searcher = 
        new ManagementObjectSearcher("root\\WMI", 
        "SELECT InstanceName, PortName FROM MSSerial_PortName"); 

       foreach (ManagementObject port in searcher.Get()) 
       { 
        names.Add(port["PortName"]); 
       } 
      } 
      catch (ManagementException) 
      { 
      } 
      return names; 
     } 

     protected override void WndProc(ref Message m) 
     { 
      base.WndProc(ref m); 

      if (m.WParam.ToInt32() == 0x8004) 
      { 
       MessageBox.Show("Gerät entfernt"); 
       richTextBox1.Clear(); 
       bla(); 
      } 

      if (m.WParam.ToInt32() == 0x8000) 
      { 
       MessageBox.Show("Gerät angeschlossen"); 
       richTextBox1.Clear(); 
       bla(); 
      } 
     } 

     public void bla() 
     { 
      richTextBox1.Clear(); 

      ArrayList test = GetComFriendlyNames(); 

      foreach (string name in test) 
      { 
       richTextBox1.AppendText(name + "\n"); 
      } 
     }  
    } 
} 
+1

什麼不行? –

+0

當我開始運行時,它運行並創建一個表單,其中是一個「richtextbox」。在那裏站立我的Comports,但如果我將刪除或連接設備清除文本框,並不追加新的文本(也是新的搜索) – Schursan88

+0

事件綁定對你的方法是什麼樣的? –

回答

0

這是我的測試中我調試代碼,試圖複製我似乎無法要麼打事件代碼的問題。 (IE沒有這個代碼將無法正常工作,這不是答案/解決方案,但我不能把它放入一個評論,請不要將其否決!)

public partial class Form1 : Form 
{ 
    private const int WM_ACTIVATEAPP = 0x001C; 
    private const int DBT_DEVICEARRIVAL = 0x8000;    // system detected a new device  
    private const int DBT_DEVICEREMOVEPENDING = 0x8003;   // about to remove, still available  
    private const int DBT_DEVICEREMOVECOMPLETE = 0x8004; 
    private bool appActive = true; 

    public Form1() 
    { 
     this.Size = new System.Drawing.Size(300, 300); 
     this.Text = "Form1"; 
     this.Font = new System.Drawing.Font("Microsoft Sans Serif", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     // Paint a string in different styles depending on whether the 
     // application is active. 
     if (appActive) 
     { 
      e.Graphics.FillRectangle(SystemBrushes.ActiveCaption, 20, 20, 260, 50); 
      e.Graphics.DrawString("Application is active", this.Font, SystemBrushes.ActiveCaptionText, 20, 20); 
     } 
     else 
     { 
      e.Graphics.FillRectangle(SystemBrushes.InactiveCaption, 20, 20, 260, 50); 
      e.Graphics.DrawString("Application is Inactive", this.Font, SystemBrushes.ActiveCaptionText, 20, 20); 
     } 
    } 

    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] 
    protected override void WndProc(ref Message m) 
    { 
     // Listen for operating system messages. 
     switch (m.Msg) 
     { 
      // The WM_ACTIVATEAPP message occurs when the application 
      // becomes the active application or becomes inactive. 
      case WM_ACTIVATEAPP: 

       // The WParam value identifies what is occurring. 
       appActive = (((int)m.WParam != 0)); 

       // Invalidate to get new text painted. 
       this.Invalidate(); 

       break; 
      case DBT_DEVICEARRIVAL: 
       MessageBox.Show("Connected!"); 
       break; 
      case DBT_DEVICEREMOVECOMPLETE: 
       MessageBox.Show("Disconnected!"); 
       break; 
     } 
     base.WndProc(ref m); 
    } 
} 

鏈接到MSDN類似的問題:http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/ea183afd-d070-4abd-8e00-a1784fdfedc5/

+0

嘿托馬斯, 感謝您的努力。我測試過你的代碼,它在程序運行時不會對斷開或連接做出反應。這是我的問題的一部分,在我的代碼工作中,singel對我來說非常完美(對連接和斷開連接作出反應)。但是如果我在製作MessageBox時想要做更多的事情,即調用一個應該搜索設備並將其打印出來的功能,它就沒有用。我有另一個mashine測試我的代碼,我得到一個異常:HRESULT:0x8001010D(RPC_E_CANTCALLOUT_ININPUTSYNCCALL。我會看到它可能會在黑暗的隧道燈。 – Schursan88

+0

如果您將事件更改爲0x219它應該工作,這是WM_DEVICECHANGE事件,但這並不能解決你的問題。 –

相關問題