Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: 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 вся ветка

Текущий архив: 2004.04.04;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.038 c
1-1079284537
$tranger
2004-03-14 20:15
2004.04.04
Помогите с переводчиком


14-1078743785
Mox Fulder
2004-03-08 14:03
2004.04.04
WinAMP


14-1078778980
Rouse_
2004-03-08 23:49
2004.04.04
С Днем Рождения 9 Марта


1-1079100141
Prohodil Mimo
2004-03-12 17:02
2004.04.04
Как сделать чтобы у TPanel был Scroll ?


14-1078586332
kamerad
2004-03-06 18:18
2004.04.04
Pupup menu