Конференция "WinAPI" » Как получить координаты чужого окна? [D7, WinXP]
 
  • Vampire Kain © (13.06.09 11:39) [0]
    Доброго времени суток. Помогите пожалуйста определить положение чужого окна если мне не известен Handle. Причем окон несколько: одно главное и несколько дочерних(на сколько я понял) Из доступных данных имеется только имя процесса, класснейм окон(причем у всех окон класснейм одинаковый), и размеры всех окон(и дочерних и главного). Алгоритм приблизительно такой: мы находим окна с классом "XXX" потом проверяем размер этих окон, если они удовлетворяют условию, то узнаем их расположение... Как это возможно реализовать? Уточню сразу, что в delphi я не мастер, поэтому попрошу строго не судить о форме вопроса)) как смог так и объяснил)
  • Vampire Kain © (13.06.09 12:34) [1]
    Попробовал получать handle через FindAWindow('допустим имеется часть заголовка', ''), но тогда если окон несколько, то как получать handle всех окон содержащих часть имеющегося заголовка...? и все-таки думаю правильнее было бы реализовать алгоритм из моего основного вопроса... может быть у кого-нибудь есть идеи или предложения?
  • Vampire Kain © (13.06.09 12:38) [2]
    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...
  • Б (15.06.09 16:00) [3]

    >  Помогите пожалуйста определить положение чужого окна если
    > мне не известен Handle. Причем окон несколько: одно главное
    > и несколько дочерних(на сколько я понял) Из доступных данных
    > имеется только имя процесса, класснейм окон(причем у всех
    > окон класснейм одинаковый),


    Если есть класс окна, то его хендл можно получить при помощи FindWindow.
    Загоняем поиск всех окон в цикл.
    И теперь просто определяем положение окна, вызвав GetClientRect.
 
Конференция "WinAPI" » Как получить координаты чужого окна? [D7, WinXP]
Есть новые Нет новых   [134434   +28][b:0][p:0]