4

ミューテックスを使用してコードを試してみましたが、ボタンをクリックした後にexeを開くことができませんボタンをクリックしたときにタスクバーにアプリケーションの複数のエントリを作成することに成功しましたが、フォームを閉じたときにのみアプリケーションが起動されます..ボタンのクリックでアプリケーションを起動するには、アプリケーションが既に起動されている場合は、以前に実行中のアプリケーションに集中する必要があります..どうすれば起動する必要があるかを解決し、そのアプリケーションにフォーカスして再度開くことができます..あなたを送信していますボタンクリックイベントで使用している私のコードとplzは私のエラーを修正します...

program.cs でのコーディング

static void Main()  
{

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    Application.Run(new Form1());
    System.Diagnostics.Process.Start("filename.exe");
}

:

コーディングは form1.cs で行います

private void button1_Click(object sender, EventArgs e)
{
    try
    {
       bool createdNew;
       Mutex m = new Mutex(true, "e-Recording", out createdNew);
       System.Diagnostics.ProcessStartInfo f = new System.Diagnostics.ProcessStartInfo("C:\\windows\\system32\\rundll32.exe", "C:\\windows\\system32\\shimgvw.dll,ImageView_Fullscreen " + "filename.exe".TrimEnd(null));

        if (createdNew) Launch();

        else
        {
             MessageBox.Show("e-Recording is already running!", "Multiple Instances");
         }
     }
     catch (Exception ex)
     {
          System.Diagnostics.Debug.WriteLine(ex.ToString());
     }
}
4

3 に答える 3

2

これにより、開始しようとしているものと一致する既に実行中のプロセスを見つけて切り替えることができます。

[DllImport( "user32.dll" )]
public static extern bool ShowWindowAsync( HandleRef hWnd, int nCmdShow );
public const int SW_RESTORE = 9;

public void SwitchToCurrent() {
  IntPtr hWnd = IntPtr.Zero;
  Process process = Process.GetCurrentProcess();
  Process[] processes = Process.GetProcessesByName( process.ProcessName );
  foreach ( Process _process in processes ) {
    // Get the first instance that is not this instance, has the
    // same process name and was started from the same file name
    // and location. Also check that the process has a valid
    // window handle in this session to filter out other user's
    // processes.
    if ( _process.Id != process.Id &&
      _process.MainModule.FileName == process.MainModule.FileName &&
      _process.MainWindowHandle != IntPtr.Zero ) {
      hWnd = _process.MainWindowHandle;

      ShowWindowAsync( NativeMethods.HRef( hWnd ), SW_RESTORE );
      break;
    }
  }
 }
于 2010-02-22T23:32:06.390 に答える
1

Delphi に関する質問への回答をしばらく前に投稿しました。私は Delphi のバックグラウンドを持っていないことを説明しましたが、実行中のインスタンスをアクティブ化するだけでなく、.NET リモート処理でプロセス間通信 (IPC) を使用するコンポーネントを構築するために C# で行ったことの概要を説明しました。 2 番目のインスタンスから最初のインスタンスへのコマンド ライン パラメータ。このすべての機能をラップする非常にシンプルなコンポーネントにリンクしました。それはあなたに役立つかもしれません。

彼女は他の質問からの私の答えです:

これを行う最善の方法は、実際には exe のスタートアップ コードにあります。つまり、Explorer が exe の 2 番目のコピーを起動し、それが既に実行されていることを検出し、実行中のインスタンスにメッセージを送信するようにします。

個人的には、Delphi の経験はほとんどありませんが、.NET アプリケーションでこれを行った方法は、ミューテックスとプロセス間通信チャネルを使用することでした。

一般的な考え方は、アプリケーションの最初のインスタンスが開始され、IPC チャネルでリッスンを開始するというものでした。また、名前付きプロセス間ミューテックスも作成します。2 番目のインスタンスが起動されたとき、同じ名前のミューテックスを作成できませんでした。これは、以前のインスタンスが実行され、IPC チャネルで呼び出しをリッスンしていたことを意味します。次に、2 番目のインスタンスがコマンド ライン引数を IPC 経由で最初のインスタンスに送信し、最初のインスタンスがそれらに対してアクションを実行しました。2 番目のインスタンスは、UI を表示せずに終了します。

このコンポーネント (C#) のコードをアップロードしました。リンクは以下のとおりです。外部依存関係はないと思いますし、Delphi で同等の通信メカニズムがどのようなものになるかはわかりませんが、これでいくつかのアイデアが得られることを願っています。

InstanceManager コンポーネント (C#)

于 2010-02-04T06:01:01.747 に答える
-1

セキュリティ上の理由から、名前付きミューテックスの使用は推奨されないことに注意してください。どのプロセスでも (ゲスト アカウントで実行されているプロセスでも)、プロセスが開始される前に同じ名前のミューテックスを作成できます。通常、これらのセキュリティ問題を解決することは、名前付きミューテックスをまったく使用しないことよりも困難です。

問題を解決するには、プロセス ハンドラーまたはプロセス ID を保存し、そのプロセス ID を持つウィンドウを探すだけです。これは、タスク マネージャーの動作に似ています。

于 2010-02-26T07:46:40.873 に答える