2012-03-15 2 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

Хммм, имеет смысл. Я согласен, это может произойти на очень медленном ПК. –

+1

На любой машине, только не ваш :). Вы явно добавляете условие гонки, которое произойдет очень редко, поэтому приложение постепенно станет известно как «тот, который вам нужно начинать очень осторожно, иначе перезагрузите компьютер и повторите попытку». Вы не сможете найти причину на своей машине, она никогда не случится, когда вы смотрите ... –

+0

lol @AlexeiLevenkov Забавный, у меня уже был подобный * пользовательский рассказ *. –

1

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

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

+0

Что именно * слегка * неправильно в использовании WINAPI? Я не вижу в этом ничего плохого. –

+1

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

Смежные вопросы