2

タイトル通り、インスタンスプログラムを一つ作り、別インスタンス起動時にMainWindowを表示したい。許可されるインスタンスは 1 つだけであるというメッセージを表示することができました。

public class MyApplication
{
static Mutex mutex = new Mutex(true, "FirstInstance");
    [STAThread]
    public static void Main(string[] args)
    {
        if (mutex.WaitOne(TimeSpan.Zero, true))
        {
            App app = new App();
            app.InitializeComponent();
            app.Run();
        }
        else
        {
            MessageBox.Show("only one instance at a time");
        }
    }
}

これはうまくいきますが、メッセージではなくMainWindowを表示したいので、試してみました

static Application app;//change app to static
if (mutex.WaitOne(TimeSpan.Zero, true))
        {
            app = new App();
            app.InitializeComponent();
            app.Run();
        }  
else
{
    app.MainWindow.WindowState = WindowState.Normal;
}

「System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません」というメッセージが表示されます。アプリの MainWindow (静的) が null のようですが、理由はわかりません。

そこで、この記事を試してみましたhttp://sanity-free.org/143/csharp_dotnet_single_instance_application.html しかし、WndProc メソッドは WPF に存在しません。

助けていただければ幸いです。ありがとう!

4

2 に答える 2

0

私があなたの質問を誤解していない場合は、このようなことを試してください

[STAThread]
    public static void Main(string[] args)
    {
        Task task = new Task(() => { Thread.Sleep(200); MessageBox.Show("what a marvelous engineering"); });
        task.Start();
        //If you want application not to run untill task is complete then just use wait
        task.Wait();

            App app = new App();
            app.InitializeComponent();
            app.Run();
    }

しかし、MainWindow をインスタンス化する前に C# の作業を完了させたいのであれば、App app=new App() の直前に他の作業を行って、コードを順次実行させないでください。

于 2013-07-21T14:23:07.500 に答える