Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как отправить в TextBox другого приложения из VB, В TextBox другого приложения из VB 
:(
    Опции темы
KUSHNIR
  Дата 10.2.2008, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



Всем здравствуйте ! Столкнулся с проблемой отправки набора символов из приложения на VBA в текстовое поле другого приложения.
Определить имя окна другого приложения по его наименованию  я могу. 
Окно приложения состоит из Label, TextBox, кнопка [OK], кнопка [Отмена].
Необходимо программно отправить из VBA нобор символов в TextBox и нажать кнопку [OK]
Подскажите пожалуйста как это сделать?
PM MAIL   Вверх
I_Am_Rock
Дата 10.2.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Вот код.
Он работает, учитывая, что текстбокс находится в проге, написанной на VB.
Если прога написана не на VB, надо будет кое-что изменить...

Код

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Dim g, k

Private Sub Command1_Click()
g = FindWindow(vbNullString, "Form1") ' Здесь Form1 - заголовок окна с текстбоксом
k = FindWindowEx(g, 0, "ThunderRT6TextBox", vbNullString) ' ищем хэндл текстбокса
SendMessage k, &HC, 0, ByVal "Текст"
End Sub

PM MAIL WWW   Вверх
KUSHNIR
  Дата 10.2.2008, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



Спасибо!
Программа написана не на VB.
Проблема в том как программно определить имя и обратиться к TextBox.
PM MAIL   Вверх
I_Am_Rock
Дата 10.2.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Т.е. нужно определить класс текстбокса? (то, что в моем коде - ThunderRT6TextBox)

Это можно узнать при помощи Spy++, который находится на диске с VB

Если не сможете это сделать, передайте как-нибудь прогу мне. Я сам определю. Написать адрес почты в личку?

Добавлено через 5 минут и 40 секунд
Я тут подумал.
Если в ТекстБоксе ничего нет, то его, скорее всего, можно найти, заменив одну строчку

Код

k = FindWindowEx(g, 0, vbNullString, "") ' ищем хэндл текстбокса

PM MAIL WWW   Вверх
I_Am_Rock
Дата 10.2.2008, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Я сразу не заметил - Вам еще нужно нажатие на OK.

Подождите - через минут 10-15 будет код...
PM MAIL WWW   Вверх
I_Am_Rock
Дата 10.2.2008, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Вот как делается нажатие.

Код

Private Declare Function SendNotifyMessage Lib "user32" Alias "SendNotifyMessageA" (ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Dim z

' В какой-то процедуре
z = FindWindowEx(g, 0, vbNullString, "OK") ' Ищем кнопочку...
' Проследите, чтобы слово OK здесь и в кнопке была написано на одном языке...
SendNotifyMessage z, WM_LBUTTONDOWN, 0, 0 ' Нажимаем ее
SendNotifyMessage z, WM_LBUTTONUP, 0, 0 ' Отжимаем ее


Я смогу сделать полноценный код (т.е. посылка текста в текстбокс и нажатие), только если у меня будет прога, с которой это все проделывается...
PM MAIL WWW   Вверх
KUSHNIR
  Дата 10.2.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



Цитата(I_Am_Rock @  10.2.2008,  14:26 Найти цитируемый пост)
код Visual Basic
k = FindWindowEx(g, 0, vbNullString, "") ' ищем хэндл текстбокса


k > 0 функция что-то нашла но в текстбокс ничего незаписалось.
Причём при повторном выполнение процедуры к=0
SPY++ посмотрю должно быть где-то на дисках.


Спасибо. Есть направление в котором нужно искать.
PM MAIL   Вверх
I_Am_Rock
Дата 10.2.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Да, так найти (через пустую строку) действительно не получается...

Можно попробовать найти хэндл текстбокса методом исключения, т.е. проверить по очереди все дочерние объекты и если GetWindowText не равен "OK" "Отмена" или тексту в Лэйбле, то это, то что нужно...

Если не найдете spy++ или не разберетесь в нем, то могу посоветовать программу InqSoft Sign 0f Misery - у нее есть удобный сканер окон...

Добавлено через 1 минуту и 2 секунды
Насколько я знаю, эта прога бесплатна, небольшой по мегам дистрибутив и ее не сложно найти в Сети...
PM MAIL WWW   Вверх
KUSHNIR
  Дата 10.2.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



Да на шел SPY++
С помощью этой программы нашел параметры TextBox.
Теперь задача какие из найденных параметров вставить в код 
Вот представляю ScreeShot

Присоединённый файл ( Кол-во скачиваний: 20 )
Присоединённый файл  Screen.zip 20,25 Kb
PM MAIL   Вверх
I_Am_Rock
Дата 10.2.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



По всей видимости, нужно вместо ThunderRT6TextBox в моем коде вставить ClaEdit...

А потом нажатие кнопки, как я уже писал...
PM MAIL WWW   Вверх
I_Am_Rock
Дата 10.2.2008, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Я обратил внимание, что между родительским окном и ТекстБоксом находится "промежуточное" дочернее окно ClaChildClient...
Вот код. Напишите - работает или нет...

Код

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SendNotifyMessage Lib "user32" Alias "SendNotifyMessageA" (ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Dim g, f, k, z

Private Sub Command1_Click()
g = FindWindow(vbNullString, "TopScan") ' Здесь TopScan - заголовок окна с текстбоксом
f = FindWindowEx(g, 0, "ClaChildClient", vbNullString)
k = FindWindowEx(f, 0, "ClaEdit", vbNullString) ' Ищем хэндл текстбокса
SendMessage k, &HC, 0, ByVal "Текст"
z = FindWindowEx(f, 0, "ClaButton", "OK") ' Ищем кнопочку...
' Проследите, чтобы слово OK здесь и в кнопке была написано на одном языке...
SendNotifyMessage z, WM_LBUTTONDOWN, 0, 0 ' Нажимаем ее
SendNotifyMessage z, WM_LBUTTONUP, 0, 0 ' Отжимаем ее
End Sub


Это сообщение отредактировал(а) I_Am_Rock - 10.2.2008, 18:06
PM MAIL WWW   Вверх
KUSHNIR
  Дата 11.2.2008, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



 Я отлучался на некоторое время, Работа...
немного модифицировал код
Код

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SendNotifyMessage Lib "user32" Alias "SendNotifyMessageA" (ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Dim g, f, k, z

Private Sub Command1_Click()
g = FindWindow(vbNullString, "TopScan") ' Здесь TopScan - заголовок окна с текстбоксом
f = FindWindowEx(g, 0, "ClaChildClient", vbNullString)
k = FindWindowEx(f, 0, "ClaEdit", vbNullString) ' Ищем хэндл текстбокса
EnableWindow k, 1
SendMessage k, &HC, 0, ByVal "ТNHH"
z = FindWindowEx(f, 0, "ClaButton", "&OK") ' Ищем кнопочку...
'  Немного модифицировал "&OK" т.к. на форме она с подчеркиванием
' Проследите, чтобы слово OK здесь и в кнопке была написано на одном языке...
' на всякий случай включаем кнопку т.е. делаем Enabled True
EnableWindow z, 1

SendNotifyMessage z, WM_LBUTTONDOWN, 0, 0 ' Нажимаем ее
SendNotifyMessage z, WM_LBUTTONUP, 0, 0 ' Отжимаем ее
End Sub

 
Товарищу I_Am_Rock огромнешее спасибо !!! и много плюсов!
Спасибо smile 
PM MAIL   Вверх
I_Am_Rock
Дата 11.2.2008, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Я отправил персональное сообщение...)

Рад что смог помочь...
PM MAIL WWW   Вверх
Akina
Дата 11.2.2008, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(KUSHNIR @  11.2.2008,  16:36 Найти цитируемый пост)
Товарищу I_Am_Rock огромнешее спасибо !!! и много плюсов!

Done


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
suvorr
Дата 7.4.2008, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 28.1.2006
Где: SPb

Репутация: нет
Всего: нет



I Am Rock-y  Попытался вставить указанным образом текст в поле навигации FireFox-a. Ни фига не вышло! Хэндла толком не нашел, слал всем подряд чилдренам родительского окна до третьего поколения. Мне кажется что он его засылает не в текст а в заголовок (которого не видно!). Может надо мессадж другой? Что такое &HC и откуда взялось? (Хотя с другими окнами все работает тип-топ) 
PM MAIL WWW Skype   Вверх
I_Am_Rock
Дата 7.4.2008, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Код

Private Const WM_SETTEXT = &HC


В прикрепл. файле моя прога. С помощью "Найти мышью" найди этот текстбокс. Нажми "Скрыть" и "Показать", чтобы убедиться, что это он. Потом с помощью "Опред. родительский" определяй его родительские объекты до главного окна.
В своей программе ищи его по классу. Класс можно опред. с помощью InqSoft Sign 0f Misery (ищи в инете)

P.S. Вообще разные чудеса с этими объектами бывают. Например, панель меню в проводнике не явл. обычным меню, как в др. прогах (напр., в блокноте), а явл. объектом...

Это сообщение отредактировал(а) I_Am_Rock - 7.4.2008, 12:32

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  UpravlenieObjectami.rar 17,47 Kb
PM MAIL WWW   Вверх
20071231
Дата 7.4.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2007
Где: Россия, Белая Кал итва

Репутация: нет
Всего: нет



хотелось бы сказать большое спасибо I_Am_Rock, очень полезную тему разобрали. у меня вот вопрос, с помощью этой проги "InqSoft Window Scanner" я легко нахожу имена классов любых окон. мне понадобилось отправлять сообщения в окно браузера, в чате на майле, но "InqSoft Window Scanner" определяет, что все что идет под панелью как бы одно окно, все что там имеет одно имя класса, и отправляя в него сообщения ничего не проиходит, не подскажите что можно сделать? 

может можно какими либо способами передать фокус этому окошку, проблема в том что само это маленькое окошко не имеет своего собственного имени класса

еще хотел спросить у I_Am_Rock, каким методом ты делаешь окна активными, неактивными, скрыть показать, и получить текст окна?

Это сообщение отредактировал(а) 20071231 - 7.4.2008, 14:53
PM MAIL   Вверх
I_Am_Rock
Дата 7.4.2008, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



С чатом на мэйле я, наверное, не смогу тебе помочь...(

Активным/неактивным
Код

Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
EnableWindow g, 0
EnableWindow g, 1


Показать/Спяртать
Код

Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
ShowWindow g, 0
ShowWindow g, 5
'значения от 1 до 4 тоже, кажется, как-то показывают. Точно не знаю - как...


Узнать заголовок окна
Код

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

'Не помню, где взял эту функцию
Private Function GetCaption(ByVal lhWnd As Long) As String
Dim sA As String, lLen As Long
lLen& = GetWindowTextLength(lhWnd&)
sA$ = String(lLen&, 0&)
Call GetWindowText(lhWnd&, sA$, lLen& + 1)
GetCaption$ = sA$
End Function

GetCaption(g)

PM MAIL WWW   Вверх
20071231
Дата 7.4.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2007
Где: Россия, Белая Кал итва

Репутация: нет
Всего: нет



Большое спасибо))  smile 
PM MAIL   Вверх
20071231
Дата 7.4.2008, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2007
Где: Россия, Белая Кал итва

Репутация: нет
Всего: нет



все работает кроме этой функции

Код

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

'Íå ïîìíþ, ãäå âçÿë ýòó ôóíêöèþ
Private Function GetCaption(ByVal lhWnd As Long) As String
Dim sA As String, lLen As Long
lLen& = GetWindowTextLength(lhWnd&)
sA$ = String(lLen&, 0&)
Call GetWindowText(lhWnd&, sA$, lLen& + 1)
GetCaption$ = sA$
End Function


на GetWindowTextLength гугается, м, мож я прост не догнал чво, ее в форму веть вставлять?

PM MAIL   Вверх
I_Am_Rock
Дата 7.4.2008, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Это мой косяк...

вместо 1 строчки в твоем последнем коде...

Код

Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long


Добавлено через 33 секунды
А! Нет - Та чтрочка тоже нужна...)

Добавлено через 1 минуту и 21 секунду
Вот так...smile

Код

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long


Private Function GetCaption(ByVal lhWnd As Long) As String
Dim sA As String, lLen As Long
lLen& = GetWindowTextLength(lhWnd&)
sA$ = String(lLen&, 0&)
Call GetWindowText(lhWnd&, sA$, lLen& + 1)
GetCaption$ = sA$
End Function


Добавлено через 6 минут и 39 секунд
А потом...

Код

h = GetCaption(g)


, где h - Заголовок окна...
PM MAIL WWW   Вверх
suvorr
Дата 8.4.2008, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 28.1.2006
Где: SPb

Репутация: нет
Всего: нет



I m Rock-y   Поюзал Вашу прогу. Во первых, если интересен отзыв юзера, позвольте пару технических комментов.
 -Если не ставить "Поверх всех окон" то при запуске обьекта (ФайрФокса например) прога прячется и непонятно как ее зажечь! В панели то задач ее нет! 
- Если же поставить "Поверх.." то прога закрывает собой свои собственные меседжбоксы ("дочерних окон нет") и при этом не перетаскивается и ни на что не реагирует!
То есть мне пришлось ее гасить через таскменеджер, да и тот еще каким-то образом завис! _Кашмааар!
  Ну ладно -это лирика. Теперь по сути. Я нашел след семейство окон   860
                                                                                                                     362
                                                                                                                     712-934-650-816
860 это окно проги с заголовком
362 - выдается с помощью "найти мышью" но на скрыть\показать никак не реагирует
712 -не знаю
934 -это ЗНАЧОК В ИНТЕРЕСУЮЩЕМ МЕНЯ ПОЛЕ ВВОДА!!(реагирует на скрыть\показать)
650 и 816 -это уже там следующие окна которые меня не интересуют
И что дальше? Изменеие текста никак на экране не отражается. SendMessage - кому и какое ?


PM MAIL WWW Skype   Вверх
I_Am_Rock
Дата 8.4.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Нужно найти главное окно с помощью FindWindow, и потом по очереди дочерние с помощью FindWindowEx. Даже если объект не реагирует на скрыть/показать, то его нельзя игнорировать.
Найденному нужному окну посылается СендМесседж, как в примерах на первой странице

з.ы. А разве значок моей проги не отображается в трее? smile Иначе я бы не убрал его с панели задач... Др. замечания запомню и постараюсь исправить...smile
PM MAIL WWW   Вверх
I_Am_Rock
Дата 8.4.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Объекты лучше искать по классу... Класс опред. в программе, о которой я, наверное, уже раз сто сказал - повторяться не буду...smile
PM MAIL WWW   Вверх
suvorr
Дата 8.4.2008, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 28.1.2006
Где: SPb

Репутация: нет
Всего: нет



-Значок в трее есть. Но при клике по нему Ваше окно не всплывает!  А при правом клике вообще пропадает с концами и приходится опять юзать таскменеджер.

-Я нашел главное окно. Это окно проги с заголовком FireFox .№ ..860. Не вопрос.
- Я перебрал с помощью Вашей проги все дочерние окна. Не вопрос
-Но  ни одно из них видимо не является тем полем ввода которое мне надо! Вот вопрос!
Но, впрочем, меня это никак не держит. Чисто так любопытно было разобраться. Посмотрите если будет интересно. FireFox вещица не безъизвестная.



PM MAIL WWW Skype   Вверх
I_Am_Rock
Дата 8.4.2008, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Окей - найду ФайрФокс, попытаюсь сделать - и если получится, то напишу об этом здесь...smile

з.ы. У меня всплывает (от двойного клика)... Странно...:(
PM MAIL WWW   Вверх
20071231
Дата 9.4.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2007
Где: Россия, Белая Кал итва

Репутация: нет
Всего: нет



Спасибо, все работает, но у мня еще такой вопрос, это чтобы узнать заголовок, а если мне нужен непосредственно текст в текстовом окне, этим кодом он не определяется, низнаите как?
PM MAIL   Вверх
I_Am_Rock
Дата 9.4.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Цитата(20071231 @  9.4.2008,  16:00 Найти цитируемый пост)
Спасибо, все работает, но у мня еще такой вопрос, это чтобы узнать заголовок, а если мне нужен непосредственно текст в текстовом окне, этим кодом он не определяется, низнаите как? 

Этот способ не только, для того, чтобы узнать заголовок, но и текст с надписи, кнопки и т.п. А вот текст с текстового окна и прочих текстбоксов так действительно не узнать.

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

Код

'напишу через 5-10 минут

PM MAIL WWW   Вверх
I_Am_Rock
Дата 9.4.2008, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



не... к сожалению, не могу сказать как это делается...:(
PM MAIL WWW   Вверх
suvorr
Дата 13.4.2008, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 28.1.2006
Где: SPb

Репутация: нет
Всего: нет



Да! От двойного всплывает! Не додумал. Всегда в трее пользовал правый. Бывает.....
PM MAIL WWW Skype   Вверх
I_Am_Rock
Дата 13.4.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Цитата(suvorr @  13.4.2008,  09:38 Найти цитируемый пост)
Да! От двойного всплывает! Не додумал. Всегда в трее пользовал правый. Бывает..... 

Ну вот! smile
А что - программа до сих пор полезна Вам в работе? Если так, то я рад. Если что-то не понятно из функций (мне лень было делать справку - ведь писал прогу для себя), спрашивайте...
PM MAIL WWW   Вверх
fiver
Дата 23.4.2008, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 23.4.2008

Репутация: нет
Всего: нет



Цитата(20071231 @ 9.4.2008,  16:00)
Спасибо, все работает, но у мня еще такой вопрос, это чтобы узнать заголовок, а если мне нужен непосредственно текст в текстовом окне, этим кодом он не определяется, низнаите как?

функция GetWindowText копирует текст заголовка окна, но если указанное окно является элементом, копируется текстовое содержимое элемента. следовательно  в функцию нужно передать хэндл элемента, а как найти его I_Am_Rock писал ранее.
PM MAIL   Вверх
20071231
Дата 26.4.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2007
Где: Россия, Белая Кал итва

Репутация: нет
Всего: нет



Цитата

функция GetWindowText копирует текст заголовка окна, но если указанное окно является элементом, копируется текстовое содержимое элемента. следовательно  в функцию нужно передать хэндл элемента, а как найти его I_Am_Rock писал ранее.
я понимаю что в функцию нужно передавать хендл элемента.. так это и делается, но возвращаются только заголовки, надписи на кнопках, но не содержимое текстовых окон...

Добавлено через 4 минуты и 14 секунд
нашел я один код, он возвращает текст текстового окна, но работает тольк в блокноте, почти во всех остальных приложениях не хочет, определяет длину текста, но сам текст не возвращает.. 

Код

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE
Private Const WM_SETTEXT = &HC

Public Function GetWinText(w_Handle As Long) As String
'Функция возвращяет текст из окна c хендлом w_Handle
Dim buf() As Byte
Dim TextCount As Long, I As Long
Dim TempStr As String
TextCount = SendMessage(w_Handle, WM_GETTEXTLENGTH, 0, 0)
If TextCount = 0 Then Exit Function
ReDim buf(TextCount)
SendMessage CLng(w_Handle), WM_GETTEXT, TextCount, buf(1)
For I = 1 To UBound(buf)
TempStr = TempStr & Chr(buf(I))
Next I
GetWinText = TempStr
End Function

Private Sub Command1_Click()
Dim f As Long, g As Long
g = FindWindow("Notepad", vbNullString)
f = FindWindowEx(g, 0, "Edit", vbNullString)

Text1 = GetWinText(f)
End Sub

мож я что не так сделал..

Подскажите кто-нибудь пжалуста, как это можно сделать я долго рылся в инете, ничво нормального и работающего не нашел
PM MAIL   Вверх
I_Am_Rock
Дата 26.4.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Потестил код...
Опробовал его в Блокноте и WordPad'е. Все норм!
Советую внимательнее проследить иерархию хендлов в той проге, откуда достается текст.
Возможно, что между текст. полем и главн. окном есть другие хендлы. Их нельзя игнорировать.

!!! Но есть одно НО! Код почему-то возвращает не "Всем привет", а "Всем приве", т.е. я хочу сказать, что код "забывает" последнюю букву...

Код для WordPad

Код

Private Sub Command1_Click()
Dim f As Long, g As Long
g = FindWindow("WordPadClass", vbNullString)
f = FindWindowEx(g, 0, "RICHEDIT50W", vbNullString)

Text1.Text = GetWinText(f)
End Sub

PM MAIL WWW   Вверх
20071231
Дата 26.4.2008, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2007
Где: Россия, Белая Кал итва

Репутация: нет
Всего: нет



хм, да я щас тольк что заметил, ну методом тыка) нашел как это исправить)

в строке 
Код

SendMessage CLng(w_Handle), WM_GETTEXT, TextCount, buf(1)

добавляем к TextCount +1 , я так понимаю) это количество возвращаемых символов

Код

SendMessage CLng(w_Handle), WM_GETTEXT, (TextCount + 1), buf(1)


но проблема остается проблемой, ты вот попробуй из окна скажем калькулятора текст вынуть, у мня не получилось, у множества остальных программ
PM MAIL   Вверх
I_Am_Rock
Дата 26.4.2008, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Проверил с Калькулятором. smile
Все работает как надо, причем (внимание!) здесь даже не возникает проблема с последним знаком!

Вот код.
Код

Private Sub Command1_Click()
Dim f As Long, g As Long
g = FindWindow("SciCalc", vbNullString)
f = FindWindowEx(g, 0, "Edit", vbNullString)

Text1.Text = GetWinText(f)
End Sub

PM MAIL WWW   Вверх
20071231
Дата 26.4.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2007
Где: Россия, Белая Кал итва

Репутация: нет
Всего: нет



млин, я не знаю, щас щапустил калькулятор нашел.. но вапщет у мня частная ситуация не извлекает из проги акм@чат, я с ней мучаюсь уже низнаю сколько, вродь все остальные извлекает из нее не хочит, иза чего это может быть? он находит все, и даже находит количество символов в окне но сами символы не извлекает, что я тольк не делал..(
PM MAIL   Вверх
I_Am_Rock
Дата 26.4.2008, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Христос воскрес!

Завтра скачаю прогу и потестю) Если получится что-то сделать - отпишусь)
PM MAIL WWW   Вверх
20071231
Дата 27.4.2008, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2007
Где: Россия, Белая Кал итва

Репутация: нет
Всего: нет



Цитата

Христос воскрес!

Завтра скачаю прогу и потестю) Если получится что-то сделать - отпишусь)
спасибо) Воистину воскрес
PM MAIL   Вверх
20071231
Дата 27.4.2008, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2007
Где: Россия, Белая Кал итва

Репутация: нет
Всего: нет



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

I_Am_Rock тебе большое спасибо, если бы у мня было достаточно постов яп тебе в репутацию кликнул бы  smile  всем спасибо все вродь заработало..

Добавлено через 4 минуты и 33 секунды
да сори еще хотел спросить, как узнавать хендлы соседних элементов, если там например на форме два окна , с одинаковым именем класса, FindWindow находит все время одно окно, как узнать хендл второго, если имя класса тоже
PM MAIL   Вверх
I_Am_Rock
Дата 27.4.2008, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Цитата(20071231 @  27.4.2008,  08:31 Найти цитируемый пост)
 работает и в акм-е

Ну тогда пробовать мне незачем smile


Цитата(20071231 @  27.4.2008,  08:31 Найти цитируемый пост)
может неработало из-за того 

Я обратил внимание, что в твоем коде в последней строчке было написано "Text1 = то-то и то-то" вместо "Text1.Text = то-то и то-то" .... Может, из-за этого не работало?


Цитата(20071231 @  27.4.2008,  08:31 Найти цитируемый пост)
как узнавать хендлы соседних элементов, если там например на форме два окна , с одинаковым именем класса


Тогда по заголовку. Если же и заголовок у них одинаковый, тогда тебе должно помочь вот это
Код

Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wFlag As Long) As Long
Private Const GW_HWNDNEXT = 2
Private Const GW_HWNDPREV = 3

GetNextWindow(g, GW_HWNDNEXT)
GetNextWindow(g, GW_HWNDPREV)

Эти функции возвращают следующий и предыдущий хендлы...

Это сообщение отредактировал(а) I_Am_Rock - 27.4.2008, 12:22
PM MAIL WWW   Вверх
20071231
Дата 27.4.2008, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2007
Где: Россия, Белая Кал итва

Репутация: нет
Всего: нет



спасиб все работает  smile 
PM MAIL   Вверх
20071231
Дата 27.4.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2007
Где: Россия, Белая Кал итва

Репутация: нет
Всего: нет



Модераторы, I_Am_Rock мне очень помог, но я не могу повысить ему репутацию. Повысьте ее ему пожалуйста  smile 
PM MAIL   Вверх
DubVader
Дата 5.8.2011, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 4.8.2011

Репутация: нет
Всего: нет



I_Am_Rock РЕАЛЬНО РЕШАЕТ!!!1 smile 
PM MAIL   Вверх
I_Am_Rock
Дата 14.9.2011, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 12
Всего: 15



Приятно слышать   smile 
PM MAIL WWW   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.1716 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.