3

.net CompactFramework3.5で実行されているハンドヘルドデバイスでの複数インスタンスの問題を阻止するために多くの方法を試したので。

現在、「Mutex」を作成して同じプロセスが実行されているかどうかを確認することで解決策を得ました。このステートメントを「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のクラスです。

4

1 に答える 1

6

あなたのコードはほとんど問題ありません。足りないのは、アプリケーション出口を削除して、現在実行中のインスタンスを最上位にするために必要なコードをそこに配置することだけです。私は過去にこれを行ったので、アイコンを無効にしたり非表示にしたりする必要はなく、すでに実行中のインスタンスを検出してフォアグラウンドに表示するだけです。

編集:

ここにいくつかのコードスニペット:

[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(コメントを含む)

Compact Frameworkでシングルインスタンスアプリケーションを作成するための最良の方法は何ですか?

于 2011-09-20T07:24:30.217 に答える