Я пытаюсь взять имена процессов в виде строки из списка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);
}
}
} Спасибо.
Существует процесс согласования. Если я ищу его вручную так: (Process.GetProcessesByName («winword»). First(). Id)), он находит это. Но когда я пытаюсь выполнить поиск, используя этот listBox и цикл, он не работает. – gmnnn
Возможно, вам нужно сделать 'listBox1.Items [i] .ToString(). Trim()'? –
Ровно !! Большое спасибо! – gmnnn