C# EnumWindows不';我不能正常工作

C# EnumWindows不';我不能正常工作,c#,winapi,C#,Winapi,我试图从for循环的列表框中将进程名作为字符串,并搜索这些应用程序的所有窗口。当我手动将项目添加到列表框中时,效果很好;但是,当我使用嵌入式文本文件存储进程名称并将其加载到列表框时,它会搜索所有项目,但只找到最后一个项目。对于其他的,Process.getProcessByName()抛出一个异常:序列不包含任何元素 [DllImport("user32.dll")] static extern bool EnumThreadWindows(int dwThreadId, EnumThreadD

我试图从for循环的列表框中将进程名作为字符串,并搜索这些应用程序的所有窗口。当我手动将项目添加到列表框中时,效果很好;但是,当我使用嵌入式文本文件存储进程名称并将其加载到列表框时,它会搜索所有项目,但只找到最后一个项目。对于其他的,Process.getProcessByName()抛出一个异常:序列不包含任何元素

[DllImport("user32.dll")]
static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam);

static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processId)
{
    var handles = new List<IntPtr>();
    foreach (ProcessThread thread in Process.GetProcessById(processId).Threads)
        EnumThreadWindows(thread.Id, (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);

    return handles;
}
[DllImport(“user32.dll”)]
静态外部bool EnumThreadWindows(int-dwThreadId、EnumThreadDelegate-lpfn、IntPtr-LPRAM);
静态IEnumerable EnumerateProcessWindowHandles(int-processId)
{
var handles=newlist();
foreach(Process.GetProcessById(processId.Threads)中的ProcessThread线程)
EnumThreadWindows(thread.Id,(hWnd,lParam)=>{handles.Add(hWnd);返回true;},IntPtr.Zero);
返回手柄;
}
搜索算法:

public void searchForApplications()
{
  for (int i = 0; i < listBox1.Items.Count; i++)
  {
    try
    {
     foreach (var handle in EnumerateProcessWindowHandles
        (Process.GetProcessesByName(listBox1.Items[i].ToString()).First().Id))
        {
          StringBuilder message = new StringBuilder(1000);
          SendMessage(handle, WM_GETTEXT, message.Capacity, message);

          if (message.ToString().Length > 0)
          {
            addNewApplication(new Applications(message.ToString(), message.ToString(),
                   int.Parse(handle.ToString())));
          }
        }
    }
    catch (Exception ex)
    {
       MessageBox.Show(ex.Message);
    }
  }
public void searchForApplications()
{
对于(int i=0;i0)
{
addNewApplication(新应用程序(message.ToString()、message.ToString()、message.ToString()),
int.Parse(handle.ToString());
}
}
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
}
谢谢。

如果
GetProcessesByName
没有找到任何与您传入的名称匹配的进程(检查列表),那么它将返回一个空数组,
First()
将抛出一个
InvalidOperationException
。在获取Id之前,您可能应该使用
FirstOrDefault()
并检查
null

// ...
var process = Process.GetProcessesByName(listBox1.Items[i].ToString()).FirstOrDefault();

if (process != null)
{
    foreach (var handle in EnumerateProcessWindowHandles(process.Id))
    {
        // ...
    }
}
// ...

有一个匹配的过程。如果我像这样手动搜索:(Process.getProcessByName(“winword”).First().Id)),它会找到它。但是当我尝试使用该列表框和for循环进行搜索时,它不起作用。也许您需要执行
listBox1.Items[I].ToString().Trim()
?完全正确!!非常感谢你!