Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/40: Рейтинг темы: голосов - 40, средняя оценка - 4.75
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648

Узнать HWND главного окна процесса имея его имя?

29.09.2018, 12:26. Показов 8163. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Запускаем калькулятор Windows.
Имя этого процесса (полученное с использованием PROCESSENTRY, CreateToolhelp32Snapshot) "calc.exe".
Нужно найти HWND окна.
C++
1
2
3
    HWND hwnd;
    hwnd = FindWindow(0,"calc.exe");
    Label2->Caption = IntToStr(hwnd);
выдаёт ноль.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.09.2018, 12:26
Ответы с готовыми решениями:

Узнать имя процесса имея HWND
Возник такой вопрос: как можно узнать имя процесса, имея его HWND? Добавлено через 18 минут Точнее имея HWND окна процесса

Нужно узнать имя и путь исполняемого файла, имея handle его окна
Нужно узнать имя и путь исполняемого файла, имея handle его окна. Когда используешь handle текущего окна - всё работает: long...

Как узнать имя окна (обьекта), зная его хэндл?
Допустим, хэндл окна я узнаю так: HANDLE h=WindowFromPoint(Mouse->CursorPos); Класс так: GetClassName(h,p,100); А как узнать имя...

11
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
29.09.2018, 12:44
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

По PID не устроит?
0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
29.09.2018, 13:17  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
не устроит
то что мне нужно, только как это прилепить и запустить пока не пойму. На всякий случай вот код функции получения ID по имени процесса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DWORD GetPIDbyName(LPTSTR szProcessName)
{
    HANDLE hSnapShot;
    PROCESSENTRY32 pe = {sizeof(pe)};
    hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    if (hSnapShot == INVALID_HANDLE_VALUE)
        return 0;
    if (!Process32First(hSnapShot, &pe))
        return 0;
    do
        if(!lstrcmpi(pe.szExeFile,szProcessName))
        {
            CloseHandle(hSnapShot);
            return pe.th32ProcessID;
        }
    while (Process32Next(hSnapShot, &pe));
    CloseHandle(hSnapShot);
    return 0;
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
29.09.2018, 13:20
C++
1
    HWND w = find_main_window(GetPIDbyName(process_name));
?
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
29.09.2018, 13:22  [ТС]
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
26
27
28
29
30
struct handle_data
{
    unsigned long process_id;
    HWND window_handle;
};
BOOL is_main_window(HWND handle)
{
    return GetWindow(handle, GW_OWNER) == (HWND)0 && IsWindowVisible(handle);
}
BOOL CALLBACK enum_windows_callback(HWND handle, LPARAM lParam)
{
    handle_data& data = *(handle_data*)lParam;
    unsigned long process_id = 0;
    GetWindowThreadProcessId(handle, &process_id);
    if (data.process_id != process_id || !is_main_window(handle))
        return TRUE;
    data.window_handle = handle;
    return FALSE;
}
 
 
 
HWND find_main_window(unsigned long process_id)
{
    handle_data data;
    data.process_id = process_id;
    data.window_handle = 0;
    EnumWindows(enum_windows_callback, (LPARAM)&data);
    return data.window_handle;
}
в строке
C++
1
EnumWindows(enum_windows_callback, (LPARAM)&data);
ошибка:
Build
[C++ Error] Unit1.cpp(83): E2034 Cannot convert 'int (__stdcall *)(void *,long)' to 'int (__stdcall *)()'
[C++ Error] Unit1.cpp(83): E2342 Type mismatch in parameter 'lpEnumFunc' (wanted 'int (__stdcall *)()', got 'int (__stdcall *)(void *,long)')
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
29.09.2018, 14:12
Странно, у меня XE4/XE8 нормально компилируют этот код.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
29.09.2018, 17:44
jkrnd, а для BCB6 нужно сделать вот такой финт:
C++
1
    ::EnumWindows((WNDENUMPROC)enum_windows_callback, (LPARAM)&data);
, тогда оно тоже должно компилироваться и работать.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
29.09.2018, 19:27  [ТС]
компилируется, но не работает
C++
1
2
3
4
5
6
7
8
9
HWND find_main_window(unsigned long process_id)
{
    handle_data data;
    data.process_id = process_id;
    data.window_handle = 0;
    ::EnumWindows((WNDENUMPROC)enum_windows_callback, (LPARAM)&data);
    //EnumWindows(enum_windows_callback, (LPARAM)&data);
    return data.window_handle;
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
29.09.2018, 19:33
Вот специально проверил. Запустил тот же calc, и по его PID-у нашел хендл главного окна. Все сработало, хендл правильный. BCB6/Win2000 (на другие версии Windows это старье устанавливать не хочу, оно для них не предназначено).
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
01.10.2018, 09:41  [ТС]
volvo, извините за задержку. Когда я ставлю точку останова за строкой
C++
1
HWND w = find_main_window(GetPIDbyName(process_name));
а потом навожу мышку на переменную w, я вижу нечто вроде :0002068C. Это и сбивает с толку. Я ожидаю увидеть под переменной целое число и пытаюсь отобразить его в метке, поэтому ничего не получается. Выходит HWND это адрес?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
01.10.2018, 09:53
Цитата Сообщение от jkrnd Посмотреть сообщение
Выходит HWND это адрес?
HWND - это указатель, разумеется, что в нем хранится адрес...
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
01.10.2018, 10:51  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
HWND - это указатель
как узнать что за число находится по адресу на который указывает HWND?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.10.2018, 10:51
Помогаю со студенческими работами здесь

Как узнать HWND созданного только что SendMessage окна? и желательно без FindWindow
заранее спасибо если чо, то FindWindow почему то не работает. Добавлено через 54 минуты Я задумался и решил что это как будто...

Узнать HWND главного окна.
Здравствуйте! Как мне узнать HWND окна моего приложения, которое я создаю в Visual C++ Express через меню...

Найти HWND окна, зная HWND окна, породившего его
Здравствуйте! Имеется основное окно "А". Это окно создаёт новое недочернее окно "Б". Необходимо найти HWND окна "Б",...

Определить заголовок(имя) окна, зная PID его процесса
Сабж! Уже 2ой день не могу найти - как? У меня известе PID и hwnd процесса, как узнать имя окна(то есть название окна, которое отображается...

Как узнать Handle или PID процесса, зная его имя и класс?
Как узнать Handle или PID процесса, зная его имя и класс?


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru