Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Найти хэндлы всех окон приложения, Выделено из темы ShellExecute 
:(
    Опции темы
Bog d`An
Дата 29.11.2005, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Snowy @ 28.11.2005, 22:57)
А хэндл чего тебе нужен?

вобще-то необходимо хэндлы всех окон приложения... как их теперь добыть? что-нибудь вроде GetWindowThreadProcessID наоборот...
--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер]   
PM MAIL WWW   Вверх
_hunter
Дата 29.11.2005, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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





--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Bog d`An
Дата 29.11.2005, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Так что перебором всех быстрее получается? smile Странно, мне казалось что нет...

зы: или я чегот не понял но для моего случая есть индинтификатор процесса

hProcess: THandle;

или

PID

но не хэндл родительского окна... типа его искать и надо... той токо так подходит:
Step
Цитата(Step @ 5.5.2005, 15:34)
EnumWindows
получаешь хендлы на их основе берешь родителя и по родителю определяешь твое или нет

?
--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер]   
PM MAIL WWW   Вверх
Bog d`An
Дата 29.11.2005, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



а если EnumThreadWindows, а затем EnumChildWindows?
_hunter, ты это тестил?
EnumThreadWindows сам по себе медленный или вместе с двумя предидущими(CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0) и Thread32First())?
--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер]   
PM MAIL WWW   Вверх
_hunter
Дата 29.11.2005, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



я ж все написал...
медленнее сам метод ( + как ты собираешся использовать EnumThreadWindows без снимка? )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Bog d`An
Дата 7.12.2005, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Сел разбиратся...
_hunter, извини что достаю, не мог бы ты привести пример использования ф-и EnumThreadWindows? С синтаксисом а-ля делфяsmile а то я не вьезжаю в последний мессажsmile

или я что-то пропустил?
Цитата(_hunter @ 29.11.2005, 18:30)
( + как ты собираешся использовать EnumThreadWindows без снимка? )


(я нашел токо Handling Logoff Events от MSDN, но не всё понял smile как будет BOOL CALLBACK EnumProc()? {Ключевое слово CALLBACK }

Код

Function EnumProc(hwnd:HWND;lParam:LPARAM):Boolean; 
Begin
  Form1.ListBox1.Items.Add(IntToStr(hwnd));
  Result:= TRUE;
End;

Function testFunction(PID:Integer):Boolean;
Begin
    EnumThreadWindows(PID, [i]EnumProc[/i], 0);
End;
)



--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер]   
PM MAIL WWW   Вверх
Girder
Дата 7.12.2005, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

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



Код

procedure TForm1.XXX;
var
  h,h1:THandle;
procedure RegisterWindow(hWnd:THandle);
var
  h:THandle; 
begin
 //На входе: hWnd - текущий дескриптор какого нить окна

  h:=GetWindow(hWnd,gw_Child); // получение поддчинённых элементов
  if h<>0 then RegisterWindow(h);
  h:=GetWindow(hWnd,gw_hWndNext); // получение элеметов того же уровня
  if h<>0 then RegisterWindow(h);
end;
begin
  h1:=Handle; 
  repeat
    h:=GetWindow(h1,GW_OWNER); 
    if h<>0 then h1:=h; // если не окно верхнего уровня, то ищем дальше
  until h=0;
  h:=GetWindow(h1,GW_HWNDFIRST); 
  RegisterWindow(h); // запуск рекурсии
end;


PS: А вообще... если воспользуешся поиском... то увидеш... что енто не однократно обсуждалось!


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Bog d`An
Дата 8.12.2005, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Girder @ 7.12.2005, 16:58)
//На входе: hWnd - текущий дескриптор какого нить окна

Что бы это было? smile

з.ы.: хороший пример использования ф-и EnumThreadWindows smile
--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер]   
PM MAIL WWW   Вверх
Bog d`An
Дата 8.12.2005, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Типа Эврика! CALLBACK -> stdcall;
Код

function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall;
Begin
    TForm1.ListBox1.Items.Add(IntToStr(Wd));
    EnumProc := TRUE;
end;

Procedure GetAllWindow;
Begin
    TForm1.ListBox1.Items.Clear;         
    EnumWindows (@EnumProc, 0); 
End;

Procedure test(PID:Integer);
Begin
    TForm1.ListBox1.Items.Clear;         
    EnumThreadWindows(PID, @EnumProc, 0);
End;


з.ы.:
Цитата(_hunter @ 29.11.2005, 18:30)
+ как ты собираешся использовать EnumThreadWindows без снимка?

Всё равно не вьехал... какого снимка? не вижу снимка smile

Это сообщение отредактировал(а) Bog d`An - 8.12.2005, 07:23
--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер]   
PM MAIL WWW   Вверх
Girder
Дата 8.12.2005, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

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



Цитата(Bog @ 8.12.2005, 07:02)
з.ы.: хороший пример использования ф-и EnumThreadWindows
Просто ты поступаеш так: Зачем просто когда можно сложно smile

Цитата(Bog @ 8.12.2005, 07:02)
Что бы это было?
То что на hWnd можеш натравить что нить... например GetWindowThreadProcessId



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Bog d`An
Дата 16.12.2005, 04:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Girder @ 8.12.2005, 10:38)
Просто ты поступаеш так: Зачем просто когда можно сложно smile

не, тут было дело принципа - разобратся с конкретной функцией... и фразой про снимок...

Кстати так и не понял зачем было снимок приплетать... _hunter, ау!

и вовсе не сложно smile строчек кода так точно меньше smile
и вообще если к GetWindow ещё и GetWindowThreadProcessId приплести - то точно проще...
зы:
Цитата(Girder @ 7.12.2005, 16:58)
//На входе: hWnd - текущий дескриптор какого нить окна

На входе - дескриптор окна с которого начать поиск - ты наверное это имел в виду (судя по коду) smile

--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер]   
PM MAIL WWW   Вверх
Romikgy
Дата 16.12.2005, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Список процессов через снимок
Код

function IsRunning( sName : string ) : boolean;  
var  
  han : THandle;  
  ProcStruct : PROCESSENTRY32; // from "tlhelp32" in uses clause  
  sID : string;  
begin  
  Result := false;  
  // Get a snapshot of the system  
  han := CreateToolhelp32Snapshot( TH32CS_SNAPALL, 0 );  
  if han = 0 then  
    exit;  
  // Loop thru the processes until we find it or hit the end  
  ProcStruct.dwSize := sizeof( PROCESSENTRY32 );  
  if Process32First( han, ProcStruct ) then  
    begin  
      repeat  
        sID := ExtractFileName( ProcStruct.szExeFile );  
        // Check only against the portion of the name supplied, ignoring case  
        if uppercase( copy( sId, 1, length( sName ) ) ) = uppercase( sName ) then  
          begin  
            // Report we found it  
            Result := true;  
            Break;  
          end;  
      until not Process32Next( han, ProcStruct );  
    end;  
  // clean-up  
  CloseHandle( han );  
end; 





--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
_hunter
Дата 16.12.2005, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



Цитата(Bog @ 16.12.2005, 03:15)
Кстати так и не понял зачем было снимок приплетать... _hunter, ау!


а я так и не понял что ты не понял...
ты спросил какой из методов бысрее ( один из них делает снимок ). я ответил...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Bog d`An
Дата 19.12.2005, 04:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(_hunter @ 16.12.2005, 12:08)
ты спросил какой из методов бысрее ( один из них делает снимок ). я ответил...

зы: ок, токо там непонятки с ответом...
итак я хотел спросить вот что: я запускаю чужое приложение с помощью Create Process, таким образом имею его ProcessInfo
1 способ: беру ProcessInfo.dwThreadId и подставляю в EnumThreadWindows первым параметром;
2 способ: перебрать все окна (опять таки есть разные решения, я так понял из предидущих постов
Цитата(Step @ 5.5.2005, 15:34)
EnumWindows
получаешь хендлы на их основе берешь родителя и по родителю определяешь твое или нет
тестировалось то которое EnumWindows?) и сравниваю ейных родителей с всё тем же ProcessInfo.dwThreadId с помощью GetWindowThreadProcessId.
Все верно? или я не туда мыслю, ведь здесь нет снимков smile?
вот и я сомневался что второй способ быстрее первого...

Это сообщение отредактировал(а) Bog d`An - 19.12.2005, 04:17
--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер]   
PM MAIL WWW   Вверх
_hunter
Дата 19.12.2005, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



ты забыл о том, что приложение может иметь несколько потоков, а ты ищеш окна только одного потока. для того, чтобы найти все ротоки процесса и нужен снимок


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




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


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

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