2013-10-02 3 views
0

У меня есть процедура, которая получает все открытые окна (процессы), а затем ищет ее имя класса с помощью метода GetClassName в user32. Но когда, например, Teamviewer находится на классах всех приложений, получите имя класса teamviewer.user32 GetClassName неверно

Пример: Блокнот открыт и TeamViewer на имя класса: «TeamViewer_TitleBarButtonClass» Блокнот открыт и TeamViewer от имя_класса: «Блокнот»

Я смотрел, как это произошло, и обнаружил, что Teamviewer ставит контроль на вершине некоторых окна приложений.

Так как я могу найти настоящее имя класса приложений, а не TeamViewer?

Process[] processes = Process.GetProcesses(); 
StringBuilder className = new StringBuilder(100); 
For (int i = 0; i < processes.Length; i++) 
    { 
      if (processes[i].MainWindowHandle != IntPtr.Zero) 
      { 
         list.Add(processes[i]); 
         GetClassName(processes[i].MainWindowHandle, className, className.Capacity); 
      } 
    } 
+0

Для чего вам нужно имя класса? Будет ли имя процесса в порядке? –

+0

Хорошо, мой коллега создал этот код передо мной. Она использовала имя класса, чтобы выбрать открытое окно и привести его вперёд и в заранее определенное положение. –

ответ

2

Эвристика, которую класс Process использует, чтобы угадать, какое окно является «основным» окном, не является совершенным. У приложения нет никакого способа пометить созданные им окна как «это главный». Таким образом, он стреляет наилучшим образом: первое окно. Это, конечно, может пойти не так, вы можете найти скрытое окно входа, например.

Альтернативой является перечисление потоков в процессе из Process.Threads, а затем для каждого потока перечислять окна, которым он владеет EnumThreadWindows(), вызывая GetClassName() для каждого. Вы увидите все окна и таким образом вы должны столкнуться с тем, что ищете. Использование EnumWindows() является альтернативой, когда не может быть выборочным в отношении процесса. Это также предотвращает крах, из-за которого ваш текущий код страдает, когда это происходит, чтобы перечислить процесс «Система» слишком рано.

Лучше всего заниматься интрузивным программным обеспечением, таким как «TeamViewer», это просто удалить его.

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