Как получить содержимое Label из другого приложения

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 24.03.2008 (Пн) 11:14

В таком случае, надо оптимизировать код функции MyTextOut, там много "тормозных" кусков кода, красным выделил функции, которые по моему мнению могут вызывать замедление работы


Function MyTextOut (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As Dword, ByVal nCount As Long) As Long
Local MyString As String
Static GetStr As String
If lpString Then MyString = Peek$(lpString, nCount)
SetHookProc 2
MyString=Space$(nCount*2)
MyString= Peek$(lpString, nCount*2)
MyString=ACode$(MyString)
Local gui As GUITHREADINFO
Local R As Long
gui.cbSize = SizeOf(GUITHREADINFO)
GetGUIThreadInfo ThreadID, gui To r
Local hProcess As Long
hProcess = FindWindow("TForm1", ByCopy "Form1")
If hProcess=GUI.hwndActive And hProcess<>0 Then
hProcess = FindWindow("", ByCopy "MY HOOK")
hProcess = FindWindowEx(hProcess,0,"ThunderRT6TextBox","")
GetStr=GetStr+MyString
SendMessage hProcess, %WM_SETTEXT, 0, StrPtr(GetStr)
hProcess=0
End If
TextOut hdc, x, y, ByVal StrPtr(MyString), Len(MyString)
SetHookProc 1
End Function

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Сообщение awl100Alex » 27.03.2008 (Чт) 18:43

maxboot писал(а):Может сделать в программе на VB таймер по которому данные будут обновляться через определенное время, при этом после того как таймер отсчитает нужное время, он отправит запрос на перерисовку окна дождеться получения данных из этого окна и снова будет отсчитывать время для следующего запроса? Как осуществить запрос из VB на хук в hookd.dll на время получение данных из лабел и после этого послать команду в hookd.dll для остановки опроса лабелов?


Можно и так попробовать, как ты предложил… Только не по времени… а по количеству запросов. Каждый 100-й запрос твой... ;)
Используя Static прямо в библиотеке хука hookd.dll. Примерно так:

Function MyTextOut (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As Dword, ByVal nCount As Long) As Long
………код………
………код………

Static Count As Byte
Count= Count+1
If Count < 100 then GoTo 1
Count=0

......выполнение кода перехвата.....

………код………
………код………
1: TextOut hdc, x, y, ByVal StrPtr(MyString), Len(MyString)
SetHookProc 1
End Function


Попробуй... Может получится. :)

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 28.03.2008 (Пт) 11:03

красным выделил функции, которые по моему мнению могут вызывать замедление работы
Ну, SizeOf в машинном коде не превращается в вызов функции. В код подставляется константа, значение которой вычисляется в момент компилирования.
If превращается в условный jmp, что безусловно замедляет работу, но не критично, так ка современные камни умеют предсказывать переходы.

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

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 28.03.2008 (Пт) 11:54

Twister - ты прав насчет SizeOf , это я ступил. Скорее всего там тормоза из-за текстовых функций:

MyString=Space$(nCount*2)

MyString=ACode$(MyString)

GetStr=GetStr+MyString

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Сообщение awl100Alex » 28.03.2008 (Пт) 12:49

maxboot
Ты мне в личке писал, что изменил hookd.dll таким образом, что он вставляет данные из сторонней программы в твою, переходя от одного текстбокса к другому методом перехода к следующему GetNextWindow(hProcess, 2)...

hProcess = FindWindow("ThunderRT6FormDC", "MY HOOK")
hProcess = FindWindowEx(hProcess,0,"ThunderRT6TextBox", "")
hProcess = GetNextWindow(hProcess, 2)
SendMessage hProcess, %WM_SETTEXT, 0, STRPTR(GetStr1)
.......
.......
SendMessage hProcess, %WM_SETTEXT, 0, STRPTR(GetStr5)
hProcess = GetNextWindow(hProcess, 2)
SendMessage hProcess, %WM_SETTEXT, 0, STRPTR(GetStr6)


Так может из-за всего этого и происходит торможение?!.. :(
Нужно подумать, как это упростить... :roll:

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Сообщение awl100Alex » 28.03.2008 (Пт) 13:09

Например, так...
Тебе нужно в hookd.dll передавать(!) значения хэндлов, как дополнительный параметр всех текстбоксов твоей проги, а не заставлять hookd помимо самого перехвата еще и выполнять их поиск в чередовании родитель-потомок по GetNextWindow.
Как детально это сделать попроси подсказки у jangle, как более продвинутого в PB и автора hookd.dll. Ему это, как говорится – одной левой... :)

maxboot
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 27.02.2008 (Ср) 13:19

Сообщение maxboot » 30.03.2008 (Вс) 14:55

Спасибо за ответы господа!

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

Удалось решить проблему путем жесткого присваивания координат в функции MyTextOut

FUNCTION MyTextOut (BYVAL hdc AS LONG, BYVAL x AS LONG, BYVAL y AS LONG, BYVAL lpString AS DWORD, BYVAL nCount AS LONG) AS LONG

LOCAL MyString AS STRING
LOCAL i AS LONG
STATIC GetStr AS STRING
STATIC GetStr1 AS STRING
STATIC GetStr2 AS STRING
STATIC GetStr3 AS STRING
STATIC GetStr4 AS STRING
STATIC GetStr5 AS STRING
STATIC GetStr6 AS STRING
STATIC GW_HWNDNEXT AS STRING



IF lpString THEN MyString = PEEK$(lpString, nCount)
SetHookProc 2


MyString=SPACE$(nCount*2)
MyString= PEEK$(lpString, nCount*2)
MyString=ACODE$(MyString)
IF (x=679 AND y=363) OR (x=686 AND y=363) OR (x=679 AND y=380) OR (x=686 AND y=380) OR (x=679 AND y=397) OR (x=686 AND y=397) OR (x=679 AND y=414) OR (x=686 AND y=414) OR (x=679 AND y=431) OR (x=686 AND y=431) OR (x=679 AND y=448) OR (x=686 AND y=448) THEN

Получается тормоза были не за счет
MyString=SPACE$(nCount*2)
MyString= PEEK$(lpString, nCount*2)
MyString=ACODE$(MyString)

А за счет постоянного поиска хэндлов при перерисовке.

Вот здесь
LOCAL hProcess AS LONG
hProcess = FindWindow("TPanelWindow class", BYCOPY "#3 All")


P.S. а перебор текстовых полей вроде тормоза совсем не вызывает, а если не делать перебор, то я не смогу найти в моей проге все текстовые поля, так как хэндл у них всех один и тот же - ThunderRT6TextBox, хотя по большому счету действительно можно передать все значения одному полю, с каким-то разделителем, а потом с помощью Split разделить на значения и передать всем другим текстовым полям.
Перебор идет так:
hProcess = FindWindow("ThunderRT6FormDC", "MY HOOK")
hProcess = FindWindowEx(hProcess,0,"ThunderRT6Frame", "Рассчетная температура °С")
hProcess = FindWindowEx(hProcess,0,"ThunderRT6TextBox", "")
hProcess = GetNextWindow(hProcess, 2)
IF Getstr1<>"" THEN
SendMessage hProcess, %WM_SETTEXT, 0, STRPTR(GetStr1)
END IF
hProcess = GetNextWindow(hProcess, 2)
IF Getstr2<>"" THEN
SendMessage hProcess, %WM_SETTEXT, 0, STRPTR(GetStr2)
END IF
hProcess = GetNextWindow(hProcess, 2)
IF Getstr3<>"" THEN
SendMessage hProcess, %WM_SETTEXT, 0, STRPTR(GetStr3)
END IF
hProcess = GetNextWindow(hProcess, 2)
IF Getstr4<>"" THEN
SendMessage hProcess, %WM_SETTEXT, 0, STRPTR(GetStr4)
END IF
hProcess = GetNextWindow(hProcess, 2)
IF Getstr5<>"" THEN
SendMessage hProcess, %WM_SETTEXT, 0, STRPTR(GetStr5)
END IF
hProcess = GetNextWindow(hProcess, 2)
IF Getstr6<>"" THEN
SendMessage hProcess, %WM_SETTEXT, 0, STRPTR(GetStr6)
END IF

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Сообщение awl100Alex » 01.04.2008 (Вт) 17:36

maxboot
"ThunderRT6TextBox" - это не хэндл, а имя класса текстбокса! Имена классов могут повторятся, но хэндлы уникальны для каждого объекта. :wink:

Ну, да ладно... Решил проблему и хорошо. Удачи! :lol:

maxboot
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 27.02.2008 (Ср) 13:19

Сообщение maxboot » 04.04.2008 (Пт) 14:50

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

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Сообщение awl100Alex » 05.04.2008 (Сб) 18:26

Правильно понимаешь... :wink:
Поэтому тебе нужно будет снова получать хэндлы свох текстбоксов...

hTexBox1 = Text1.hWnd
hTexBox2 = Text2.hWnd
hTexBox3 = Text3.hWnd
....
....
hTexBox23 = Text23.hWnd
hTexBox24 = Text24.hWnd


...и снова передавать их в библиотеку хука.
Все не так уж и сложно. :lol:

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.05.2008 (Чт) 7:16

остальные варианты мне кажутся более сложными

Ну да, вариант с распознаванием текста, конечно, очень легкий. :?
Не думаю, что такой метод когда-либо найдет себе применение.
А я все практикую лечение травами...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.05.2008 (Чт) 8:25

Но и не сильно сложный. Там OCR не нужно, шрифты ведь экранные. Сложности будут только с цветным фоном и с антиальясингом (ClearType).
Lasciate ogni speranza, voi ch'entrate.

kosmos
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 19.06.2013 (Ср) 17:28

Re: Как получить содержимое Label из другого приложения

Сообщение kosmos » 20.06.2013 (Чт) 20:19

Если кто есть ещё живой из этой темы отзовитесь.
В программирование почти не шарю.
Я вместо TextOut переписал кое как на GdipDrawString.
Всё работает но есть нюансы. Чужое приложение на которое ставим hook периодически перезапускает окно так задумано создателем.
Так вот после перезапуска чужого окна наша программа перестаёт считывать данные хотя и класс окна и заголовок тот же самый.
WM_PAINT не помогает перерисовка не происходит.
Если перед перезапуском чужого окна перезапустить нашу программу то всё работает.

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

Здесь писали что можно как то через таймер сделать
Или может быть периодически снимать и ставить hook
Проблема в том что плохо разбираюсь в программировании и рад буду любым советам .

Skeefrus
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 03.09.2015 (Чт) 13:38

Re: Как получить содержимое Label из другого приложения

Сообщение Skeefrus » 03.09.2015 (Чт) 15:46

Господа, подскажите, пожалуйста, есть ли возможность запустить решение, предложенное jangle на Windows 7? Может, какие библиотеки изменились? У меня запускается только на ХР, что крайне неудобно. Заранее спасибо!

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 10

    TopList