Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Через 3 дня :

День славянской письменности и культуры


Как узнать хендл окна по имени файла!?


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
jTim
Гость







СообщениеЧт, 24-Июл-2008 17:48    Заголовок сообщения: Как узнать хендл окна по имени файла!?
Цитата

Здравствуйте! Вот сталкнулся с проблемой! НЕ могу узнать хендл окна, название окна слишком большое и прочесть его невозможно. Поэтому немогу до него добраться ... Подскажите как можно до него добратся по имени его файла (имени процесса). Зарание спасибо!
В начало
Пол:Муж TuXAPuK
Великий гонщик

Предупреждений : 1
Возраст: 26
Знак зодиака: Рыбы
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
СообщениеЧт, 24-Июл-2008 20:12 
Цитата

А воспользоваться ClassName???

Имя окна может даже меняться, а вот имя класса всегда единно....




Вот пример получения HWND из имени процесса....

Взято с форума Delphi Sources

delphi:
  1. const
  2.  exeName = 'MYPROG.EXE';
  3.  
  4. var
  5.  fWnd:hwnd;
  6.  
  7.  
  8. function GetModuleFileNameExW(hProcess:THandle; hModule:HMODULE; lpFilename:PWideChar; nSize:DWORD):DWORD; stdcall; external 'PSAPI.DLL'
  9.  
  10. function WindowGetEXE(wnd:HWND):string; // для Win2K/XP. В Win9x нужно юзать GetWindowModuleFileName
  11. var
  12.  wt:array[0..MAX_PATH-1] of WChar;
  13.  prc:THandle;
  14.  prcID:cardinal;
  15. begin
  16.  result:='';
  17.  if GetWindowThreadProcessID(wnd,prcID)<>0 then
  18.  begin
  19.   prc:=OpenProcess(PROCESS_ALL_ACCESS,false,prcID);
  20.   if prc<>0 then
  21.   try
  22.     if GetModuleFileNameExW(prc,0,wt,MAX_PATH*2)<>0 then result:=wt
  23.   finally
  24.    CloseHandle(prc)
  25.   end
  26.  end
  27. end;
  28.  
  29. function EnumWindowsProc(wnd:HWND; lParam: LPARAM):BOOL; stdcall;
  30. begin
  31.  result:=true;
  32.  if IsWindowVisible(wnd) and (GetParent(wnd)=0) and
  33.  (wnd<>Application.Handle) and (wnd<>Form1.Handle) // проверка, что окно не твое собственное.
  34.  and
  35.  (UpperCase(ExtractFileName(WindowGetEXE(wnd)))=exeName) then
  36.  begin
  37.    fWnd:=wnd;
  38.    result:=false
  39.  end
  40. end;
  41.  
  42. procedure TForm1.Button1Click(Sender: TObject);
  43. begin
  44.  fWnd:=0;
  45.  EnumWindows(@EnumWindowsProc,0);
  46.  if fWnd=0 then ShowMessage('Not found') else ShowMessage('Found window '+IntToStr(fWnd))
  47. end;

_________________
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
jTim
Гость







СообщениеПт, 25-Июл-2008 13:23 
Цитата

ничего не получилось! всегда одно пишет, что ненайден хендл, а прога запущенна!!! нельзя ли этот пример разжевать и сделать понятнее? задача не должна быть такой сложной! неужели трудно добраться к списку процессов системы и вытащит по имени один из них!?
В начало
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеПт, 25-Июл-2008 15:29 
Цитата

Вытащить процесс по имени несложно. А вот найти нужное окно этого процесса уже намного сложнее.
_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж TuXAPuK
Великий гонщик

Предупреждений : 1
Возраст: 26
Знак зодиака: Рыбы
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
СообщениеВс, 27-Июл-2008 3:17 
Цитата

Давай поступим проще...

Находим прогу "Anvir Task Manager" на http://www.anvir.com/index_ru.htm она условно бесплатная...

Далее закладка "процессы" находим наш процесс тыкаем на него...

В нижней панели нажимаем "окна" ставим галочки в "Перечислить невидимые окна" и "Перечислить служебные окна"

Находим заголовок нашего окна "Заголовок окна" и в закладке "класс" получаем ClassName нашего окна...


Далее в коде -
FindWindow('KlassOkna', nil);

Вот ты и нашёл своё окно по имени класса.... И заголовок тебе нафиг не нужен...

ЗЫ : Кстати прграммка расскажет тебе много интересного о процессах в системе какие файлы процессы открывают, закрывают, держат, какие и куда соеденения процесс делает, сколько потоков программа открыла, и информацию о них... и.т.п. Вообщем-то считаю что одна из тех полезных софтин которая must-be у сисадмина за пазухой....

_________________
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеВс, 27-Июл-2008 16:30 
Цитата

Цитата:
Кстати прграммка расскажет тебе много интересного о процессах в системе какие файлы процессы открывают, закрывают, держат, какие и куда соеденения процесс делает, сколько потоков программа открыла, и информацию о них... и.т.п. Вообщем-то считаю что одна из тех полезных софтин которая must-be у сисадмина за пазухой....

"Одна из тех полезных софтин" называется Process Explorer от Руссиновича, крохотный, абсолютно бесплатный и умеющий почти все вышеперечисленное :)

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100