2012-03-15 9 views
0

誰かがなぜこのコードをrunning only a single instance of an applicationの解決策として使用したのか、その理由を明かさずに不思議に思った。WINAPIを使用してアプリケーションの単一のインスタンスを保証しますか?

int hWnd = FindWindow(null, "My Application Title"); 
if (hWnd > 0) //If found 
{ 
    Process.GetCurrentProcess().WaitForExit(600); 
    try 
    { 
     SetForegroundWindow(hWnd); //Activate it 
     ShowWindow(hWnd, 9); 
     Process.GetCurrentProcess().Kill(); 
    } 
    catch (Exception ex) 
    { 
     //write to log 
    } 
} 

//Import the FindWindow API to find our window 
[DllImport("User32.dll")] 
public static extern int FindWindow(String ClassName, String WindowName); 
//Import the SetForeground API to activate it 
[DllImport("User32.dll")] 
public static extern IntPtr SetForegroundWindow(int hWnd); 
//Import the ShowWindow API to show it 
[DllImport("User32.dll")] 
public static extern bool ShowWindow(int hWnd, int nCmdShow); 

この方法の欠点を私に教えてもらえますか?ありがとう。

+2

'Process.GetCurrentProcess()。WaitForExit' ...何ですか? – SLaks

+0

@SLaks:他のインスタンスがシャットダウンしているかどうかをテストするだけです。 –

+0

@opatachibueze:うん?いいえ、そうではありません。 – SLaks

答えて

4

アプリケーションが二回(偶然のクリック)を開始した場合、テストは失敗します、時間の小さなウィンドウがありますので。両方のインスタンスが起動している可能性がありますが、いずれもまだウィンドウを作成していません。

+0

hmmm、ある意味があります。これは非常に遅いPCで起こる可能性がある、私は同意する。 –

+1

あなたのものではなく、どんなマシンでも:)。非常にまれに発生する競合状態を明示的に追加しているため、アプリケーションは「非常に慎重に開始する必要があるか、そうでない場合はマシンを再起動してやり直す必要がある」と徐々に認識されます。あなたは自分のマシン上で理由を見つけることができませんそれはあなたが見ているときに起こることは決してありません... –

+0

lol @AlexeiLevenkov面白い、私は同じ*ユーザーtell-story *経験を前に持っていた。 –

1

限り私が見ることができるような欠点は、それが簡単な解決策がどうあるべきかについて過度に複雑であるということです。あなたはapiの単一のインスタンスを強制的にウィンドウAPIにクラックする必要はありません。私はあなたがdownvotedになった理由だと思います。

あなたはウーヴェの答えのリンクをたどる場合、あなたは少し深く掘るなければならないいくつかの理由がない限り、あなたのデフォルトであるべきマネージコード、内に残ることができていることがわかります。

+0

WINAPIの使用についてはちょっと間違っていますか?私はそれが間違っているとは思わない。 –

+1

Windows APIを使用しても問題はありませんが、使用できる管理対象ラッパーがあります。私が得ようとしているのは、アンマネージドコードがより危険であり、より多くのケアを必要とするため、リスクを取る理由は何ですか? –

関連する問題