2011-09-19 3 views
2

.net Compact Framework 3.5에서 실행되는 휴대용 장치에서 여러 인스턴스 문제를 막으려 고 여러 가지 방법을 시도해 보았습니다..NET Compact Framework에서 다중 인스턴스를 완전히 방지 할 수 있습니까?

현재 "뮤텍스"를 생성하고 같은 프로세스가 실행 중인지 확인하여 솔루션을 얻었습니다. 나는 프로그램 시작시 처음 실행될 "Program.cs"에이 문장을 넣었습니다.

하지만 내 문제는 사용자가 프로그램 아이콘을 실행 중지하는 동안 사용 중지해야한다는 요청을 받았기 때문에 발생하지 않는 것 같습니다.

나는 짧은 시일 내에 프로그램을 여러 번 열어 볼 수 있다는 사용자의 입장을 이해합니다. 그래서, 여전히 "열 수"있다면. 즉, 프로그램 자체를 초기화해야하고 결국 실패 할 수도 있습니다. 다중 인스턴스를 절대적으로 방지 할 수 있습니까? 또는 Windows CE에서 레지스트리를 편집하는 것과 같은 프로그래밍없이 다른 방법이 있습니까?

bool firstInstance; 
NamedMutex mutex = new NamedMutex(false, "MyApp.exe", out firstInstance); 

if (!firstInstance) 
{ 
    //DialogResult dialogResult = MessageBox.Show("Process is already running..."); 
    Application.Exit(); 
} 

NamedMutex이 OpenNetCF에서 클래스 :


여기 내 소스 코드입니다.

답변

5

코드가 거의 정상입니다. 누락 된 것은 응용 프로그램 종료를 제거하고 거기에 현재 실행중인 인스턴스를 가져 오는 데 필요한 코드를 넣는 것입니다. 이전에이 작업을 수행 했으므로 아이콘을 비활성화하거나 숨길 필요가 없습니다. 이미 실행중인 인스턴스를 감지하여 포 그라운드로 가져 오면됩니다.

편집 : 여기

일부 코드 :

[DllImport("coredll.dll")] 
private static extern IntPtr FindWindow(IntPtr className, string windowName); 

[DllImport("coredll.dll")] 
internal static extern int SetForegroundWindow(IntPtr hWnd); 

[DllImport("coredll.dll")] 
private static extern bool SetWindowPos(IntPtr hwnd, int hwnd2, int x,int y, int cx, int cy, int uFlags); 

if (IsInstanceRunning()) 
{ 
    IntPtr h = FindWindow(IntPtr.Zero, "Form1"); 
    SetForegroundWindow(h); 
    SetWindowPos(h, 0, 0, 0, Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height, 0x0040); 

    return; 
} 

체크 대한 추가 정보를 원하시면 다음 링크 ...

http://www.nesser.org/blog/archives/56 (포함 댓글)

What is the best way to make a single instance application in Compact Framework?

+0

티 행크스 대단한 Davide :) 자, 당신이 말했듯이 현재 실행중인 인스턴스를 가져 오는 코드를 찾고 있습니다. 하지만, 나는 몇 가지 질문을했습니다. 사용자가 프로그램을 열기 위해 클릭 한 이후로 여전히 "Application.Exit()"원인이 필요하다고 생각합니다. 즉 새로운 인스턴스가 만들어 졌다는 뜻입니다. 따라서 메모리를 절약하려면 자체 종료해야합니다. 이게 옳은 거니 ? –

+0

위의 내용을 확인하십시오. 반환이 있습니다. 당신은 리턴 또는 Application.Exit과 함께 작동하는 방법을 테스트 할 수 있습니다. 어쨌든 Application.Run을 호출하지 않으면 새 인스턴스가 종료되어야합니다. 다른 인스턴스가 이미 실행 중일 때 ... :) –

+0

Davide, Thx a 많이 도와 줘. 내가 당신의 코드에서 본 것. 전경에 맞게 특정 창을 지정할 필요가 있습니까? –

관련 문제