Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2011.09.11;
Скачать: [xml.tar.bz2];

Вниз

как наити нужный Edit в чужом приложении   Найти похожие ветки 

 
ivanoff   (2009-08-17 21:07) [0]

В окне несколько едитов некоторые находятся на [Panel] и [GroupBox] --> искать рекурсивно

как мне найти нужный [Edit] зная его [Name] дело в том что
функция FindWindowEx ищет по заголовку а мне надо по имени


 
Leonid Troyanovsky ©   (2009-08-17 21:26) [1]


> ivanoff   (17.08.09 21:07)  

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

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

--
Regards, LVT.


 
ivanoff   (2009-08-17 21:35) [2]


> What is "имя"?


TEdit(...).Name

дело в том что в разных едитах может быть написано одно и тоже, мне нужно только в одном из них написать, а пишу во всех :(


 
Leonid Troyanovsky ©   (2009-08-17 21:47) [3]


> ivanoff   (17.08.09 21:35) [2]

> TEdit(...).Name

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

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

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

--
Regards, LVT.


 
ivanoff   (2009-08-17 21:56) [4]

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

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


 
Сергей М. ©   (2009-08-17 22:12) [5]


> ivanoff   (17.08.09 21:56) [4]


А откуда тебе стало известно это самое [Name] ?


 
ivanoff   (2009-08-17 22:25) [6]

ResGrabber


 
Сергей М. ©   (2009-08-17 22:34) [7]

Тогда этим самым ResGrabber"ом ты вполне мог увидеть и зн-я свойств Left, Top.

Если эти св-ва не изменяются программно после загрузки контролов-одноклассников в родительский контейнер, то по ним как раз и можно идентифицировать требуемый контрол, ибо маловероятно, что два Edit"а на одном и том же род.окне перекрывают частично или полностью друг-друга (тогда потребуется доп.идентификация по z-ордеру)


 
Leonid Troyanovsky ©   (2009-08-17 22:47) [8]


> ivanoff   (17.08.09 21:56) [4]

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

GetDlgCtrlID

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

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

--
Regards, LVT.


 
ivanoff   (2009-08-18 15:08) [9]

to Leonid Troyanovsky ©   (17.08.09 22:47) [8]

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

спасибо


 
Leonid Troyanovsky ©   (2009-08-18 15:58) [10]


> ivanoff   (18.08.09 15:08) [9]

> GetDlgCtrlID

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

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2009-08-18 16:13) [11]


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

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

--
Regards, LVT.


 
Nikfel   (2009-08-18 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 ©   (2009-08-18 16:30) [13]


> Nikfel   (18.08.09 16:20) [12]

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

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

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

--
Regards, LVT.


 
ivanoff   (2009-08-18 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");


 
Сергей М. ©   (2009-08-18 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   (2009-08-18 20:20) [16]

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

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

извеняюсь за настырство, только делаю все путем проб и ошибок на базе разных примеров


 
Leonid Troyanovsky ©   (2009-08-18 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.


 
Сергей М. ©   (2009-08-19 08:11) [18]


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


Почитать документацию в голову не приходило ?)


 
ivanoff   (2009-08-19 19:06) [19]

вобщем разобрался тока ...

GetWindowRect дает координаты по отношению к экрану (абсолютные) - могу ли я получить относительные координаты объекта (без расчетов). контрол находится на несколько вложенных Panel, GroupBox


 
Leonid Troyanovsky ©   (2009-08-19 19:54) [20]


> ivanoff   (19.08.09 19:06) [19]

> GetWindowRect

GetClientRect?

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

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

--
Regards, LVT.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2011.09.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.004 c
2-1306665558
Kamelot
2011-05-29 14:39
2011.09.11
Как нарисовать картинку, имея массив цветов пикселей?


2-1306081964
Gu
2011-05-22 20:32
2011.09.11
Название компонента для архивации


2-1306313935
lewka
2011-05-25 12:58
2011.09.11
Тригонометрические функции


15-1305711086
MiAn
2011-05-18 13:31
2011.09.11
Работа через https, получение SSL-сертификата?


4-1250942387
VladimirVB
2009-08-22 15:59
2011.09.11
Ресурсы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский