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

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

29.09.2018, 12:26. Показов 8136. Ответов 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
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
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
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
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
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
29.09.2018, 14:12
Странно, у меня XE4/XE8 нормально компилируют этот код.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
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
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
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
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru