2

存在を確認したいのですが、存在しない場合は、エクスプローラーの右クリック(コンテキスト)メニューにいくつかのアクションを追加します。

上記の要件(Web上で簡単に解決策を見つけることができる)に加えて、もう1つ追加したいと思います。

次のコマンドを登録するとします。

  • 「コマンド#1」-「C:\ MyProg.exe/cmd1」をトリガーします
  • 「コマンド#2」-「C:\ MyProg.exe/cmd2」をトリガーします

... (そう。)

MyProg.exeの実行中のインスタンスがすでに存在するかどうかを確認し、ユーザーがクリックしたファイル名とともに適切なコマンド/コマンドラインパラメーターを渡すにはどうすればよいですか?

(IOW、プログラムのすでに実行中のインスタンスを使用してタスクを実行し、新しいタスクを開かないようにしたい)

Delphiコードスニペットをいただければ幸いです。

TIA

4

3 に答える 3

5

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

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

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

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

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

于 2010-01-02T11:38:01.180 に答える
2

いくつかの例を次に示します: http://delphi.about.com/od/adptips2006/qt/activaterunning.htm

于 2010-01-03T10:17:55.037 に答える
1

コンテキスト メニューに項目を追加するには、2 つの方法があります。

レジストリ

この方法は、いくつかのレジストリ キーを追加するだけなので簡単です。欠点は、ロジックを入れることができないことです。これについては、こちらとDelphi での簡単な例をご覧ください。メニュー項目の実行に DDE を使用している場合は、もう少し制御しやすくなります。Delphi の例については、こちらを参照してください。DDE が「すでに実行中」の問題を解決しない場合は、アプリケーションが IPC の何らかの方法で相互に通信できるようにしてみてください。

シェル エクステンション

この方法は少し手間がかかりますが、コードからコンテキスト メニューを完全に制御できます。DLL を作成し、 IContextMenu (またはその他) を実装し、DLL を Windows Explorer に登録する必要があります。ここでそれについて読むことができます。Shell+もチェックしてください。

于 2010-01-02T11:21:39.113 に答える