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