除非调用.Show(),否则表单不起作用

bas*_*142 1 c# forms show visible

我有一个表示USB设备终端的表单,它给了我一些错误.在调试了没有已知源的奇怪错误半天之后,我以某种方式发现终端在实例化但未显示时不起作用.当我更改代码并添加usbTerminal.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

}
Run Code Online (Sandbox Code Playgroud)

这怎么可能,为什么?我做了大量的搜索,我的代码都不依赖于我的终端或主窗体上的.Visible属性?

我完全不知道为什么某些表格如果没有显示就行不通.MSDN或谷歌也不是真正的帮助.我确信它在实例化时会正常运行但未显示.

PS.我补充道

usbTerminal.Show();
usbTerminal.Hide();
Run Code Online (Sandbox Code Playgroud)

并且终端功能正常.

感谢您的任何帮助!

编辑:

我还应该注意,这个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;
    }

}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 5

问题记录很少,但这对于使用设备的代码来说是相当正常的.他们往往需要了解即插即用事件,并且需要创建一个接收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);
    }
Run Code Online (Sandbox Code Playgroud)

并正常调用Show()方法.请注意,只有在窗口实际可见时才会触发Load事件,因此必要时将事件处理程序中的任何代码移动到此方法.如果这不是应用程序的主窗口,换句话说,不是在Main()方法中传递给Application.Run()的那个窗口,那么你可以简单地调用this.CreateHandle()作为最后一个语句.表单构造函数.在这种情况下,不再需要调用Show().