ここから本文です

VB.NET(2005)での再起動と二重起動防止の両立の仕方を教えてください。

bet********さん

2009/1/1920:47:04

VB.NET(2005)での再起動と二重起動防止の両立の仕方を教えてください。

エントリポイントで二重起動防止をしていて
Sub Main()
' このアプリケーションのプロセス名を取得
Dim stThisProcess As String = System.Diagnostics.Process.GetCurrentProcess().ProcessName
' 同名のプロセスが他に存在する場合は、既に起動していると判断する
If System.Diagnostics.Process.GetProcessesByName(stThisProcess).Length > 1 Then
'終了させる
System.Windows.Forms.MessageBox.Show("二重起動です。")
End If
end sub

再起動ボタンの処理
System.Windows.Forms.Application.Restart()

とやってるんですが、再起動をすると二重起動と判断されてしまいます。
再起動と二重起動を両立させることはできないんでしょうか?

閲覧数:
9,184
回答数:
3

違反報告

ベストアンサーに選ばれた回答

pot********さん

2009/1/2017:59:47

WindowsFormsApplicationBaseクラスを継承させたアプリケーションを起動すれば、たぶん望み通りのことができる。
Form1という名前のスタートアップフォームに、RestartButtonという名前のボタンが配置されているとして、以下のコードを貼り付けて実行してみてくれ。


'--------------------
'アプリケーションクラス
'--------------------
Public Class AppMain
Inherits Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
Private WithEvents mMainForm As System.Windows.Forms.Form

Public Sub New()
MyBase.New()
Me.IsSingleInstance = True '単一インスタンスのアプリケーションを作成する ※二重起動防止
Me.EnableVisualStyles = True 'XP Visualスタイルを有効にする
Me.SaveMySettingsOnExit = True 'シャットダウン時にMy.Settingsを保存する
End Sub

'スタートアップフォームの戻り値
Private mResult As DialogResult
Public ReadOnly Property MainFormResult() As DialogResult
Get
Return mResult
End Get
End Property

Protected Overrides Sub OnCreateMainForm()
'スタートアップフォームのインスタンスを作る
mMainForm = New Form1()
Me.MainForm = mMainForm
End Sub

Private Sub MainForm_Closed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles mMainForm.FormClosed
'スタートアップフォームの戻り値を取得する
If mMainForm IsNot Nothing Then
mResult = mMainForm.DialogResult
mMainForm = Nothing
End If
End Sub

Protected Overrides Sub OnStartupNextInstance(ByVal eventArgs As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs)
'二重起動を検出した時に何かしたければ、ここに書く
MessageBox.Show("二重起動です。")
MyBase.OnStartupNextInstance(eventArgs)
End Sub
End Class


'--------------------
'スタートアップフォームクラス
'--------------------
Public Class Form1
Private Sub RestartButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RestartButton.Click
Me.DialogResult = Windows.Forms.DialogResult.Retry
Me.Close()
End Sub
End Class


'--------------------
'エントリポイント(Sub Main())
'--------------------
Module EntryPoint
Public Function Main(ByVal args As String()) As Integer
Dim objApp As New AppMain
objApp.Run(args)

'スタートアップフォームの戻り値がリトライの場合は再起動する
If objApp.MainFormResult = DialogResult.Retry Then
System.Windows.Forms.Application.Restart()
End If

Return objApp.MainFormResult
End Function
End Module

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

jin********さん

2009/1/2009:40:24

こんなのは駄目ですか?

※作成したアプリケーションを abc.exe とする。

①二重起動判断後、abc.exe から別EXEを起動させる。

②abc.exe 終了

③別EXEから abc.exe を起動。

ttk********さん

2009/1/2009:32:36

難しいでしょうね。

Process.GetProcessesByName のところは自分と同じ名前のプロセスを探しているだけです。Application.Restart で再起動したときに、自分と同じ名前のプロセスが残った状態になっているということなら、それが Application.Restart の仕様なのでしょう。

GetProcessesByName で探す方法が無理となると、二重起動を防止する方法も適当なものがありません。相当ややこしい方法ならできるかも知れませんが、現実的ではないと思います。

それよりも Application.Restart はどういう目的で使っているのでしょう? Application.Restart を使わなくても良い仕組みを考えたほうが良い気がします。このメソッドは ClickOnce のときくらいしか普通は使わないものです。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる