2013-06-19 24 views
1

我有一個窗體,代表一個USB設備終端,一直給我一些錯誤。在調試了半天沒有已知源的奇怪錯誤之後,我發現終端在實例化但未顯示時不起作用。當我更改代碼並添加usbTerminal.Show();,然後它正常工作。窗體不起作用,除非.Show()被調用

USBTerminal usbTouchTerminal; 

public MainForm() 
{ 

InitializeComponent(); 

USBSettings usbTouchSettings = new USBSettings(); 
usbTouchTerminal = new USBTerminal(usbTouchSettings);   //Create Terminal with settings 
usbTouchTerminal.StartUSB();          
usbTouchTerminal.Show();   //works ONLY when show is here 

} 

這怎麼可能?爲什麼?我做了大量的搜索,我的代碼都不依賴於我的終端或主窗體上的.Visible屬性?

如果沒有顯示某些表單,爲什麼某些表單不起作用,我完全困惑不解。 MSDN或谷歌也不是一個真正的幫助。我確定它會在實例化時正常工作,但沒有顯示。

PS。我加

usbTerminal.Show(); 
usbTerminal.Hide(); 

和終端功能正常。

謝謝你的幫助!

編輯:

我也應該注意到,這usbTerminal使用的WndProc覆蓋。我不是這方面的專家,但我覺得這可能與它有關。

我要指出,這是LibUSBdotnet

public class USBSettings 
{ 
    /// <summary> 
    /// This is the Vender ID Number. (0x0B6A) 
    /// </summary> 
    public ushort VID { get; set; } 

    /// <summary> 
    /// This is the Product ID Number. (0x5346) 
    /// </summary> 
    public ushort PID { get; set; } 

    /// <summary> 
    /// This is the optional Serial Name. ("") 
    /// </summary> 
    public string SerialName { get; set; } 

    /// <summary> 
    /// This is the Reader USB Endpoint. (ReadEndpointID.Ep02) 
    /// </summary> 
    public ReadEndpointID ReaderEndpoint { get; set; } 

    /// <summary> 
    /// This is the Writer USB Endpoint. (WriteEndpointID.Ep01) 
    /// </summary> 
    public WriteEndpointID WriterEndpoint { get; set; } 

    /// <summary> 
    /// This is the Registry Key for USB settings. ("SOFTWARE\\DEFAULT\\USBPROPERTIES") 
    /// </summary> 
    public string SubKey { get; set; } 

    /// <summary> 
    /// This is the default read buffer size for the USB Device. 
    /// </summary> 
    public int ReadBufferSize { get; set; } 

    /// <summary> 
    /// This constructor houses default values for all properties. 
    /// </summary> 
    public USBSettings() 
    { 
     VID = 0x0B6A; 
     PID = 0x5346; 
     SerialName = ""; 
     ReaderEndpoint = ReadEndpointID.Ep02; 
     WriterEndpoint = WriteEndpointID.Ep01; 
     SubKey = "SOFTWARE\\DEFAULT\\USBPROPERTIES"; 
     ReadBufferSize = 100; 
    } 

} 
+0

這是什麼?它怎麼不起作用? – SLaks

+0

這是一個表單嗎?它應該做什麼? usbTouchSettings的代碼是什麼樣的? – Bit

+0

這是一個連接到嵌入式系統的USB終端。基本上,它應該沒有收到一些數據。終端有一個接收和發送列表框,它不能與底層應用程序功能一起正常工作。 – bassplayer142

回答

5

這個問題記錄不完整,但對於與設備一起使用的代碼來說這是相當正常的。他們傾向於需要了解Plug & Play事件,並且需要創建接收WM_DEVICECHANGE通知消息的頂級窗口。創建一個.NET Form對象是不夠的,你還必須爲它創建本地窗口。其中,典型的.NET懶惰的方式,發生在最後的時刻,當你強迫窗口可見。通過調用Show()方法或將Visible屬性設置爲true。該窗口實際上並非必須可見,才能獲得插件&播放通知。

可以獲得創建的窗口,但不使其可見。這需要修改USBTerminal類。粘貼此代碼:

protected override void SetVisibleCore(bool value) { 
     if (!this.IsHandleCreated) { 
      this.CreateHandle(); 
      value = false; 
     } 
     base.SetVisibleCore(value); 
    } 

並且正常地調用Show()方法。請注意,Load事件不會觸發,直到窗口實際變爲可見爲止,如有必要,可將事件處理程序中的任何代碼移至此方法。如果這不是應用程序的主窗口,換句話說不是在Main()方法中傳遞給Application.Run()的那個窗口,那麼您可以簡單地調用它。CreateHandle()作爲窗體構造函數中的最後一個語句。在這種情況下調用Show()不再是必需的。

+0

謝謝,這有助於。 – bassplayer142

0

因爲當所謂的形式昂秀活動的一些必要的功能將被調用。

1

我懷疑這是因爲在調用Show()之前,不會創建底層窗口。由於該窗口未創建,因此不會調用您的自定義WndProc。

要驗證,您可以創建窗口而不顯示它 - 通過查看Handle property。正如文件所述 - 如果句柄在您打電話時尚未創建,它將被創建。嘗試一下,我敢打賭,它會工作,就像你打電話Show,然後Hide

+0

謝謝,這幫助我解決了問題 – bassplayer142

1

從您的信息中很難分辨出來,但我認爲您正在使用應該使用類的表單。您應該重新考慮您的程序結構,並將其重寫爲一個類,以根據需要保存和傳輸數據。正如其他一些人指出,直到顯示窗體並執行方法之後,列表框和/或其他函數纔會運行。

+0

謝謝。我覺得我需要更多地瞭解關於表單創建和基本控制的具體內容。 – bassplayer142