Вниз
Скачать: 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.02 c
11-1057585718
Boguslaw
2003-07-07 17:48
2004.04.04
Visual Database objects


3-1078394011
vovchik
2004-03-04 12:53
2004.04.04
универсальная строка подключния


14-1078998347
Vovchik_A
2004-03-11 12:45
2004.04.04
Потеря...


7-1075083080
AlexVC
2004-01-26 05:11
2004.04.04
Включить/отключить модем


3-1078201011
Алексей Петухов
2004-03-02 07:16
2004.04.04
Оптимизация БД




   Наверх