繁体   English   中英

包含所有打开窗口的窗口标题/句柄对的二维数组

[英]Bidimensional array containing window title/handle pair of all opened windows

有没有办法获得包含所有现有窗口的窗口标题和句柄对的二维数组?

我认为这需要首先获取所有打开的窗口的标题然后检索它们的句柄并从两个列表构建二维数组,但我不完全确定如何做到这一点。

我也知道它涉及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];

如您所见,存在一个问题,即阵列只有一种数据类型。 这意味着保持字符串和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);

好。 所以让我们解决一件事 - 我已经用字典愚弄了你一点点。 Dictio有一个约束:键必须是唯一的。 窗口标题可能是任何! 他们可能会重复,肯定会重复。 因此,您必须使用值SWAP键并形成一个Dictionary - 因为句柄不应该重复 - 否则您可以使用LINQ .ToLookup方法而不是.ToDictionary。 Lookup为单个键保存多个值,因此对于“Internet Explorer”窗口标题,它将能够保存15个句柄的列表等。

玩得开心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM