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

Вниз

Надо нажимать на кнопку в приложении из другого приложения.   Найти похожие ветки 

 
АТ   (2003-05-29 13:01) [0]

Проблема следующая - для выполнения множественных повторяющихся операций надо написать прогу, которая бы нажимала на кнопку в другой проге.(там вообще-то еще и Edit надо заполнять, но об этом потом)
Из того что я уже знаю - кнопка - это тоже окно, причем надпись на ней - это не что иное как заголовок этого окна. Сл-но я через этот заголовок могу однозначно определить Handle этой кнопки.
Короче что я должен ей послать, чтобы эта кнопка нажалась и чего-то там запустила.


 
DVM   (2003-05-29 13:10) [1]


> Из того что я уже знаю - кнопка - это тоже окно

Не всякая кнопка - окно. Некоторые кнопки - это просто картинки.


> Короче что я должен ей послать, чтобы эта кнопка нажалась
> и чего-то там запустила.

WM_LBUTTONDOWN?


 
Song   (2003-05-29 13:26) [2]

BM_CLICK


 
АТ   (2003-06-02 14:48) [3]

Всем бальшое спасибо, все получилось :)

А теперь подскажите как заполнить поле Edit. Я дерево окон Windows получаю - на моей форме много едитов(и это правда), соотв-но одинакового класса, без названия с разными дескрипторами. Сдается мне, что однозначно определить искомый Edit нельзя, или у них на форме все-таки есть какой-то свой ID о котором я не знаю... Что же делать?


 
DVM   (2003-06-02 15:42) [4]

Определить можно. Controls[n] - n - номер контрола. ControlCount - количество контролов. Если речь о VCL конечно.


 
АТ   (2003-06-02 17:22) [5]

Тааак, вот с этого момента я уже не понял...Причем тут VCL?
Разве VCL не использует API?
Видимо аналог controls в API-терминалогии должен быть, раз он есть в VCL. Как просмотреть значение этого параметра? Дерево окон Windows через ф-ии API я строить научился, получается чтобы добраться до controls мне надо использовать функции VCL?

Не знаю насколько это важно, но приложение, которым мне надо рулить написано на Java.


 
DVM   (2003-06-02 18:18) [6]


> на моей форме много едитов(и это правда), соотв-но одинакового
> класса

программа твоя или нет?


 
АТ   (2003-06-02 18:30) [7]

Есть база, оболочка к которой написана на Java, в одном из окон оболочки мне надо совершать след. операции:
1) внести в одно из поле Editй некую цифру
2) проверить, удовлетворяет-ли число в другом Edit"e некому условию
3) если удовлетворяет - то нажать на кнопку
4) после нажатия на экране появиться окно(типа приложение в работе), как только это окно исчезнет надо повторить операции с начала

Все эти действия выполнял оператор вручную.
Моя задача написать программу на Delphi, которая будет все это делать сама.


 
АТ   (2003-06-02 18:34) [8]

Кстати вот еще один вопрос - как мне вытащить содержимое Edit"а чтобы проверить его на условие? С помощью какой ф-ии API это можно сделать?


 
nikkie   (2003-06-02 18:52) [9]

Видимо аналог controls в API-терминалогии должен быть, раз он есть в VCL.
нет. а собственно какой аналог тебе нужен? детей перечислять ты умеешь...

Сдается мне, что однозначно определить искомый Edit нельзя
по координатам. а можно надеяться, что порядок детей будет один и тот же.

>Не знаю насколько это важно, но приложение, которым мне надо рулить написано на Java.
очень важно. вероятно, что явовский едит или кнопка вовсе не является окном Windows. по-крайней мере я проверил - у меня это так. конечно, это может зависеть от виртуальной машины, но вероятнее всего явовские контроли будут самодельными.

Дерево окон Windows через ф-ии API я строить научился
ну и как, есть там явовские контроли?


 
АТ   (2003-06-02 19:50) [10]

>ну и как, есть там явовские контроли?
Нет, самые что-ни на есть Edit"ные Edit"ы.

Я не очень понял про детей, это дочерние окна что-ли? Если так, то у Edit"а их нет.

Использовать координаты интерестно, конечно, но как-то уж совсем не красиво. С программами ведь операторы работать будут, обязательно что-нибудь напортят.


 
DVM   (2003-06-02 21:19) [11]


> как мне вытащить содержимое Edit"а чтобы проверить его на
> условие?

function GetTextFromWindow(hWnd: HWND): string;
var
TextLength: Integer;
Text: PChar;
begin
TextLength := SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);
if TextLength = 0 then Result := ""
else
begin
GetMem(Text, TextLength + 1);
SendMessage(hWnd, WM_GETTEXT, TextLength + 1, longint(Text));
Result := Text;
FreeMem(Text);
end;
end; // End of function GetTextFromWindow


> Использовать координаты интерестно, конечно, но как-то уж
> совсем не красиво. С программами ведь операторы работать
> будут, обязательно что-нибудь напортят.

Нормальный способ. Красивого способа не получится, потому что узнать какой едит первый а какой второй можно только по координатам. Handle им выдаются не по порядку. Даже не в порядке возрастания или убывания.


 
nikkie   (2003-06-02 23:24) [12]

>>ну и как, есть там явовские контроли?
>Нет, самые что-ни на есть Edit"ные Edit"ы.

не понял ты меня... ну есть, так есть. нашел я-таки какой-то пример на AWT - действительно там стандартные контроли реализуются стандартными windows-классами. но все Swing-овые приложения с точки зрения windows - это одно окно, у которого нет ни одного дочернего окна. опять же все это может варьироваться в зависимости от виртуальной машины.

видимо приложение у тебя написано на AWT, так что можешь радоваться.

>Использовать координаты интерестно, конечно, но как-то уж совсем не красиво. С программами ведь операторы работать будут, обязательно что-нибудь напортят.
ну напортить не просто... вряд ли оператор сможет едит на форме подвинуть (понятное дело, привязываться надо к клиентским координатам). но, учитывая явовские навороты с размещением контролей, всякое может быть - теоретически, при изменении размеров окна, координаты ребенка могут измениться. в таком случае у тебя получится этакий искуственный мини-интелект, который натаскан на поиск определенных едитов в определенном приложении. но все же это, наверное, лучший способ.


 
АТ   (2003-06-04 04:47) [13]

>так что можешь радоваться
А я и радуюсь... Только что-то не получается у меня ничего.
Проблема в том, что я не вижу часть едитов. Дерево окон строю, тама много чего, но едиты не все - по кол-ву их меньше чем на окне приложения(nikkie, это то о чем ты говорил? "> все Swing-овые приложения с точки зрения windows - это одно окно"). С помощью кода DVM(спасибо) я пытался получить содержимое едитов, из одного едита получил, а из других - нет. Блин, ничего не понимаю, едиты выглядят одинаково, стоят рядом, а содержание одного получить могу, а другого нет.
Ну думаю ладно, попробую выяснить Handle едита через функцию GetFocus, но она, насколько я понял дальше нити вызвавшего ее окна не идет.
nikkie, что винда может некоторые окна не видеть? Не понимаю, она совершает с ними операции ввода-вывода и не имеет представления что это за объекты...


 
АТ   (2003-06-04 05:58) [14]

Так и есть, передвинул форму приложения таким образом, чтобы нужный Edit оказался в левом нижнем углу, потом с помощью ф-ии WindowFromPoint попытался получить его десктиптор... и получил дескриптор родительского окна. :(

nikkie, извини за ламерский вопрос, а что такое Swing-овые приложения?


 
Suntechnic   (2003-06-04 06:17) [15]

>АТ
что такое Swing-овые приложения?
Существует стандартная Java-ская библитека контролов AWT (Abstract Window Toolkit), которая поставляется вместе с любой виртуальной Java машиной. Это что-то типа аналога edit-в, button-в, listbox-в и т.д. в Windows.
Но, допустим, те же Delphi имеют расширения стандартных Windows контролов (например TStringGrid). С точки зрения Windows TStringGrid это просто окно и ничего более. Так что извлечь, скажем, текст из ячейки TStringGrid на Win API задача очень и очень неординарная.

Тоже самое происходит и со Swing. Swing это библитека компонентов для Java (от Sun если я не ошибаюсь). Можешь себе представить Swing, как некий аналог VCL на Java.


 
nikkie   (2003-06-05 02:21) [16]

Аналогия между Swing и VCL, конечно, несколько натянутая, но пример с TStringGrid объясняет ситуацию хорошо.

Swing вещь абсолютно родная для Явы, это не какие-то левая библиотека классов. Просто AWT появилась в Java 1, а Swing - в Java 2. Приложения на AWT выглядят совсем как-то убого, а на Swing-е довольно стильно (разница примерно как между Win3.1 и Win95 интерфейсами). В Swing"е есть компоненты, которых в AWT и близко не стояло - скроллбокс, дерево, грид.

>что винда может некоторые окна не видеть? Не понимаю, она совершает с ними операции ввода-вывода и не имеет представления что это за объекты...
Swing написан на самой Java - этим добились переносимости не требуя реализации всех этих заморочек от создателей Java-машин. Это означает, что все контроли просто нарисованы, они ловят сообщения о нажатых клавишах, они сами рисуют свое содержимое и если надо, показывают мигающий курсор (caret). Собственно, и стандартный edit делает тоже самое :)

едиты выглядят одинаково, стоят рядом, а содержание одного получить могу, а другого нет.
Это, конечно, странно, вероятно у тебя ошибка :)

Ты не пробовал посмотреть на свое приложение через WinSight32 (идет вместе с Delphi) или Spy++ (идет с Visual Studio и по-приятнее)? Если ты все же сам хочешь написать программку - положи таймер на формочку и вытаскивай по его срабатыванию информацию об окне под мышкой (через WindowFromPoint). Вытаскивай из окна его текст и имя класса - тебе это сразу даст много полезной информации.


 
Suntechnic   (2003-06-05 05:27) [17]

>nikkie © (05.06.03 02:21)
Я бросил следить за Java после jdk 1.1.4 так что вполне возможно, что Java 2 уже содержит Swing...

Только аналогия между VCL и Swing прослеживается очевидная. Точно так же как для запуска приложений, написанных с использованием VCL требуется доустановка соответсвующих runtime библиотек Борланда (или билдить с включённой опцией build with runtime packages, что в принципе одно и тоже), точно также для запуска, скажем, Java апплета на IE 6 требутся догрузка соотв. классов потому, как по умолчанию виртуальная Java машина от того же Microsoft понятия не имеет ни о каком Swing, а на рядовой машине рядового пользователя трудно ожидать установленного JRE.

И VCL и Swing это просто библиотеки компонентов. Точно также как на Delphi можно писать не используя VCL, на Java можно писать не используя Swing.
И то и другое предпочтительно делать для выигрыша в первую очередь размера. Для Java это ещё более актуально т.к. если нацеливаться на использование апплетов в Интернет (что помимо переностимости кода является одним из основных аргументов разработок на Java), то использование Swing порой просто неприемлемое (мало какой клиент, посещающий web страничку будет ждать пока загрузятся 3-5 Mb Swing классов(таким по крайней мере был размер Swing во времена jdk 1.x))

И последнее... безусловно Swing это не к.н. левая библиотека компонентов, точно также как таковой не является и VCL :)


 
nikkie   (2003-06-05 14:30) [18]

>Swing это не к.н. левая библиотека компонентов, точно также как таковой не является и VCL :)
Не согласен. Чтобы не обижать любимую VCL, скажем, что это продукт разработанный сторонней компанией и не поддерживаемый основным производителем. С этим-то ты должен согласиться :).


 
АТ   (2003-06-08 08:15) [19]

Уважаемые, узнал наконец точно на чем написано это приложение, в котором мне надо нажимать на кнопочку. Oracle Developer слыхали про такой? Может кто сталкивался, подскажите что-нибудь... Щас скажу что.
Во-первых собственными глазами наблюдал такой эффект - смотрю окна через WinSight32, замечаю Edit, в котором значение такое же как в том, который нужен мне. Ну думаю нашел! Вот он заветный дескриптор. Но! Установить туда фокус не удается - это во первых, но поразило меня даже не это а вот что - короче перехожу я на форму, описанную выше, смотрю на Edit - вот он, потом кликаю в рядомстоящий Edit, и что бы вы думали, в WinSight32 у найденного мной ранее Edit"а меняется значение на то, которое во втором Edite, хотя дескриптор остается постоянный. Это что ж получается, Edit меняет координаты следуя за мышкой? Хотя может это еще третий едит, который и на форме-то не увидишь...

Люди, скажите мне наконец, если у меня приложение к базе, которым надо управлять написано на этом Oracle Developer, стоит мне заморачиваться с дескрипторами? Ведь не видит эти Edit"ы WinSight32! Как же мне получать дескрипторы этих объектов, которые для WinAPI, насколько я понял, вообще не объекты. Что делать-то? Может есть какие-то другие библиотеки, я уж не знаю что и спросить.

Пытался я рашить проблему виртуально нажимая на клавишу Таb, пытался вытаскивать значение нажимая виртуально на Ctrl+C, все вроде получалось, но почему-то Таb в какой-то момент перестает работать, да и как-то некрасиво это. Короче я каждый раз возвращаюсь к этим дескрипторам, хотя может и не стоит уже???


 
АТ   (2003-06-10 08:40) [20]

Люди, ну подскажите как управлять компанентами приложения, написанного в Oracle Developer. Я с API работаю первый раз в жизни, причем задача, сами видите довольно, неординарная.

1.Существуют-ли еще способы, кроме API, перевести фокус в нужный Edit? Это принципиально важно, т.к. в приложении скорее всего зашит обработчик типа onFocused, по этому событию обновляются значения в полях формы.
2.Мне надо вытаскивать из Edit"ов и
3.Мне надо записывать в Edit"ы(которые не видны через API), различные значения.

Плз.

А напоследок немного флейма.
Рискну сделать предположение о том, как в Oracle Developer реализованы Edit"ы. Похоже что на форму ложится некий шаблон Edit"а(компонента Windows), который как бы фотографируется в область под мышкой, и позволяет работать с этой областью как со стандартным Edit"ом. Поэтому при клике мышкой в разные Edit"ы значение его меняется на то, которое записано в этот момент в данном Edit"e(Это видно в WinSight32). Напоминаю, что этот Edit не виден, я пытался переводить на него фокус через ф-ии API, но у меня это не получалось.


 
nikkie   (2003-06-10 15:03) [21]

>Oracle Developer слыхали про такой? Может кто сталкивался, подскажите что-нибудь...
Слыхали, конечно, но его у меня нет, так что помочь ничем не могу.

>как бы фотографируется в область под мышкой
Это ты чего-то нафантазировал. Приведи здесь дерево окон, которое ты видишь в WinSight"e, будет проще фантазировать на тему того, как он работает. Вероятно, что он делает так: все данные показываются в а-ля лейблах, а для редактирования используется 1 едит на всех. Когда тыкаешься мышкой или жмешь TAB, то имитируется переход фокуса: данные из едита сохраняются в нужном поле, едит перемещается к следующему полю, в него загружаются данные из этого поля. Если появляются и другие контроли (скажем комбобоксы), то значит там есть один комбо на всех, едит прячется, а комбо показывается.

Если это так, то есть 2 варианта - надо имитировать тыканье мышкой или нажатие TAB. Посылкой сообщений или функциями keybd_event, mouse_event.

Хорошо бы еще разузнать что-нибудь про Oracle Developer"a - может он какой API предоставляет, или COM-сервером является. Хотя вряд ли, конечно...

>я пытался переводить на него фокус через ф-ии API, но у меня это не получалось.
С помощью SetFocus пробовал? А просто надо было хелп читать:

The SetFocus function sets the keyboard focus to the specified window. The window must be attached to the calling thread"s message queue.


 
slykirill   (2003-06-10 15:35) [22]

есть такая штука как sndkey32 я ей сам недавно пользовался.. немного доработал под своё.. Если ты знаешь, что после определенного нажатия tab`ов, enter`ов или стрелочек ты попадёшь на этот edit то вполне реально ей воспользоваться.. то есть ловишь окно с именем, берёшь его handle и передаешь в него добустим tab tab tab enter и у тебя в том окне произуйдут события, соответствующие нажатиям кнопок :) так же можно и править текст.. а немного подправив, можно получить и содержимое edit`а... если надо, могу выслать.


 
АТ   (2003-06-10 19:55) [23]

nikkie > Вероятно, что он делает так: все данные показываются >в а-ля лейблах...
Совершенно согласен, вообще-то я именно это имел ввиду, но все равно спасибо, шефу так и скажу. :) И за функции спасибо.
2slykirill: У меня тоже есть реализация такого модуля. Я его использовал в проге. Кстати а содержимое edit"ов ты с помощью Ctrl-C получать предлагал? Если да, то я именно это использовал.

Короче всем спасибо за внимание и помощь, сегодня демонстрировал первую версию программы начальству. Конечно я еще далек от создания большой красной кнопки, которая все сделает, но первый шаг сделан.


 
nikkie   (2003-06-10 21:03) [24]

зачем же через Ctrl-C? если ты можешь передвинуть этот магический едит на нужное поле, если ты знаешь хендл этого магического едита, то просто WM_GETTEXT.



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

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

Наверх





Память: 0.54 MB
Время: 0.786 c
1-33103
Zheks
2003-07-29 16:55
2003.08.11
Округление


1-33163
Pauk
2003-07-27 14:14
2003.08.11
Caption


14-33301
Степан Петрович
2003-07-17 16:27
2003.08.11
Организация компьютерной бухгалтерии


14-33293
Пубертанец
2003-07-24 13:56
2003.08.11
Понимаю, что не по теме, но все же...


6-33236
napil
2003-06-01 04:14
2003.08.11
Потоковое AUDIO





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский