-
Доброго времени суток. Помогите пожалуйста определить положение чужого окна если мне не известен Handle. Причем окон несколько: одно главное и несколько дочерних(на сколько я понял) Из доступных данных имеется только имя процесса, класснейм окон(причем у всех окон класснейм одинаковый), и размеры всех окон(и дочерних и главного). Алгоритм приблизительно такой: мы находим окна с классом "XXX" потом проверяем размер этих окон, если они удовлетворяют условию, то узнаем их расположение... Как это возможно реализовать? Уточню сразу, что в delphi я не мастер, поэтому попрошу строго не судить о форме вопроса)) как смог так и объяснил)
-
Попробовал получать handle через FindAWindow('допустим имеется часть заголовка', ''), но тогда если окон несколько, то как получать handle всех окон содержащих часть имеющегося заголовка...? и все-таки думаю правильнее было бы реализовать алгоритм из моего основного вопроса... может быть у кого-нибудь есть идеи или предложения?
-
type PFindWindowStruct = ^TFindWindowStruct; TFindWindowStruct = record Caption: string; ClassName: string; WindowHandle: THandle; end;
function EnumWindowsProc(hWindow: hWnd; lParam: LongInt): Bool; stdcall var lpBuffer: PChar; WindowCaptionFound: bool; ClassNameFound: bool; begin GetMem(lpBuffer, 255); Result := True; WindowCaptionFound := False; ClassNameFound := False; try if GetWindowText(hWindow, lpBuffer, 255) > 0 then if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer)) > 0 then WindowCaptionFound := true; if PFindWindowStruct(lParam).ClassName = '' then ClassNameFound := True else if GetClassName(hWindow, lpBuffer, 255) > 0 then if Pos(PFindWindowStruct(lParam).ClassName, StrPas(lpBuffer)) > 0 then ClassNameFound := True; if (WindowCaptionFound and ClassNameFound) then begin PFindWindowStruct(lParam).WindowHandle := hWindow; Result := False; end; finally FreeMem(lpBuffer, sizeof(lpBuffer^)); end; end;
function FindAWindow(Caption: string; ClassName: string): THandle; var WindowInfo: TFindWindowStruct; begin WindowInfo.Caption := Caption; WindowInfo.ClassName := ClassName; WindowInfo.WindowHandle := 0; EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo)); FindAWindow := WindowInfo.WindowHandle; end;
procedure TForm1.Button1Click(Sender: TObject); var TheWindowHandle: THandle; begin TheWindowHandle := FindAWindow('Opera', ''); if TheWindowHandle <> 0 then begin Showwindow(TheWindowHandle, sw_restore); BringWindowTo(TheWindowHandle); end else ShowMessage('Window Not Found!'); end;
----------------------------------------------------------------------- реализация функции FindAWindow...
-
> Помогите пожалуйста определить положение чужого окна если > мне не известен Handle. Причем окон несколько: одно главное > и несколько дочерних(на сколько я понял) Из доступных данных > имеется только имя процесса, класснейм окон(причем у всех > окон класснейм одинаковый),
Если есть класс окна, то его хендл можно получить при помощи FindWindow. Загоняем поиск всех окон в цикл. И теперь просто определяем положение окна, вызвав GetClientRect.
|