Что нового

WinGetText работает 1/2 секунды. Если ли способ ускорить?

Suppir

Продвинутый
Сообщения
967
Репутация
62
У меня на WinGetText() завязано несколько функций. Но сама операция WinGetText достаточно затратная по времени - 0,5 секунд. Кто-нибудь знает способ ускорить эту операцию? (получение видимого текста из активного окна). Может быть через dll. Спасибо.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Можно попробовать вместо WinGetText использовать ControlGetText
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
В некоторых случаях (когда нужна информация только из названия приложения) я использую WinGetTitle() - работает моментально. Но иногда нужна именно видимая информация внутри приложения.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
asdf8
ControlGetText почему-то дает только последнюю строку видимого текста (а строк много)
 

asdf8

Скриптер
Сообщения
564
Репутация
152
ControlGetText почему-то дает только последнюю строку видимого текста (а строк много)

А какой класс контрола?
Еще может быть текст расположен в разных контролах?
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
asdf8

возможно... попробую разобраться с этими классами. Правда, функция применяется в разных окнах приложения, там везде разные классы...
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Кто-нибудь знает, если ли в PureBasic аналог функции WinGetText() ?
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Кто-нибудь знает, если ли в PureBasic аналог функции WinGetText() ?

можно попробовать так:

Код:
Define EditStr$ = Space(255) 
hWin = FindWindow_(0, "Безымянный - Блокнот") 
Debug hWin 
hGadget = FindWindowEx_(hWin, 0, "Edit", 0) 
Debug hGadget 

SendMessage_(hGadget,#WM_GETTEXT,255,@EditStr$);//читаем строку 
Debug "EditStr="+EditStr$

только опять текст читается из контрола
 

Kalisnik

Эволюция
Сообщения
295
Репутация
63
На машине установлена Windows 7? Может быть причина в Aero? Правда я не знаю на сколько это справедливо к тексту, но вот функция PixelGetColor с включенным Aero работает очень медленно.

P.S. Хотя, на текст наверно Aero влиять все-таки не должен (только на графику).
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Kalisnik

у разных пользователей разный windows. На моем E5300 функция работает за 0,5 секунд. На Celeron 2600 функция работает более секунды :(
 

VladUs

Скриптер
Сообщения
621
Репутация
181
asdf8
А примерный код на Autoit c посылкой сообщения WM_GETTEXT
 

asdf8

Скриптер
Сообщения
564
Репутация
152
А примерный код на Autoit c посылкой сообщения WM_GETTEXT

Код:
#include <SendMessage.au3>
#include <WindowsConstants.au3>

$hWin = WinGetHandle("Безымянный - Блокнот") 
$hCtrl = ControlGetHandle($hWin, '', "[Class:Edit]") 
$iLength = _SendMessage($hWin, $WM_GETTEXTLENGTH)
$tBuffer = DllStructCreate("char Text[" & $iLength + 1 & "]") 
_SendMessage($hCtrl, $WM_GETTEXT , $iLength + 1 ,DllStructGetPtr($tBuffer))
$str = DllStructGetData($tBuffer ,1)


этот код будет делать ровно то-же самое, что и ControlGetText
 

VladUs

Скриптер
Сообщения
621
Репутация
181
этот код будет делать ровно то-же самое, что и ControlGetText
Только после запуска этого кода, Windows выдает ошибку: Ошибка приложения autot3.exe
Память не может бать "read".
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Вставлю свои 5 копеек:
Код:
Opt("WinWaitDelay", 0)
Run("notepad.exe H:\Test.txt") ;запускаем наш текстовый файл с помощью Блокнота
WinWait("[Class:Notepad]") ;ждем окно по имени класса
$hWND1 = WinGetHandle("[Class:Notepad]") ;берем хэндл основного нашего окна
$hWND2 = ControlGetHandle($hWND1, "", "[Class:Edit]") ;берем хэндл контрола Edit из родительского хэндла
$text = ControlGetText("", "", $hWND2) ; получаем текст контрола Edit через его  хэндл
;MsgBox(64, "text", $text)

Интересно. Вот просто интересно. Как скорость на этом примере?
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
0,4 секунды. Но у меня нужно считывать инфу не из блокнота, а программы со сложным GUI. Там сама команда WinGetText() работает 0,5 секунды на вполне современном компьютере, а на celeron 2600 - более секунды.

Если просто в Scite запускаю одну команду WinGetText(""), то на домашнем компе занимает 1/4 секунды.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Вот просто показалось, что работа с хэндлами сократит время.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Только после запуска этого кода, Windows выдает ошибку: Ошибка приложения autot3.exe

код писал без проверки

поправил:

Код:
#include <SendMessage.au3>
#include <WindowsConstants.au3>

Run('notepad.exe')

$hWin = WinWaitActive("[CLASS:Notepad]")
$hCtrl = ControlGetHandle($hWin, '', "[CLASS:Edit]")

Send('123' & @LF & 'qwerty' & @LF & 'йцукен')
Sleep(200)

$iLength = _SendMessage($hCtrl, $WM_GETTEXTLENGTH)
$tBuffer = DllStructCreate("wchar Text[" & $iLength + 1 & "]") 
_SendMessage($hCtrl, $WM_GETTEXT , $iLength + 1 ,DllStructGetPtr($tBuffer))
$str = DllStructGetData($tBuffer ,1)

ConsoleWrite($str & @CRLF)
 
Верх