現時点では、「Single Instance」フラグを使用せずにシングルトン アプリケーションを構築しようとしています。これは、アプリケーションのメカニズムの一部が実際に複数のインスタンス (セルフ アップデーターなど) を必要とするためです。そのため、アプリケーションのインスタンスが 1 つだけであることを保証する独自の方法を構築する必要があります。
私はこれを作成することの約半分に達しました。
- 実行中のインスタンスの数を検出します
- 他のインスタンスのメイン ウィンドウを表示する方法(ここで行き詰まっています)
問題は、ほとんどの場合、アプリケーションがバックグラウンドで非表示になり、タスクバーにアイテムが表示されないことです。process.MainWindowHandle を呼び出すと、常に 0 が返されます。その関数が現在の「MainWindow」を検出するには、ウィンドウが A) 表示可能であり、B) タスクバーに表示されている必要があります。
この制限の周りにとにかくありますか?
私が考えることができる方法は、アプリケーションが初めて表示されたときに MainWindowHandle を格納することですが、どのようにこの値を公開しますか?
現在のコード:
Dim running_processes As Process() = Process.GetProcessesByName("helpdesk")
Dim current_process_id As Integer = Process.GetCurrentProcess().Id
If (running_processes.Length = 1) Then
'Run the app like normal
bootstrap_loader.Show()
Else
For Each process As Process In running_processes
If process.Id = current_process_id Then Continue For
'MainWindowHandle returns 0 when window is not visible
'Sidenote: ShowWindow is from user32.dll :)
ShowWindow(process.MainWindowHandle, SHOW_WINDOW.SW_NORMAL)
'Exit the application like a baws
'Environment.Exit(2)
Next
End If