2012-07-11 5 views
0

Я пытаюсь взять имена процессов в виде строки из спискаBox в цикле for и искать все окна этих приложений. Когда я добавляю элементы вручную в listBox, он отлично работает; но когда я использую встроенный текстовый файл для хранения и загрузки имен процессов в listBox, он ищет все элементы, но находит только последний. Для других процессов Process.GetProcessesByName() генерирует исключение: Sequence не содержит элементов.EnumWindows не работает должным образом

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

} Спасибо.

ответ

1

Если GetProcessesByName не найдено ни одного процесса, соответствующего названию, в котором вы прошли (проверьте свой список), тогда он вернет пустой массив, а First() выдает InvalidOperationException. Вы, вероятно, следует использовать FirstOrDefault() и проверить null до получения Id:

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

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

Существует процесс согласования. Если я ищу его вручную так: (Process.GetProcessesByName («winword»). First(). Id)), он находит это. Но когда я пытаюсь выполнить поиск, используя этот listBox и цикл, он не работает. – gmnnn

+1

Возможно, вам нужно сделать 'listBox1.Items [i] .ToString(). Trim()'? –

+0

Ровно !! Большое спасибо! – gmnnn

Смежные вопросы