私は、アドオンの変更を記述したアプリケーション(たとえばアプリケーションA)を操作します。
アプリケーションAには、スクリプトがクラスライブラリまたはexeファイルを呼び出せるようにする機能があります。これは、アプリケーションAによって作成されたパラメーターオブジェクトを取得し、それをクラスライブラリに渡すことによって機能します(アプリケーションBと呼びます)。
アプリケーションAはほとんどブラックボックスであり、コードがどのように見えるか、または何をするのかわかりません。アプリケーションAからパラメーターオブジェクト(呼び出し側プログラムに関する関連情報を含む、たとえば、現在のユーザー、ユーザー言語、アプリケーションBが起動されたアイテムなど)をアプリケーションBに渡すスクリプト形式があります。このスクリプト機能アプリケーションAの一部である管理者パネルを使用して設定されます。
ランチャースクリプトは、アプリケーションBが開いている間(データチェックなど)にユーザーがアプリケーションAにアクセスできる必要があるため、アプリケーションBを開かform.Show()
ないように使用する必要があります。form.ShowDialog()
form.Show()
アプリケーションBはを使用して起動されたため、現在可能な限り複数回開かないようにしたいと思いますが、form.ShowDialog()
これを行うための適切な方法が見つからないようです。
最初に現在のプロセスを確認しようとしましたが、アプリケーションAによって起動されるため、アプリケーションBがここにリストされていないことがわかりました。
- M3セールスオートメーションはアプリケーションAです
- 新規顧客はアプリケーションBです
これは、私のタスクマネージャーからの次のスクリーンショットから見ることができます。
M3 SalesAutomationとNewCustomerの両方がアプリケーションセクションにリストされていますが、M3SalesAutomationのみがプロセスセクションにリストされています。
最初にプロセスにアクセスしようとしましたが、実際にはそこにリストされていないため、それを確認できず、もう少し深く調べる必要があることがわかりました。ここでさらにチェックを行ったところ、NewCustomer.dllが現在のプロセスのProcessModulesにリストされていることがわかりました。
ランチャースクリプトで次のコードを使用して情報を取得しました。
public void GetProcessModules()
{
ProcessModuleCollection modules = Process.GetCurrentProcess().Modules;
string modulesOutput = string.Empty;
foreach (ProcessModule pm in processModuleCollection)
{
modulesOutput += pm.ModuleName + ";\r\n";
}
MessageBox.Show(modulesOutput, "Modules");
}
これにより、アプリケーションAの一部であるdllの長いリストが出力されました。これで、NewCustomer.dllが複数回リストされているかどうかを確認し、これが発生した場合は、アプリケーションが既に開いているため、アプリケーションの起動を防ぐことができると思いました。 。ただし、これは当てはまらず、NewCustomer.dllは、開いている回数に関係なく1回だけリストされます。
そこで、次の考えは、[タスクマネージャーのアプリケーション]タブに表示されているものにアクセスできるかどうかを確認することです。私のプログラムがそこにリストされている場合、それが再び開かないようにしたいです。
誰かがこれを達成する方法について何かアイデアがありますか?
何を検索すればよいのかさえわかりません。検索しようとするたびに、ここでは関係のないプロセスを調べることについて話している回答が得られます。