Форум: "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