Главная страница
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.029 c
3-1078919247
BPK
2004-03-10 14:47
2004.04.04
Как передать хранимой процедуре одиночные параметры + DataSet ?


3-1078205836
ZSergey
2004-03-02 08:37
2004.04.04
Доброго времени суток! Разрешите проблему "Table is busy ...


1-1079340178
pavlov
2004-03-15 11:42
2004.04.04
работа с файлами из под сервиса


3-1078470164
bushmen
2004-03-05 10:02
2004.04.04
ADOStoredProc


3-1078601952
Дмитрий2004
2004-03-06 22:39
2004.04.04
Срочно нужна помощь на счет фильтрации в ADO