Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 30.09.2016
Сообщений: 54
1

Как узнать класс окна другого процесса? Желательно найти класс окна по PID процесса

12.04.2019, 15:20. Просмотров 2036. Ответов 7
Метки нет (Все метки)

Мне нужно узнать класс другого окна по PID процесса
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.04.2019, 15:20
Ответы с готовыми решениями:

Как узнать ID процесса (PID) по дескриптору окна (Handle)?
АП. Интересует как узнать PID по Handle.

Перерисовка окна другого процесса через дескриптор этого окна
Приветствую всех. Может кто-то знает, как перерисовать окно другого процесса через дескриптор...

Вывод MessageBox из окна другого процесса
Помогите реализовать вывод меседжбокса из окна другого процесса

Получить ID процесса если известно его хэндл, название окна или название процесса
а как получить ID процесса если известно его хэндл, название окна или название процесса?

7
4362 / 3064 / 1321
Регистрация: 09.05.2015
Сообщений: 7,530
12.04.2019, 15:27 2
А если у процесса несколько окон с разными классами?
0
0 / 0 / 0
Регистрация: 30.09.2016
Сообщений: 54
12.04.2019, 15:31  [ТС] 3
Цитата Сообщение от Someone007 Посмотреть сообщение
А если у процесса несколько окон с разными классами?
Это не так важно. Моя программа работает с Sandbox. Мне нужно узнать у процесса есть ли в классе окна заголовок Sandbox:песочница:класс или нету.
0
906 / 809 / 208
Регистрация: 15.06.2012
Сообщений: 3,186
Записей в блоге: 1
12.04.2019, 15:38 4
.delete

Добавлено через 1 минуту
https://stackoverflow.com/ques... en-windows

C#
1
2
3
4
5
6
7
8
9
10
11
using System.Diagnostics;
 
Process[] processlist = Process.GetProcesses();
 
foreach (Process process in processlist)
{
    if (!String.IsNullOrEmpty(process.MainWindowTitle))
    {
        Console.WriteLine("Process: {0} ID: {1} Window title: {2}", process.ProcessName, process.Id, process.MainWindowTitle);
    }
}
0
0 / 0 / 0
Регистрация: 30.09.2016
Сообщений: 54
12.04.2019, 15:41  [ТС] 5
Цитата Сообщение от Wolfdp Посмотреть сообщение
Ну если речь про .net, то можно глянуть путь exe, подключить ее в рантайме, и выдернуть все обьекты что реализуют Form.
Если там несколько окон -- разве что декомпилить и смотреть какое вызывается в Main(). А вот как получить активное окно... по ходу выгружать дамп процесса и рыть его )
p.s. а зачем вообще нужен класс окна?
Например если основное приложение запущено в обычном режиме, а моя программа в песочнице или наоборот, то они друг на друга не могут повлиять. А если обе программы запущены в обычном режиме или обе программы запущены в песочнице, то они могут повлиять друг на друга. В моем случае нужно заменить файлы в папке с игрой.
0
0 / 0 / 0
Регистрация: 30.09.2016
Сообщений: 54
12.04.2019, 15:47  [ТС] 6
Это не совсем то, что мне нужно. Вот примеры того, что мне нужно получить.
Эти строки были получены с помощью программы BotMek. В Spy++ такая же реализация есть
0
Миниатюры
Как узнать класс окна другого процесса? Желательно найти класс окна по PID процесса  
Изображения
 
4362 / 3064 / 1321
Регистрация: 09.05.2015
Сообщений: 7,530
12.04.2019, 16:20 7
Лучший ответ Сообщение было отмечено race99 как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
 
        delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);
 
        [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;
        }
 
        static string GetClassName(IntPtr hWnd)
        {
            StringBuilder className = new StringBuilder(256);
            int nRet = GetClassName(hWnd, className, className.Capacity);
            return nRet != 0 ? className.ToString() : null;
        }
C#
1
2
3
4
5
6
        var windows = EnumerateProcessWindowHandles(pid);
 
        foreach (var win in windows)
        {
            Console.WriteLine($"{(int)win:X8}: {GetClassName(win)}");
        }
1
0 / 0 / 0
Регистрация: 30.09.2016
Сообщений: 54
12.04.2019, 16:51  [ТС] 8
Спасибо. Хорошая реализация. А как сделать чтобы отображалась только первая строка?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2019, 16:51

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как получить все дочерние окна процесса?
Получаю все процессы, нахожу нужный, но мне еще нужны вложенные окна типа Ebit и им подобным,...

Завершение процесса при обнаружении другого процесса
Здравствуйте. Люди добрые подскажите пожалуйста как мне быть. Есть приложение которое следит за...

Как определить PID процесса или имя по сети
Программа перехватывает с сетевого адаптера сетевые пакеты. Я возвращаю IP И порт . Как определить...

Как узнать заголовок окна по PID процесса
Тут Я скрываю окно по Заголовку программы. У меня не большой вопрос как узнать Заголовок окна на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.