【问题标题】:EnumWindows doesn't work properlyEnumWindows 无法正常工作
【发布时间】:2012-07-11 14:37:01
【问题描述】:

我正在尝试在 for 循环中将进程名称作为字符串从 listBox 中获取,并搜索这些应用程序的所有窗口。当我手动将项目添加到列表框时,它工作正常;但是当我使用嵌入的文本文件来存储进程名称并将其加载到 listBox 时,它会搜索所有项目但只找到最后一个项目。对于其他的,Process.GetProcessesByName() 会抛出异常:Sequence contains no elements。

[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;
}

搜索算法:

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);
    }
  }

} 谢谢。

【问题讨论】:

    标签: c# winapi


    【解决方案1】:

    如果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.GetProcessesByName("winword").First().Id)),它会找到它。但是当我尝试使用该 listBox 和 for 循环进行搜索时,它不起作用。
    • 也许你需要做listBox1.Items[i].ToString().Trim()?
    • 没错!!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2016-12-01
    • 2017-01-09
    • 1970-01-01
    • 2016-09-01
    • 2012-07-11
    • 2018-04-08
    • 2017-04-20
    • 2018-10-02
    相关资源
    最近更新 更多