掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
フォームから別アプリのプロセス起動中のイベントについて (ID:147555)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 先程押したボタン操作が実行されてしまいます。。 アプリがビジー状態(イベント処理など)の最中に行われた ユーザー操作(マウスやキーボード入力)というものは、 メッセージキューとして溜められていき、順番待ちになっています。 そしてこのメッセージキューは、アプリケーションがアイドル状態に戻った時 (つまり、ビジー状態ではなくなったとき)に、後追いで処理されます。 このような理由から、Enabled = False の間に行われたボタン操作が、 後から実行されるという事態になります。 対応策としては、たとえばこういった方法が考えられます。 (案1) 別アプリの終了待ちが終わった後に発生する Idle イベントをとらえ、 そのタイミングで Enabled プロパティの値を True に戻す。 Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Me.Enabled = False AddHandler Application.Idle, AddressOf Application_Idle Using p As Process = Process.Start("notepad.exe", "C:\temp\newFile.txt") p.WaitForExit() p.Close() End Using End Sub Private Sub Application_Idle(sender As Object, e As EventArgs) RemoveHandler Application.Idle, AddressOf Application_Idle Me.Enabled = True End Sub End Class (案2) ビジー状態になっていたアプリケーションが、アイドル状態に 戻ったかどうかを Idle イベント+フラグ変数で管理しておき、 そのフラグ変数を見ることで、ビジー状態のときに発生した処理を無視する。 Public Class Form1 Private isBusy As Boolean = False Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load AddHandler Application.Idle, AddressOf Application_Idle End Sub Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed RemoveHandler Application.Idle, AddressOf Application_Idle End Sub Private Sub Application_Idle(ByVal sender As Object, ByVal e As EventArgs) isBusy = False End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If isBusy Then Return Me.Enabled = False isBusy = True Using p As Process = Process.Start("notepad.exe", "C:\temp\newFile.txt") p.WaitForExit() p.Close() End Using Me.Enabled = True End Sub End Class
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.