![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]Сообщения посылаются окну или я что то пропустил?