| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > VB6 > Как отправить в TextBox другого приложения из VB |
| Автор: KUSHNIR 10.2.2008, 12:23 |
| Всем здравствуйте ! Столкнулся с проблемой отправки набора символов из приложения на VBA в текстовое поле другого приложения. Определить имя окна другого приложения по его наименованию я могу. Окно приложения состоит из Label, TextBox, кнопка [OK], кнопка [Отмена]. Необходимо программно отправить из VBA нобор символов в TextBox и нажать кнопку [OK] Подскажите пожалуйста как это сделать? |
| Автор: I_Am_Rock 10.2.2008, 13:45 | ||
| Вот код. Он работает, учитывая, что текстбокс находится в проге, написанной на VB. Если прога написана не на VB, надо будет кое-что изменить...
|
| Автор: KUSHNIR 10.2.2008, 14:17 |
| Спасибо! Программа написана не на VB. Проблема в том как программно определить имя и обратиться к TextBox. |
| Автор: I_Am_Rock 10.2.2008, 14:26 | ||
| Т.е. нужно определить класс текстбокса? (то, что в моем коде - ThunderRT6TextBox) Это можно узнать при помощи Spy++, который находится на диске с VB Если не сможете это сделать, передайте как-нибудь прогу мне. Я сам определю. Написать адрес почты в личку? Добавлено через 5 минут и 40 секунд Я тут подумал. Если в ТекстБоксе ничего нет, то его, скорее всего, можно найти, заменив одну строчку
|
| Автор: I_Am_Rock 10.2.2008, 14:46 |
| Я сразу не заметил - Вам еще нужно нажатие на OK. Подождите - через минут 10-15 будет код... |
| Автор: I_Am_Rock 10.2.2008, 15:03 | ||
Вот как делается нажатие.
Я смогу сделать полноценный код (т.е. посылка текста в текстбокс и нажатие), только если у меня будет прога, с которой это все проделывается... |
| Автор: I_Am_Rock 10.2.2008, 15:49 |
| Да, так найти (через пустую строку) действительно не получается... Можно попробовать найти хэндл текстбокса методом исключения, т.е. проверить по очереди все дочерние объекты и если GetWindowText не равен "OK" "Отмена" или тексту в Лэйбле, то это, то что нужно... Если не найдете spy++ или не разберетесь в нем, то могу посоветовать программу InqSoft Sign 0f Misery - у нее есть удобный сканер окон... Добавлено через 1 минуту и 2 секунды Насколько я знаю, эта прога бесплатна, небольшой по мегам дистрибутив и ее не сложно найти в Сети... |
| Автор: KUSHNIR 10.2.2008, 16:17 |
| Да на шел SPY++ С помощью этой программы нашел параметры TextBox. Теперь задача какие из найденных параметров вставить в код Вот представляю ScreeShot |
| Автор: I_Am_Rock 10.2.2008, 17:49 |
| По всей видимости, нужно вместо ThunderRT6TextBox в моем коде вставить ClaEdit... А потом нажатие кнопки, как я уже писал... |
| Автор: I_Am_Rock 10.2.2008, 18:05 | ||
| Я обратил внимание, что между родительским окном и ТекстБоксом находится "промежуточное" дочернее окно ClaChildClient... Вот код. Напишите - работает или нет...
|
| Автор: KUSHNIR 11.2.2008, 15:36 | ||
| Я отлучался на некоторое время, Работа... немного модифицировал код
Товарищу I_Am_Rock огромнешее спасибо !!! и много плюсов! Спасибо |
| Автор: I_Am_Rock 11.2.2008, 16:23 |
| Я отправил персональное сообщение...) Рад что смог помочь... |
| Автор: Akina 11.2.2008, 18:59 |
Done |
| Автор: suvorr 7.4.2008, 07:35 |
| I Am Rock-y Попытался вставить указанным образом текст в поле навигации FireFox-a. Ни фига не вышло! Хэндла толком не нашел, слал всем подряд чилдренам родительского окна до третьего поколения. Мне кажется что он его засылает не в текст а в заголовок (которого не видно!). Может надо мессадж другой? Что такое &HC и откуда взялось? (Хотя с другими окнами все работает тип-топ) |
| Автор: I_Am_Rock 7.4.2008, 12:31 | ||
В прикрепл. файле моя прога. С помощью "Найти мышью" найди этот текстбокс. Нажми "Скрыть" и "Показать", чтобы убедиться, что это он. Потом с помощью "Опред. родительский" определяй его родительские объекты до главного окна. В своей программе ищи его по классу. Класс можно опред. с помощью InqSoft Sign 0f Misery (ищи в инете) P.S. Вообще разные чудеса с этими объектами бывают. Например, панель меню в проводнике не явл. обычным меню, как в др. прогах (напр., в блокноте), а явл. объектом... |
| Автор: 20071231 7.4.2008, 14:39 |
| хотелось бы сказать большое спасибо I_Am_Rock, очень полезную тему разобрали. у меня вот вопрос, с помощью этой проги "InqSoft Window Scanner" я легко нахожу имена классов любых окон. мне понадобилось отправлять сообщения в окно браузера, в чате на майле, но "InqSoft Window Scanner" определяет, что все что идет под панелью как бы одно окно, все что там имеет одно имя класса, и отправляя в него сообщения ничего не проиходит, не подскажите что можно сделать? может можно какими либо способами передать фокус этому окошку, проблема в том что само это маленькое окошко не имеет своего собственного имени класса еще хотел спросить у I_Am_Rock, каким методом ты делаешь окна активными, неактивными, скрыть показать, и получить текст окна? |
| Автор: I_Am_Rock 7.4.2008, 17:24 | ||||||
| С чатом на мэйле я, наверное, не смогу тебе помочь...( Активным/неактивным
Показать/Спяртать
Узнать заголовок окна
|
| Автор: 20071231 7.4.2008, 18:17 |
| Большое спасибо)) |
| Автор: 20071231 7.4.2008, 18:38 | ||
все работает кроме этой функции
на GetWindowTextLength гугается, м, мож я прост не догнал чво, ее в форму веть вставлять? |
| Автор: I_Am_Rock 7.4.2008, 18:47 | ||||||
| Это мой косяк... вместо 1 строчки в твоем последнем коде...
Добавлено через 33 секунды А! Нет - Та чтрочка тоже нужна...) Добавлено через 1 минуту и 21 секунду Вот так...
Добавлено через 6 минут и 39 секунд А потом...
, где h - Заголовок окна... |
| Автор: suvorr 8.4.2008, 10:03 |
| I m Rock-y Поюзал Вашу прогу. Во первых, если интересен отзыв юзера, позвольте пару технических комментов. -Если не ставить "Поверх всех окон" то при запуске обьекта (ФайрФокса например) прога прячется и непонятно как ее зажечь! В панели то задач ее нет! - Если же поставить "Поверх.." то прога закрывает собой свои собственные меседжбоксы ("дочерних окон нет") и при этом не перетаскивается и ни на что не реагирует! То есть мне пришлось ее гасить через таскменеджер, да и тот еще каким-то образом завис! _Кашмааар! Ну ладно -это лирика. Теперь по сути. Я нашел след семейство окон 860 362 712-934-650-816 860 это окно проги с заголовком 362 - выдается с помощью "найти мышью" но на скрыть\показать никак не реагирует 712 -не знаю 934 -это ЗНАЧОК В ИНТЕРЕСУЮЩЕМ МЕНЯ ПОЛЕ ВВОДА!!(реагирует на скрыть\показать) 650 и 816 -это уже там следующие окна которые меня не интересуют И что дальше? Изменеие текста никак на экране не отражается. SendMessage - кому и какое ? |
| Автор: I_Am_Rock 8.4.2008, 10:41 |
| Нужно найти главное окно с помощью FindWindow, и потом по очереди дочерние с помощью FindWindowEx. Даже если объект не реагирует на скрыть/показать, то его нельзя игнорировать. Найденному нужному окну посылается СендМесседж, как в примерах на первой странице з.ы. А разве значок моей проги не отображается в трее? |
| Автор: I_Am_Rock 8.4.2008, 11:21 |
| Объекты лучше искать по классу... Класс опред. в программе, о которой я, наверное, уже раз сто сказал - повторяться не буду... |
| Автор: suvorr 8.4.2008, 12:38 |
| -Значок в трее есть. Но при клике по нему Ваше окно не всплывает! А при правом клике вообще пропадает с концами и приходится опять юзать таскменеджер. -Я нашел главное окно. Это окно проги с заголовком FireFox .№ ..860. Не вопрос. - Я перебрал с помощью Вашей проги все дочерние окна. Не вопрос -Но ни одно из них видимо не является тем полем ввода которое мне надо! Вот вопрос! Но, впрочем, меня это никак не держит. Чисто так любопытно было разобраться. Посмотрите если будет интересно. FireFox вещица не безъизвестная. |
| Автор: I_Am_Rock 8.4.2008, 14:18 |
| Окей - найду ФайрФокс, попытаюсь сделать - и если получится, то напишу об этом здесь... з.ы. У меня всплывает (от двойного клика)... Странно...:( |
| Автор: 20071231 9.4.2008, 16:00 |
| Спасибо, все работает, но у мня еще такой вопрос, это чтобы узнать заголовок, а если мне нужен непосредственно текст в текстовом окне, этим кодом он не определяется, низнаите как? |
| Автор: I_Am_Rock 9.4.2008, 16:24 | ||||
Этот способ не только, для того, чтобы узнать заголовок, но и текст с надписи, кнопки и т.п. А вот текст с текстового окна и прочих текстбоксов так действительно не узнать. Этот вопрос мучил меня самого, пока я не нашел ответ на форуме (в какой-то старой-старой теме). Я могу ошибаться (призабыл уже), но по-моему надо делать так:
|
| Автор: I_Am_Rock 9.4.2008, 16:54 |
| не... к сожалению, не могу сказать как это делается...:( |
| Автор: suvorr 13.4.2008, 09:38 |
| Да! От двойного всплывает! Не додумал. Всегда в трее пользовал правый. Бывает..... |
| Автор: I_Am_Rock 13.4.2008, 10:49 | ||
Ну вот! А что - программа до сих пор полезна Вам в работе? Если так, то я рад. Если что-то не понятно из функций (мне лень было делать справку - ведь писал прогу для себя), спрашивайте... |
| Автор: fiver 23.4.2008, 12:06 | ||
функция GetWindowText копирует текст заголовка окна, но если указанное окно является элементом, копируется текстовое содержимое элемента. следовательно в функцию нужно передать хэндл элемента, а как найти его I_Am_Rock писал ранее. |
| Автор: 20071231 26.4.2008, 15:39 | ||||
Добавлено через 4 минуты и 14 секунд нашел я один код, он возвращает текст текстового окна, но работает тольк в блокноте, почти во всех остальных приложениях не хочет, определяет длину текста, но сам текст не возвращает..
мож я что не так сделал.. Подскажите кто-нибудь пжалуста, как это можно сделать я долго рылся в инете, ничво нормального и работающего не нашел |
| Автор: I_Am_Rock 26.4.2008, 17:11 | ||
| Потестил код... Опробовал его в Блокноте и WordPad'е. Все норм! Советую внимательнее проследить иерархию хендлов в той проге, откуда достается текст. Возможно, что между текст. полем и главн. окном есть другие хендлы. Их нельзя игнорировать. !!! Но есть одно НО! Код почему-то возвращает не "Всем привет", а "Всем приве", т.е. я хочу сказать, что код "забывает" последнюю букву... Код для WordPad
|
| Автор: 20071231 26.4.2008, 18:47 | ||||
| хм, да я щас тольк что заметил, ну методом тыка) нашел как это исправить) в строке
добавляем к TextCount +1 , я так понимаю) это количество возвращаемых символов
но проблема остается проблемой, ты вот попробуй из окна скажем калькулятора текст вынуть, у мня не получилось, у множества остальных программ |
| Автор: I_Am_Rock 26.4.2008, 19:25 | ||
| Проверил с Калькулятором. Все работает как надо, причем (внимание!) здесь даже не возникает проблема с последним знаком! Вот код.
|
| Автор: 20071231 26.4.2008, 23:28 |
| млин, я не знаю, щас щапустил калькулятор нашел.. но вапщет у мня частная ситуация не извлекает из проги акм@чат, я с ней мучаюсь уже низнаю сколько, вродь все остальные извлекает из нее не хочит, иза чего это может быть? он находит все, и даже находит количество символов в окне но сами символы не извлекает, что я тольк не делал..( |
| Автор: I_Am_Rock 26.4.2008, 23:37 |
| Христос воскрес! Завтра скачаю прогу и потестю) Если получится что-то сделать - отпишусь) |
| Автор: 20071231 27.4.2008, 00:29 | ||
|
| Автор: 20071231 27.4.2008, 08:31 |
| м, седня попробовал есче раз и ужаснулся (или обрадовался уже не знаю) работает и в акм-е, может неработало из-за того что всегда тестил не из с скомпилированного приложения а прямо с бейскика? подобные глюки бывают ведь, так не работает а скомпилиш и пошло.. я не знаю.. I_Am_Rock тебе большое спасибо, если бы у мня было достаточно постов яп тебе в репутацию кликнул бы Добавлено через 4 минуты и 33 секунды да сори еще хотел спросить, как узнавать хендлы соседних элементов, если там например на форме два окна , с одинаковым именем класса, FindWindow находит все время одно окно, как узнать хендл второго, если имя класса тоже |
| Автор: I_Am_Rock 27.4.2008, 12:21 | ||||
Ну тогда пробовать мне незачем Я обратил внимание, что в твоем коде в последней строчке было написано "Text1 = то-то и то-то" вместо "Text1.Text = то-то и то-то" .... Может, из-за этого не работало?
Тогда по заголовку. Если же и заголовок у них одинаковый, тогда тебе должно помочь вот это
Эти функции возвращают следующий и предыдущий хендлы... |
| Автор: 20071231 27.4.2008, 14:25 |
| спасиб все работает |
| Автор: 20071231 27.4.2008, 15:56 |
| Модераторы, I_Am_Rock мне очень помог, но я не могу повысить ему репутацию. Повысьте ее ему пожалуйста |
| Автор: DubVader 5.8.2011, 17:34 |
| I_Am_Rock РЕАЛЬНО РЕШАЕТ!!!1 |
| Автор: I_Am_Rock 14.9.2011, 21:14 |
| Приятно слышать |