1

毎回「こんにちは」というメッセージ ボックスを表示するタイマーがあります。また、ウィンドウがフォーカスを失うたびに、ボックスを表示し続けるタイマーを停止するようにコードを構成しています。しかし、彼らは来続けます。

ここに投稿するにはコードが長すぎる同様のプログラムで同様のことを試しましたが最初に一時停止し、タイマーを停止し、タイマーが再び停止したときに正しく機能しませんでした。ランダムな要素を持ち、特定の数値が生成されたときに別のプロンプトを表示するコードもいくつかありましたが、一度生成されると、毎回同じ異なるプロンプトを使用し続けました。

これは、すべてのコードを処理するのに十分な時間がなく、一部が「重複」しているというエラーですか? それほど大きな影響を与えずにタイマーを遅らせることができますが、このプログラムを実行している [ローエンド] CPU は、1.6 GHz で、いくつかのメッセージ ボックスでタイマーを処理できると思います。ただし、VS は同時に実行されていますが、テストする必要があるたびにコードをエクスポートして VS を閉じる必要はありません。

問題が十分な時間ではない場合、プログラムが「マルチスレッド」またはそれが行っていることを防ぐ方法はありますか? 奇妙な問題のように思えますが、コンピューターも非常に奇妙です。:P

編集:

「フォーカス」とは、選択されたウィンドウが最も目立つことを意味します。たとえば、私のブラウザは現在「フォーカス」されています。正しい用語は「選択」であると通知されました。間違ったタイプのイベント トリガーを使用していたに違いありません... :P

4

2 に答える 2

4

そもそもフォームにフォーカスがないため、lost-focus イベントは生成されません。Button や TextBox のように、フォーム上のコントロールは常にフォーカスを取得します。代わりに Deactivate イベントを使用できます。

または、Tick イベントが再び発生したときにメッセージ ボックスを表示しないようにします。だいたい:

Private ShowingMsgBox As Boolean

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    '' Do stuff
    ''
    If Not ShowingMsgBox Then
        ShowingMsgBox = True
        MsgBox("yada")
        ShowingMsgBox = False
    End If
End Sub

この動作の根本的な理由は、MsgBox がメッセージ ループをポンピングすることです。ウィンドウの描画を維持する WM_PAINT のように、通常の Windows メッセージの配信を維持します。そして、Tick イベントを生成する WM_TIMER。ブロックされる唯一の種類のメッセージは、入力イベント、マウスおよびキーボード メッセージです。そうでなければ、 Application.DoEvents() が非常に危険な理由です。入力を無効にすることなく、MsgBox() と同じことを行います。

于 2013-09-25T22:21:39.443 に答える