Если вам нужны координаты окна для окна, уже находящегося в вашем процессе, есть другие способы получить дескриптор окна, который не требует перечисления процессов.
Для окон WinForms используйте свойство Handle
.
System.Windows.Forms.Control ... Обрабатывать свойство @ MSDN
Для приложений WPF используйте WindowInteropHelper
System.Windows.Interop ... WindowInteropHelper Class @ MSDN
Если вы пытаетесь перечислить окна, к которым у вас нет доступа напрямую из .NET; скажем, от стороннего элемента управления, который создает окно верхнего уровня вне области вашего кода, вы можете перечислить с помощью функции win32 EnumWindows
.
EnumWindows (Win32) @ MSDN
Подписи для P / Invoke для EnumWindows доступны здесь:
User32.dll EnumWindows @ pinvoke.net
Добавлено:
Похоже, вы хотите перечислить все окна и связанные процессы. Используйте EnumWindows
, затем вызовите GetWindowThreadProcessId
, чтобы получить связанный идентификатор процесса и неуправляемого потока для каждого окна.
GetWindowThreadProcessId (Win32) @ MSDN
Подпись P / Invoke доступна здесь:
User32.dll GetWindowThreadProcessId @ pinvoke.net
Наконец, вы можете получить объект Process с помощью статического метода GetProcessById
.
Process.GetProcessById @ MSDN
Добавлено (# 2):
Вот короткая консольная программа, которая может перечислять окна, идентификаторы процессов и потоков. Есть несколько отличий от вашего фрагмента.
- Я использую IntPtr, а не HandleRef. Как отмечали другие люди, это может сбить вас с толку.
- Я не указал атрибут
return
. Если это необходимо, вы сможете добавить его обратно.
- Я работаю администратором; некоторые вещи могут работать по-другому, если вы работаете с привилегиями уровня пользователя.
Пример исходного кода C # @ gist.github