Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить HWND окна, .... 
:(
    Опции темы
Plamenk
Дата 24.7.2003, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



Всем привет!!!

Можно ли зная HANDEL и индефикатор процесса получить HWND окна?

Заранее всем СПАСИБО!!!
PM MAIL   Вверх
PostEr
Дата 24.7.2003, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 282
Регистрация: 30.6.2003
Где: Самара

Репутация: 1
Всего: 1



Хэндл процесса или хэндл окна? smile.gif

Кстати, хэндл пишется handle, а не handel smile.gif

По-моему, идентификатор процесса ни о чём не говорит, т.к. два окна могут быть одним процессом, поэтому лучше использовать функцию для получения HWND по имени. Я умею делать только последнее smile.gif


--------------------

------------------------------------------------------------------

[email protected]
До востребования

PM MAIL WWW ICQ   Вверх
p0s0l
Дата 25.7.2003, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Можно.
Процесс имеет >= 1 Threads (нити или потоки), а каждый Thread может иметь окна.
Тебе надо посмотреть, какие Threads принадлежат твоему процессу, а там уж взять Handle нужного окна. Если бы ты прогал в дельфи - там есть специальный модуль для таких целей - TlHelp32.
Он (этот модуль) юзает kernel32.dll - так что глянь исходник этого модуля и посмотри какие используются функции.



--------------------
С уважением, г-н Посол.
PM   Вверх
Plamenk
Дата 25.7.2003, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



Как определить handle окна зная индефикаторы Threads я знаю, но как определить индефикаторы Threads принадлижащие процессу.
PM MAIL   Вверх
PostEr
Дата 25.7.2003, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 282
Регистрация: 30.6.2003
Где: Самара

Репутация: 1
Всего: 1



Блин, откуда вы все такие умные??


--------------------

------------------------------------------------------------------

[email protected]
До востребования

PM MAIL WWW ICQ   Вверх
p0s0l
Дата 25.7.2003, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Вот сбацал пример:

Код
#include <tlhelp32.h>

BOOL CALLBACK fnEnum(HWND hnd, LPARAM lParam)
{
// do something with hnd..., например:
 Form1->ListBox1->Items->Add(IntToStr(DWORD(hnd)));
 return(TRUE);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 DWORD pid = GetCurrentProcessId();
 HANDLE hnd_hlp = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
 THREADENTRY32 te;
 te.dwSize = sizeof(te); // ЭТО ОБЯЗАТЕЛЬНО !
 if (Thread32First(hnd_hlp, &te))
 {
   do
   {
     if (te.th32OwnerProcessID == pid)
       EnumThreadWindows(te.th32ThreadID, WNDENUMPROC(&fnEnum), 0);
   }
   while (Thread32Next(hnd_hlp, &te));
 }
 CloseHandle(hnd_hlp);
}

Только в pid занеси нужное значение.



--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 27.7.2003, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Или можно сделать проще:

Код
EnumWindows (WNDENUMPROC(&fnEnum), 0);


callback-функция:
Код
BOOL CALLBACK fnEnum(HWND hwnd, LPARAM lParam)
{
 DWORD _pid;
 GetWindowThreadProcessId (hwnd, &_pid);

 if (pid == _pid)
 {
   // Нашел окно искомого процесса
 }
 return(TRUE);
}

Или можно без EnumWindows: просто делай в цикле GetNextWindow или GetWindow...

Правда, так перебираются вообще все окна в системе, но если это не критично, то лучше этот
вариант.



--------------------
С уважением, г-н Посол.
PM   Вверх
Plamenk
Дата 29.7.2003, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



Спасибо за помощь p0s0l!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0487 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.