Вниз
Скачать: 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.024 c
1-1079265878
kat
2004-03-14 15:04
2004.04.04
Как заменить иконку в откомпилиной проге?


4-1075031625
Kryptonix
2004-01-25 14:53
2004.04.04
Неработает хук моуза и клабиатуры вместе :(((


1-1079498494
Malax
2004-03-17 07:41
2004.04.04
Копирование и запуск приложения


6-1075285165
va
2004-01-28 13:19
2004.04.04
Exchange server


6-1074951629
Looo
2004-01-24 16:40
2004.04.04
Отчёты и Интернет




   Наверх