1

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

}

これはどのように可能であり、その理由は何ですか? 大規模な検索を行ったのですが、ターミナルまたはメイン フォームの .Visible プロパティに依存するコードはありませんか?

一部のフォームが表示されない場合に機能しない理由について、私は完全に困惑しています。MSDN や Google もあまり役に立ちませんでした。インスタンス化されたときに正しく機能することは確かでしたが、表示されませんでした。

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;
    }

}
4

4 に答える 4

5

質問は十分に文書化されていませんが、これはデバイスで動作するコードではかなり正常です。プラグ アンド プレイ イベントについて知る必要があり、WM_DEVICECHANGE 通知メッセージを受信する最上位ウィンドウを作成する必要があります。.NET フォーム オブジェクトを作成するだけでは十分ではありません。そのためのネイティブ ウィンドウも作成する必要があります。これは、典型的な .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() に渡されたウィンドウでない場合は、 this.CreateHandle() を最後のステートメントとして呼び出すだけで間に合わせることができます。フォーム コンストラクタ。その場合、Show() を呼び出す必要はなくなりました。

于 2013-06-19T18:24:35.887 に答える
1

あなたが持っている情報から判断するのは非常に難しいですが、クラスを使用する必要があるフォームを使用していると思います. プログラム構造を再考し、これをクラスとして書き直して、必要に応じてデータを保持および送信する必要があります。他の人が指摘しているように、リストボックスやその他の機能は、フォームが表示されてメソッドが実行されるまで実行されません。

于 2013-06-19T18:25:18.023 に答える
1

これは、Show() を呼び出す前に下層のウィンドウが作成されていないためだと思われます。ウィンドウが作成されていないため、カスタム WndProc は呼び出されません。

Handle確認するには、プロパティを見て、表示せずにウィンドウを作成できます。ドキュメントにあるように、呼び出すまでにハンドルが作成されていない場合は、作成されます。試してみてください。電話ShowしてからHide.

于 2013-06-19T18:20:50.790 に答える
0

Form onShow イベントが呼び出されたときに、いくつかの必要な関数が呼び出されるためです。

于 2013-06-19T18:19:30.287 に答える