既存のすべてのウィンドウのウィンドウ タイトルとハンドルのペアを含む 2 次元配列を取得する方法はありますか?
これには、最初に開いているすべてのウィンドウのタイトルを取得してから、それらのハンドルを取得し、2 つのリストから 2 次元配列を作成する必要があると思いますが、その方法が完全にはわかりません。
メソッドが関係していることも知っていますが、そのProcess.GetProcesses()
方法が完全にはわかりません。
既存のすべてのウィンドウのウィンドウ タイトルとハンドルのペアを含む 2 次元配列を取得する方法はありますか?
これには、最初に開いているすべてのウィンドウのタイトルを取得してから、それらのハンドルを取得し、2 つのリストから 2 次元配列を作成する必要があると思いますが、その方法が完全にはわかりません。
メソッドが関係していることも知っていますが、そのProcess.GetProcesses()
方法が完全にはわかりません。
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspxを見て、MainWindowTitle および MainWindowHandle プロパティについて読んでください。
GetProcesses メソッドは、まさにそのような Process オブジェクトのリストを返します。したがって、詳細な形式で:
Process[] procs = Process.GetProcesses();
object[,] thearray = new object[procs.Length,2];
for(int i=0;i<procs.Length;++i)
{
thearray[i,0] = procs[i].MainWindowTitle;
thearray[i,1] = procs[i].MainWindowHandle;
}
そしてこれです。N 番目のプロセス情報を取得する場合は、次のようにします。
string title = (string)thearray[n][0];
IntPtr handle = (IntPtr)thearray[n][1];
ご覧のとおり、配列のデータ型が 1 つしかないという問題があります。つまり、文字列と IntPtr (ハンドル) を保持すると、最も一般的な「オブジェクト」型である共通のスーパー型を見つける必要があります。したがって、[0] のオブジェクトが実際には文字列であることを知っているのはあなただけなので、データを読み取るときにキャストする必要があります。
Dictionary クラスの使用を検討してください。そうすれば、データは適切に型付けされますが、プロセスの「順序」が失われます。それらはランダムにソートされます。しかし、この時点でとにかく注文が必要だったとは思いませんか? ここのコードを参照してください:
Process[] procs = Process.GetProcesses();
Dictionary<string, IntPtr> theMap = new Dictionary<string,IntPtr>();
foreach(var p in procs)
theMap[p.MainWindowTitle] = p.MainWindowHandle;
そしてこれです。プロセス情報を読みたい場合は、次のようにします。
foreach(var aPair in theMap)
{
string title = aPair.Key;
IntPtr handle = aPair.Value;
...
}
Dictionary を使用すると、N 番目の要素へのアクセスが少し難しくなりますが、通常は必要ありません。必要に応じて、LINQ をツールセットに追加できます。
using System.Linq;
var myNthPair = theMap.ElementAt(n);
string title = myNthPair.Key;
IntPtr handle = myNthPair.Value;
それほど悪くはありません。LINQ が手元にあるので、最初の辞書作成コードをさらに短く書くことができます。
var theMap = Process.GetProcesses().ToDictionary(p => p.MainWindowTitle, p => p.MainWindowHandle);
Ok。では、1 つのことを修正しましょう。辞書で少しだまされてしまいました。Dictio には制約があります。キーは一意でなければなりません。そして、ウィンドウのタイトルは何でも構いません! 彼らは繰り返すかもしれませんし、きっとそうするでしょう。したがって、キーを値と交換し、ディクショナリを形成する必要があります (ハンドルが繰り返されないようにするため)。そうしないと、.ToDictionary の代わりに LINQ .ToLookup メソッドを使用できます。ルックアップは 1 つのキーに対して複数の値を保持するため、「Internet Explorer」ウィンドウ タイトルの場合、15 個のハンドルのリストを保持できます。
楽しむ。