Обеспечение одного экземпляра приложения с использованием WINAPI? - PullRequest
0 голосов
/ 15 марта 2012

Мне стало любопытно, когда кто-то отверг этот код как решение для , запускающего только один экземпляр приложения , не указав причину этого.

 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 ]

4 голосов
/ 15 марта 2012

Поскольку, если приложение запускается дважды (случайный щелчок), существует небольшое окно времени, в котором тест не пройден.Оба экземпляра могут запускаться, но ни один из них еще не создал окно.

1 голос
/ 15 марта 2012

Недостатки, насколько я вижу, состоят в том, что это слишком сложно для того, что должно быть простым решением. Вам не нужно взломать API окон, чтобы вызвать один экземпляр API. Я полагаю, именно поэтому вы получили отрицательный голос.

Если вы перейдете по ссылкам в ответе Уве, вы увидите, что вы можете оставаться в управляемом коде, который должен использоваться по умолчанию, если только по какой-то причине вы ДОЛЖНЫ копать немного глубже.

...