1 (изменено: vkvolk, 2015-01-14 00:22:42)

Тема: AHK: Получение текста из GUI

Как можно получить текстовые данные из GUI сторонней программы, если у окна, судя по выдаче Window Spy, отсутствуют ClassNN? В разделах Visible Window Text и Hidden Window Text тоже пусто. В качестве примера такой программы можно представить Firefox. У него так же не отображаются ClassNN, Visible Window Text и Hidden Window Text всегда пусты.

2

Re: AHK: Получение текста из GUI

В качестве примера

Шпиёны по всюду, берегитесь. Они вам никогда не расскажут, что к чему.
Ну а если уже и скажут, то поклонитесь им, прежде чем ответить.

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

3 (изменено: ypppu, 2015-01-14 00:29:47)

Re: AHK: Получение текста из GUI

Надо набрать в поиске "accessible firefox" и ждать ответа serzh82saratov, teadrinker, Malcev, многобанофф.

Добавлено: меня опередили.

4 (изменено: serzh82saratov, 2015-01-14 00:31:05)

Re: AHK: Получение текста из GUI

Я уже ответил.
Добавлено:
И меня тоже опередили.

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

5

Re: AHK: Получение текста из GUI

serzh82saratov, просто Firefox есть явно у большего кол-ва людей, чем нужная программа, к тому же там нужна регистрация для возможности парсинга необходимых данных. Не хочется Вас напрягать это делать.

ypppu, что-то ничего внятного не нашел, к тому же Firefox лишь в качестве примера "проблемной" программы. Решение конкретно для Firefox не подойдет. Нужно какое-то универсальное средство.

6

Re: AHK: Получение текста из GUI

просто Firefox есть явно у большего кол-ва людей

Ах вот у кого можно узнать статистику пользования браузеров людей пребывающих в треззвом уме. Не понятно, что у таких профи, и вопросы даже есть о чём либо?
Не хочется грубить, я пас.

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

7

Re: AHK: Получение текста из GUI

serzh82saratov, не вижу здесь причин для раздражения. Если ТС хочет для примера получить данные из FF, то что здесь плохого?

vkvolk, для исследования окон на предмет доступности через интерфейс IAccessible есть такой инструмент. Если он что-то определяет в полях, которые вас интересуют, значит, можно получить информацию.

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

8

Re: AHK: Получение текста из GUI

teadrinker пишет:

не вижу здесь причин для раздражения. Если ТС хочет для примера получить данные из FF, то что здесь плохого?

Ничего, ничего. Просто не ясно откуда взялось убеждение, что большинство влюбленны в FF.

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

9

Re: AHK: Получение текста из GUI

serzh82saratov пишет:

Просто не ясно откуда взялось убеждение, что большинство влюбленны в FF.

Не нашёл в текстах ТС ничего такого.

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

10 (изменено: vkvolk, 2015-01-14 02:19:01)

Re: AHK: Получение текста из GUI

teadrinker, Accessible Info Viewer тоже ничего не видит.

11

Re: AHK: Получение текста из GUI

Ну вот поэтому не имело смысла в качестве примера брать FF, там всё определяется. Тогда никак.

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

12 (изменено: vkvolk, 2015-01-14 04:05:24)

Re: AHK: Получение текста из GUI

Хотел брать нужные данные из памяти процесса, но адрес постоянно разный.

13

Re: AHK: Получение текста из GUI

vkvolk пишет:

Хотел брать нужные данные из памяти процесса, но адрес постоянно разный.

Но ведь как-то вы их находите? Может, есть какой-то признак, что вот тут эти данные. Тогда можно его искать в памяти.

14

Re: AHK: Получение текста из GUI

YMP, нет. Нужные данные - число. Вот я это число стал искать через ArtMoney, потом посмотрел в какой ячейке из большого кол-ва найденных оно изменится на новое значение в программе. Вот только после перезапуска программы адрес ячейки уже другой.

15

Re: AHK: Получение текста из GUI

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

16 (изменено: vkvolk, 2015-01-15 03:13:15)

Re: AHK: Получение текста из GUI

Irbis пишет:

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

По указателю получает значение даже после перезагрузки программы, да. Но все равно много условий - работает только если сначала запустить именно тот аккаунт, на цифровое значение которого искался указатель, только в определенном состоянии программы и само собой ни на какой другой ОС не работает, хоть даже с той же битностью, что и изначальная, где искался указатель.

17

Re: AHK: Получение текста из GUI

vkvolk пишет:

YMP, нет. Нужные данные - число.

А тема называется "Получение текста"?

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

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

18 (изменено: vkvolk, 2015-01-22 01:33:34)

Re: AHK: Получение текста из GUI

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

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

19

Re: AHK: Получение текста из GUI

А как вы пытаетесь его получить? Надо открывать процесс на чтение и читать API-функцией ReadProcessMemory. Вы так делаете?

20

Re: AHK: Получение текста из GUI

YMP пишет:

А как вы пытаетесь его получить? Надо открывать процесс на чтение и читать API-функцией ReadProcessMemory. Вы так делаете?

ReadAdress подаю "0x001D1F60". Возвращает "Ошибка #2".

GetAdressValue(PID, ReadAddress) {
    ReadSize = 4
    VarSetCapacity(Buf, ReadSize, 0)

    PROCESS_VM_READ = 0x10

    hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_READ
                                     , Int, False
                                     , UInt, PID)
                                     
    If(!hProcess) {
        Return "Ошибка #1"
    }

    Ret := DllCall("ReadProcessMemory", UInt, hProcess
                                      , UInt, ReadAddress
                                      , UInt, &Buf
                                      , UInt, ReadSize
                                      , UInt, 0)

    DllCall("CloseHandle", UInt, hProcess)

    If(!Ret) {
        Return "Ошибка #2"
    }

    Result := NumGet(Buf, 0, "UInt")
    
    Return Result
}

21

Re: AHK: Получение текста из GUI

Ну, надо хотя бы посмотреть переменную A_LastError, чтобы понять, что за ошибка. Но только сразу после вызова ReadProcessMemory.

Не знаю, что такое адрес в модуле. Возможно, смещение от адреса самого модуля, т.е. надо адрес модуля ещё знать, чтобы вычислить адрес числа. Адрес самого модуля известен?

22 (изменено: Alectric, 2015-01-22 18:37:08)

Re: AHK: Получение текста из GUI

Судя по справке АМ, нужно к указателю прибавлять смещение.

pointer:=GetAdressValue(pid,0x01301f60)

value:=GetAdressValue(pid,pointer+1234) ; прибавлено смещение 1234

msgbox,% value

Или я ошибаюсь?

Вырезка из справки АМ:

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

23

Re: AHK: Получение текста из GUI

YMP пишет:

Ну, надо хотя бы посмотреть переменную A_LastError, чтобы понять, что за ошибка. Но только сразу после вызова ReadProcessMemory.

Не знаю, что такое адрес в модуле. Возможно, смещение от адреса самого модуля, т.е. надо адрес модуля ещё знать, чтобы вычислить адрес числа. Адрес самого модуля известен?

A_LastError выдает "299". Скорее всего именно так. Модулем является непосредственно процесс программы. Вот только как получить этот адрес модуля, а тем более на AHK...

Alectric пишет:

Судя по справке АМ, нужно к указателю прибавлять смещение.

pointer:=GetAdressValue(pid,0x01301f60)

value:=GetAdressValue(pid,pointer+1234) ; прибавлено смещение 1234

msgbox,% value

Или я ошибаюсь?

Вырезка из справки АМ:

Смещение указано только у указателя, а его адрес меняется, так что он не подходит.

24 (изменено: Alectric, 2015-01-22 19:20:08)

Re: AHK: Получение текста из GUI

Не так выразился... К адресу, который содержится по адресу указателя, прибавить смещение. Как на картинке выше...

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

25

Re: AHK: Получение текста из GUI

Да, модуль здесь может означать загруженный в память экзешник. Тогда узнать адрес его загрузки можно приведённой ниже функцией PsGetModuleBase. Но если процесс 64-битный, то скрипт нужно запускать 64-битным АНК. Я там также поправил функцию чтения памяти (типы параметров и возвращаемых значений), чтобы работала с 64-битным процессом. Попробуйте, прочитает ли что-то этот пример. Укажите имя процесса или его PID, а в качестве имени модуля — имя процесса.


SetFormat, Integer, H
process_name = Explorer.exe
module_name = Explorer.exe
offset = 0x1D1F60

module_addr := PsGetModuleBase( process_name, module_name )

If( module_addr = 0 ) {
    MsgBox, Ошибка
    Return
}
MsgBox, % module_addr

number := GetAddressValue( process_name, module_addr + offset )
MsgBox, %number%

;================================ Функции ==================================

GetAddressValue(PID_or_Name, ReadAddress) {
    Process, Exist, %PID_or_Name%
    If( ErrorLevel = 0 ) {
        Return "Ошибка #0"
    }
    PID := ErrorLevel
    ReadSize = 4
    VarSetCapacity(Buf, ReadSize, 0)

    PROCESS_VM_READ = 0x10

    hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_READ
                                     , Int, False
                                     , UInt, PID, "Ptr")                                     
    If(!hProcess) {
        Return "Ошибка #1"
    }
    Ret := DllCall("ReadProcessMemory", Ptr, hProcess
                                      , Ptr, ReadAddress
                                      , Ptr, &Buf
                                      , Ptr, ReadSize
                                      , Ptr, 0)
    DllCall("CloseHandle", Ptr, hProcess)

    If(!Ret) {
        Return "Ошибка #2"
    }

    Result := NumGet(Buf, 0, "UInt")
    
    Return Result
}


PsGetModuleBase(Process, DllName)    ; Process = PID or Name.
{
    static StructSize, AddrOffset, NameOffset, MODULEENTRY32
    static FLAGS := 0x18        ; TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32
    static INVALID_HANDLE_VALUE := -1
    If (!StructSize) {
        If (A_PtrSize = 8)
            StructSize := 1080, AddrOffset := 24, NameOffset := 48
        Else
            StructSize := 1064, AddrOffset := 20, NameOffset := 32
        VarSetCapacity(MODULEENTRY32, StructSize, 0)
        NumPut(StructSize, MODULEENTRY32, 0, "uint")
    }
    Process, Exist, %Process%
    If (ErrorLevel = 0)
        Return 0

    snapMod := DllCall("CreateToolhelp32Snapshot", "uint", FLAGS
                                                 , "uint", ErrorLevel
                                                 , "ptr")
    If (snapMod = INVALID_HANDLE_VALUE) {
        Return 0
    }

    If DllCall("Module32FirstW", "ptr", snapMod, "ptr", &MODULEENTRY32)
    {
        pszModule := &MODULEENTRY32 + NameOffset
        If DllCall("lstrcmpiW", "wstr", DllName, "ptr", pszModule) = 0
        {
            DllCall("CloseHandle", "ptr", snapMod)
            Return NumGet(MODULEENTRY32, AddrOffset, "ptr")
        }

        While DllCall("Module32NextW", "ptr", snapMod, "ptr", &MODULEENTRY32)
        {
            If DllCall("lstrcmpiW", "wstr", DllName, "ptr", pszModule) = 0
            {
                DllCall("CloseHandle", "ptr", snapMod)
                Return NumGet(MODULEENTRY32, AddrOffset, "ptr")
            }
        }
    }
    DllCall("CloseHandle", "ptr", snapMod)
    Return 0
}

26 (изменено: ypppu, 2015-01-23 00:27:51)

Re: AHK: Получение текста из GUI

Спасибо, работает. Но только на AHK выше v1.1

vkvolk, не нужно цитировать сообщение целиком, тем более такое объёмное.

27

Re: AHK: Получение текста из GUI

А зачем вам старый АНК? Там уже много чего нет. Здесь, наверно, он не знает тип "Ptr". Если так, то это можно обойти.

28

Re: AHK: Получение текста из GUI

YMP пишет:

А зачем вам старый АНК? Там уже много чего нет. Здесь, наверно, он не знает тип "Ptr". Если так, то это можно обойти.

На своей основной ОС я использую новый, у меня все и работало. А стал тестить на виртуальной машине, скачал версию с главной autohotkey.com и вылетало на коде:

    snapMod := DllCall("CreateToolhelp32Snapshot", "uint", FLAGS
                                                 , "uint", ErrorLevel
                                                 , "ptr")

Потом уж понял, что возможно дело в версии AHK. И действительно. Но переделывать не к чему, так как теперь использование уже из exe-файла идёт, только с тестом проблемы вот возникли.