Конференция "WinAPI" » как наити нужный Edit в чужом приложении [D7, WinXP]
 
  • ivanoff (17.08.09 21:07) [0]
    В окне несколько едитов некоторые находятся на [Panel] и [GroupBox] --> искать рекурсивно

    как мне найти нужный [Edit] зная его [Name] дело в том что
    функция FindWindowEx ищет по заголовку а мне надо по имени
  • Leonid Troyanovsky © (17.08.09 21:26) [1]

    > ivanoff   (17.08.09 21:07)  

    > функция FindWindowEx ищет по заголовку а мне надо по имени

    Она ищет по классу окна или по его заголовку.
    What is "имя"?

    --
    Regards, LVT.
  • ivanoff (17.08.09 21:35) [2]

    > What is "имя"?


    TEdit(...).Name

    дело в том что в разных едитах может быть написано одно и тоже, мне нужно только в одном из них написать, а пишу во всех :(
  • Leonid Troyanovsky © (17.08.09 21:47) [3]

    > ivanoff   (17.08.09 21:35) [2]

    > TEdit(...).Name

    По дельфийски означает: одного (оконного) класса.

    > дело в том что в разных едитах может быть написано одно
    > и тоже

    Для различения эдитов одного класса можно использовать:
    - координаты;
    - ID;
    - z-order;
    - еще чего-либо, необходимого для их идентификации,
    скажем, наличие SetProp & etc.

    --
    Regards, LVT.
  • ivanoff (17.08.09 21:56) [4]
    и как определить ID я знаю только handle который всегда разный

    а без танцев с бубном (координаты; ID; z-order; еще чего-либо, необходимого для их идентификации,
    скажем, наличие SetProp & etc)
    никак?
  • Сергей М. © (17.08.09 22:12) [5]

    > ivanoff   (17.08.09 21:56) [4]


    А откуда тебе стало известно это самое [Name] ?
  • ivanoff (17.08.09 22:25) [6]
    ResGrabber
  • Сергей М. © (17.08.09 22:34) [7]
    Тогда этим самым ResGrabber'ом ты вполне мог увидеть и зн-я свойств Left, Top.

    Если эти св-ва не изменяются программно после загрузки контролов-одноклассников в родительский контейнер, то по ним как раз и можно идентифицировать требуемый контрол, ибо маловероятно, что два Edit'а на одном и том же род.окне перекрывают частично или полностью друг-друга (тогда потребуется доп.идентификация по z-ордеру)
  • Leonid Troyanovsky © (17.08.09 22:47) [8]

    > ivanoff   (17.08.09 21:56) [4]

    > и как определить ID я знаю только handle который всегда
    > разный

    GetDlgCtrlID

    > а без танцев с бубном (координаты; ID; z-order; еще чего-
    > либо, необходимого для их идентификации,
    > скажем, наличие SetProp & etc) никак?

    Дед Мороз жив, forever!

    --
    Regards, LVT.
  • ivanoff (18.08.09 15:08) [9]
    to Leonid Troyanovsky ©   (17.08.09 22:47) [8]

    GetDlgCtrlID
    1. даст уникальный идентификатор корнтрола на форме(или во всем приложении) даже если оркрыто больше одного экземпляра одного и того же приложения?
    2. Меняется ли этот идентификатор при след. сапуске приложения (как Handle)?
    3. Могу ли я искать на прямую по этому ID? Как?
    4. Есть др. способ искать насквозь во все окна (без рекурсии)

    спасибо
  • Leonid Troyanovsky © (18.08.09 15:58) [10]

    > ivanoff   (18.08.09 15:08) [9]

    > GetDlgCtrlID

    1. Для дельфийских приложений его никто не назначает, он, видимо,
    генерируется системой. Уникальность заявлена в пределах окна парента.
    2. Меняется, т.к. 1
    3. Непонятно, чего его искать, если хендл известен.
    4. EnumChildWindows with GetClassName.

    --
    Regards, LVT.
  • Leonid Troyanovsky © (18.08.09 16:13) [11]

    > Leonid Troyanovsky ©   (18.08.09 15:58) [10]

    Мда, у окон дельфийских винконтролов есть еще Property,
    в которые наряду с другим вписывается значение указателя.
    Если контролы  не создаются в рантайм, то есть шанс
    идентифицировать по ем.
    См. например, реализацию FindControl, а также EnumProps.

    --
    Regards, LVT.
  • Nikfel (18.08.09 16:20) [12]
    Я всегда делаю примерно так:
    var h:longint;
       s:string;
    begin
    h:=FindWindowEx(handle,0,'TEdit',nil);
    h:=FindWindowEx(handle,h,'TEdit',nil);
    s:='Text';
    sendmessage(h,wm_settext,0,longint(s));



    handle - найти можно через FindWindow
    В примере я обращаюсь ко второму объекту и заношу туда текст.
  • Leonid Troyanovsky © (18.08.09 16:30) [13]

    > Nikfel   (18.08.09 16:20) [12]

    > Я всегда делаю примерно так:

    Если всегда, то это неправильно.
    См. msdn: комментарий к EnumChidWindows.

    Ну, понятно, что здесь используется информация о z-order.

    --
    Regards, LVT.
  • ivanoff (18.08.09 19:14) [14]
    Пойду по пути идентифицировать по координатам.

    Вопрос как получить Top, Left, Height, Width?

    делаю так

    ...
     sStrClass, sWindowName, sStrToSet: String;
    ...

    function EnumProc (W: HWnd; Param: LongInt): Boolean; stdcall;
    var
     WName: array[0..255] of Char;
     CName: array[0..255] of Char;
    begin
     GetWindowText(W, WName, 256);
     GetClassName(W, CName, 256);

     if (AnsiCompareText(sStrClass, CName) = 0) and (AnsiCompareText(sWindowName, Nm) = 0) then
       SendMessage(W, WM_Settext, 0, Integer(PChar(sStrToSet)))
     else
       begin
         EnumChildWindows (W,@EnumProc, 0);
         EnumProc := True;
       end;
    end;

    procedure FindAndSetText(ParentHnd: HWND; const StrClass, WindowName, StrToSet: String);
    begin
     sStrClass := StrClass;
     sWindowName := WindowName;
     sStrToSet := StrToSet;
     EnumWindows(@EnumProc, 0);
    end;



    ...
    //делаю пробы в моем-же приложении так
    FindAndSetText(Form1.Handle, 'TEdit', 'Edit1', 'My Text');

  • Сергей М. © (18.08.09 19:57) [15]

    > как получить Top, Left, Height, Width?

    The GetWindowRect function retrieves the dimensions of the bounding rectangle of the specified window. The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen
  • ivanoff (18.08.09 20:20) [16]
    вижу
    EnumWindows(@EnumProc, 0);



    это я взял из примера - я так понимаю ParentHnd никак не передаётся значит ли это то что ищется во всех окнах и не надо прибегать к рекурсии?

    извеняюсь за настырство, только делаю все путем проб и ошибок на базе разных примеров
  • Leonid Troyanovsky © (18.08.09 21:40) [17]

    > ivanoff   (18.08.09 20:20) [16]

    > вижу
    > EnumWindows(@EnumProc, 0);

    http://msdn.microsoft.com/en-us/library/ms633494(VS.85).aspx

    --
    Regards, LVT.
  • Сергей М. © (19.08.09 08:11) [18]

    > делаю все путем проб и ошибок


    Почитать документацию в голову не приходило ?)
  • ivanoff (19.08.09 19:06) [19]
    вобщем разобрался тока ...

    GetWindowRect дает координаты по отношению к экрану (абсолютные) - могу ли я получить относительные координаты объекта (без расчетов). контрол находится на несколько вложенных Panel, GroupBox
  • Leonid Troyanovsky © (19.08.09 19:54) [20]

    > ivanoff   (19.08.09 19:06) [19]

    > GetWindowRect

    GetClientRect?

    > контрол находится на несколько вложенных Panel, GroupBox

    Вложенные, т.е., рекурсивно.

    --
    Regards, LVT.
 
Конференция "WinAPI" » как наити нужный Edit в чужом приложении [D7, WinXP]
Есть новые Нет новых   [134434   +28][b:0][p:0.001]