Вниз
Скачать: CL | DM;

Все ищем Handle...   Найти похожие ветки 

 
VID ©   (2004-02-23 13:33) [0]

Есть ProcessID процесса..
Необходимо узнать handle его главного окна (которое создаётся в главном потоке)...
т.е. то что окно есть - я знаю, не знаю как найти handle его главного окна..

этот handle нужен для того что бы потом отправить сообщение (postmessage) этому окну, однако если кто нибудь знает как отправить сообщение ПРИЛОЖЕНИЮ зная его ProcessID, и без хэндла главного окна, то пишите плз )


 
AviDen ©   (2004-02-23 15:05) [1]

Окна в Винде относятся не к процессам, а к потокам.

Для отправки сообщения в поток используй PostThreadMessage
Но так нельзя посылать сообщения окнам (т.е., если ты хочешь скрыть или задизейблить какое-нить окно приложения, то мессагу нужно слать именно окну).

А найти главное окно потока стандартными методами нельзя - только перебирать все окна потока (EnumThreadWindows) и смотреть, какое из них главное по тебе известным признакам (напр., по заголовку / имени класса).


 
Digitman ©   (2004-01-23 13:38) [2]


function IsMainAppWindow(Wnd: THandle): Boolean;
var
 ParentWnd: HWND;
 ExStyle: DWORD;
begin
 if IsWindowVisible(Wnd) then
 begin
   ParentWnd := GetWindowLong(Wnd, GWL_HWNDPARENT);
   ExStyle := GetWindowLong(Wnd, GWL_EXSTYLE);
   Result := ((ParentWnd = 0) or (ParentWnd = GetDesktopWindow)) and
     ((ExStyle and WS_EX_TOOLWINDOW = 0) or (ExStyle and WS_EX_APPWINDOW <> 0));
 end
 else
   Result := False;
end;

function GetMainAppWndFromPid(PID: DWORD): THandle;
type
 PSearch = ^TSearch;
 TSearch = record
   PID: DWORD;
   Wnd: HWND;
 end;
var
 SearchRec: TSearch;

 function EnumWindowsProc(Wnd: HWND; Res: PSearch): Boolean; stdcall;
 var
   WindowPid: DWORD;
 begin
   WindowPid := 0;
   GetWindowThreadProcessId(Wnd, @WindowPid);
   if (WindowPid = Res^.PID) and IsMainAppWindow(Wnd) then
   begin
     Res^.Wnd := Wnd;
     Result := False;
   end
   else
     Result := True;
 end;

begin
 SearchRec.PID := PID;
 SearchRec.Wnd := 0;
 EnumWindows(@EnumWindowsProc, Integer(@SearchRec));
 Result := SearchRec.Wnd;
end;


(c) JEDI

p.s. работает ожидаемым образом только в случае если гл.окно приложения - видимое (имеет на момент проверки флаг WS_VISIBLE)



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.021 c
8-1069862972
Pa5ha
2003-11-26 19:09
2004.04.04
Direct3D Resize


4-1074605528
menart
2004-01-20 16:32
2004.04.04
Диалоговое окошко входа в домен!


8-1069948466
Ded Moroz
2003-11-27 18:54
2004.04.04
Как проиграть AVI из ресурсов?


6-1074530042
MAxiMum
2004-01-19 19:34
2004.04.04
Отправка e-mail через программу


14-1078927826
Yurchik
2004-03-10 17:10
2004.04.04
Нужен uses CommonFunc.pas(.dcu). Помогите плиииссс.




   Наверх