1

Тема: AHK: Как извлечь текст из контрола?

Не могу с помощью скрипта получить текст из контрола. 

   Окно - стол игры в покер. Контрол - окно чата, где показываются все разговоры и объявления.


Если кликнуть по нему, и нажать обычные Ctrl+а и  Ctrl+c - текст копируется также легко, как в "Блокноте".   Но скриптом никак текст извлечь не могу.



"Window Spy" текста в нём не видит.  ControlGetText ничего не даёт.

  Использовал все свои скромные знания и всю фантазию, но ничего из нижеперечисленного не дало результата


ControlSend, {CtrlDown}A{CtrlUp}, Internet Explorer_Server2, A
ControlSend, {CtrlDown}c{CtrlUp}, Internet Explorer_Server2, A
ToolTip, % clipboard


Click x,y
Send, {CtrlDown}{A}{CtrlUp}
Send, {CtrlDown}{C}{CtrlUp}
ToolTip, % clipboard


Click x,y
SendInput, {CtrlDown}{A}{CtrlUp}
SendInput, {CtrlDown}{C}{CtrlUp}
ToolTip, % clipboard

реальный клик мышкой по контролу и

SendInput, {CtrlDown}{A}{CtrlUp}
SendInput, {CtrlDown}{C}{CtrlUp}
ToolTip, % clipboard

ControlFocus, Internet Explorer_Server2, A
SendInput, {CtrlDown}{A}{CtrlUp}
SendInput, {CtrlDown}{C}{CtrlUp}
ToolTip, % clipboard


  Максимум эффекта - выделение  одной строчки в чате. Но в буфер она не попадает всё равно.








   Вся информация из "Window Spy", может что-то подскажет:

>>>>>>>>>>( Window Title & Class )<<<<<<<<<<<
Название окна(покерного стола)
ahk_class PTIODEVICE

>>>>>>>>>>>>( Mouse Position )<<<<<<<<<<<<<
On Screen: -, -  (less often used)
In Active Window: -, -

>>>>>>>>>( Now Under Mouse Cursor )<<<<<<<<
ClassNN: Internet Explorer_Server2
Text:
Color: --------------------------

>>>>>>>>>>( Active Window Position )<<<<<<<<<<

left: -     top: -     width: -     height: -

>>>>>>>>>>>( Status Bar Text )<<<<<<<<<<

>>>>>>>>>>>( Visible Window Text )<<<<<<<<<<<

>>>>>>>>>>>( Hidden Window Text )<<<<<<<<<<<

>>>>( TitleMatchMode=slow Visible Text )<<<<

>>>>( TitleMatchMode=slow Hidden Text )<<<<

   Помогите, пожалуйста извлечь текст средствами AHK.
   Заранее большое спасибо!

2 (изменено: serzh82saratov, 2013-02-20 18:33:47)

Re: AHK: Как извлечь текст из контрола?


clipboard := ""
 Loop
    {  ControlFocus, Internet Explorer_Server2, A
    Send, ^{vk41}  ;  "A"
    Send, ^{vk43}  ;  "C"
    } Until clipboard
 ToolTip, %clipboard%
 return

или надёжнее:


clipboard := ""
 Loop { 
    ControlFocus, Internet Explorer_Server2, ahk_class PTIODEVICE
     ControlGetFocus, Focus, ahk_class PTIODEVICE
    iF ( Focus <> "Internet Explorer_Server2" )
        Continue 
    Send, ^{vk41}  ;  "A"
    Send, ^{vk43}  ;  "C"
    } Until clipboard
 ToolTip, %clipboard%
 return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: Как извлечь текст из контрола?

serzh82saratov пишет:

или надёжнее:


clipboard := ""
 Loop { 
    ControlFocus, Internet Explorer_Server2, ahk_class PTIODEVICE
     ControlGetFocus, Focus, ahk_class PTIODEVICE
    iF ( Focus <> "Internet Explorer_Server2" )
        Continue 
    Send, ^{vk41}  ;  "A"
    Send, ^{vk43}  ;  "C"
    } Until clipboard
 ToolTip, %clipboard%
 return

  Не срабатывает если не кликнуть этот контрол.


Но Вы всё равно помогли!  Спасибо!


Вот так вполне себе работает:


ToolTip,
clipboard := ""
Click x, y
Send, ^{vk41}  ;  "A"
Send, ^{vk43}  ;  "C"
ClipWait, 1
;SoundBeep
ToolTip, %clipboard% 

   Осталось понять в чём же тут принципиальная разница между

Send, ^{vk41}

и

Send, {CtrlDown}{A}{CtrlUp}

  ?

4

Re: AHK: Как извлечь текст из контрола?

Осталось понять в чём же тут принципиальная разница между

В зависимости от раскладки. Никогда не пишите буквенно символьные клавиши по их именам. Замечал что само действие {CtrlDown} не всегда надёжно, видимо ос неуспевает решить что Ctrl удержан а уже послана след. кнопка, а ^{vk41} посылает сразу нажатие с модификатором.
Хотя Send, {CtrlDown}{vk41}{CtrlUp} вполне работает.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Как извлечь текст из контрола?

Вот лично вам скрипт для определения кнопок с готовым синтаксисом

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Как извлечь текст из контрола?

С кодами  я знаком.  Почему работает по разному не понимаю.

7

Re: AHK: Как извлечь текст из контрола?

Pokerist пишет:

Не могу с помощью скрипта получить текст из контрола.

Если это действительно контрол Internet Explorer_Server, то примерно так, только указать верное название контрола и окна.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Как извлечь текст из контрола?

teadrinker пишет:

Если это действительно контрол Internet Explorer_Server, то примерно так, только указать верное название контрола и окна.

  Раз "Window Spy" сказал, что это он, то так оно и есть!
  Огромное спасибо!  Сработало великолепно! Не нужны клики, не нужна даже видимость самого контрола! Всё великолепно читается без малейших сбоев.

9

Re: AHK: Как извлечь текст из контрола?

Pokerist пишет:
С кодами  я знаком.  Почему работает по разному не понимаю.

Вы про это:  ^ и {CtrlDown} , или про это {vk41} и {A}.

OFF:

teadrinker пишет:
Если это действительно контрол Internet Explorer_Server, то примерно так, только указать верное название контрола и окна.

Мда, с памятью у меня беда...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Как извлечь текст из контрола?

serzh82saratov пишет:

Осталось понять в чём же тут принципиальная разница между

В зависимости от раскладки. Никогда не пишите буквенно символьные клавиши по их именам. Замечал что само действие {CtrlDown} не всегда надёжно, видимо ос неуспевает решить что Ctrl удержан а уже послана след. кнопка, а ^{vk41} посылает сразу нажатие с модификатором.
Хотя Send, {CtrlDown}{vk41}{CtrlUp} вполне работает.

   Во втором случае OC "успевает решить, что Ctrl удержан",  а в  первом нет?  Странно как-то :-/

11

Re: AHK: Как извлечь текст из контрола?

Появился вопрос.  Иногда, при закрытии окна, работа скрипта срывается и появляется сообщение "No Valid COM Object!" с указанием на предпоследнюю строку:



ControlGet, OutputVar, Hwnd,, Internet Explorer_Server1, ahk_class IEFrame
if (OutputVar = "")
{
   ToolTip, Контрол не найден!
   return
}

msg := DllCall("RegisterWindowMessage", Str, "WM_HTML_GETOBJECT")
SendMessage, msg,,,, ahk_id %OutputVar%

DllCall("oleacc\ObjectFromLresult", Ptr, ErrorLevel, Ptr, 0, Ptr, 0, PtrP, pdoc)
        
HTMLDocument := ComObjEnwrap(pdoc)
ObjRelease(pdoc)

var := HTMLDocument.body.innerText
HTMLDocument := ""



   Можно как-то предусмотреть эти обстоятельства и предотвратить остановку работы скрипта?

12 (изменено: Александр_, 2013-03-24 02:11:50)

Re: AHK: Как извлечь текст из контрола?

Pokerist пишет:

Можно как-то предусмотреть эти обстоятельства и предотвратить остановку работы скрипта?

ну дык как всегда:

if(HTMLDocument&&HTMLDocument.body) 
{
    var := HTMLDocument.body.innerText
    HTMLDocument := ""
}
else
    msgbox error

13

Re: AHK: Как извлечь текст из контрола?

Всё равно сбоит. Предупреждение :

Отказано в доступе ..."файл скрипта"...
....
Specificaty: body

В строке
if(HTMLDocument&&HTMLDocument.body)

14

Re: AHK: Как извлечь текст из контрола?

Ничего с этим сделать нельзя?

15

Re: AHK: Как извлечь текст из контрола?

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

ControlGet, OutputVar, Hwnd,, Internet Explorer_Server1, ahk_class IEFrame
if (OutputVar = "")
{
   ToolTip, Контрол не найден!
   return
}

msg := DllCall("RegisterWindowMessage", Str, "WM_HTML_GETOBJECT")
SendMessage, msg,,,, ahk_id %OutputVar%

DllCall("oleacc\ObjectFromLresult", Ptr, ErrorLevel, Ptr, 0, Ptr, 0, PtrP, pdoc)
        
HTMLDocument := ComObjEnwrap(pdoc)
ObjRelease(pdoc)

if !IsObject(HTMLDocument)
   return

var := HTMLDocument.body.innerText
HTMLDocument := ""
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16 (изменено: Pokerist, 2013-07-24 20:04:45)

Re: AHK: Как извлечь текст из контрола?

Перенёс в отдельную тему.