Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Handle и PID [D7]


Matrex ©   (2006-01-31 19:45:00) 

Коллеги! Как послать сообщение приложению зная его PID (идентификатор процесса). Другими словами надо получить Handle процесса зная PID.


Eraser   (2006-02-03 13:34:00) [1]


> Matrex ©   (31.01.06 19:45)

Сообщение нельзя послать процессу. Его можно послать либо окну, либо потоку.


Гошик Кувшинов   (2006-02-03 12:51:00) [2]

тут про все эти хендлы пример есть http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1167


Matrex   (2006-02-01 21:09:00) [3]

Господа, спасибо за внимание к моей проблеме, однако что-то здесь не то… Функции, которые Вы предлагали выдают Handle чего-то совсем иного. Так, например Handle полученный вышеупомянутой функцией и Handle полученный тупым перебором форм разные. Так вот… посылка сообщения SendMessage(Handle,WM_CLOSE,0,0) в первом случае ничего не делает, во втором – успешно закрывает форму… Где искать правду? На всякий случай кусок кода (немного переработаный для моих нужд):

Function TImageProcess.GetFormHandle(pe32:TProcessEntry32):hWnd;
var Wnd : hWnd;
   tPid: Cardinal;
   tr: Cardinal;
Begin
  Wnd:=Application.Handle;
  Wnd:=GetWindow(Wnd,gw_HWndFirst);
  While Wnd<>0 do Begin
  GetWindowThreadProcessId(Wnd,tPid);
  result:=Wnd;if tPID=pe32.th32ProcessID then exit;
  Wnd:=GetWindow(Wnd,gw_hWndNext);
  end;
  result:=0;
end;


Pit   (2006-01-31 22:01:00) [4]

как ты ваще нашёл свой ID ? скажи мне?

var
ProcessHandle: THandle;
winHandel: hWnd;
begin
winHandel:= FindWindow(....);
GetWindowThreadProcessId(winHandel,ProcessId);  
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, ProcessId);

handle   := ProcessHandle ;


xShadow   (2006-01-31 21:46:00) [5]

//Ищет окно по его PID но их моежт быть и не одно тут все
//заточено для консольного приложения
Function Find( PID: Cardinal; var Te: String ): hWnd;
var Wnd : hWnd;
   Buff: array[0..127] of Char;
   tPid: Cardinal;
Begin
   Find := 0;
   Wnd := FindWindow( 'Progman', 'Program Manager' );
   Wnd := GetWindow( Wnd, gw_HWndFirst );
   While Wnd <> 0 do
   Begin
      GetWindowText( Wnd, buff, sizeof( buff ) );
      Te := StrPas( buff );
      GetWindowThreadProcessId( Wnd, tPID );
      if tPID = PID then
      Begin
         Find := Wnd;
         Break;
      end;
      Wnd := GetWindow( Wnd, gw_hWndNext );
   end;
end;

Нарыл в древнем проекте.


xShadow   (2006-01-31 21:36:00) [6]

Псособ который пользую я.
Ищещь все окна через FindWindow и т.д. и попутно определяешь их PID через функцию GetWindowThreadProcessId( Wnd, tPID ) которая по Wnd выдаёт PID процесса, находишь нужный пид и соответственно Handle окна


Rouse_   (2006-01-31 21:35:00) [7]


>  вообще почему сообщение не может быть послано консольному
> приложению

Сообщения у нас зовуться Оконными сообщениями, отсюда следует их следует отправлять окну, а должна принимать оконная процедура...


kaZaNoVa   (2006-01-31 21:33:00) [8]


> свернуть, развернуть, закрыть

конечно тока окну .. а окно искать Findwindow() и ей подобные кажецо


Matrex   (2006-01-31 21:19:00) [9]

В моем случае сообщение надо послать окну (а вообще почему сообщение не может быть послано консольному приложению?), и конечно же мне надо получить Handle окна... А вот OpenProcess дает Handle непонятно чего (возможно именно приложения) - этот Handle не "воспринимает" сообщения, по крайней мере, те которые я пробовал (свернуть, развернуть, закрыть и т.д.). В таком случае, наверно, есть возможность связать Handle окном? Но каким образом?


begin...end   (2006-01-31 20:41:00) [10]

> Matrex ©   (31.01.06 19:45)

> Другими словами надо получить Handle процесса зная PID.

OpenProcess


xShadow   (2006-01-31 19:47:00) [11]

Сообщения посылаются окну или я что то пропустил?


Наверх

Титульная страница Поиск, карта сайта Написать письмо