<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Получение текста из GUI]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10332&amp;type=atom" />
	<updated>2015-01-24T19:09:22Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=10332</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Получение текста из GUI]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=90941#p90941" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>А зачем вам старый АНК? Там уже много чего нет. Здесь, наверно, он не знает тип &quot;Ptr&quot;. Если так, то это можно обойти.</p></blockquote></div><p>На своей основной ОС я использую новый, у меня все и работало. А стал тестить на виртуальной машине, скачал версию с главной autohotkey.com и вылетало на коде:<br /></p><div class="codebox"><pre><code>    snapMod := DllCall(&quot;CreateToolhelp32Snapshot&quot;, &quot;uint&quot;, FLAGS
                                                 , &quot;uint&quot;, ErrorLevel
                                                 , &quot;ptr&quot;)</code></pre></div><p>Потом уж понял, что возможно дело в версии AHK. И действительно. Но переделывать не к чему, так как теперь использование уже из exe-файла идёт, только с тестом проблемы вот возникли.</p>]]></content>
			<author>
				<name><![CDATA[vkvolk]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32817</uri>
			</author>
			<updated>2015-01-24T19:09:22Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=90941#p90941</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Получение текста из GUI]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=90886#p90886" />
			<content type="html"><![CDATA[<p>А зачем вам старый АНК? Там уже много чего нет. Здесь, наверно, он не знает тип &quot;Ptr&quot;. Если так, то это можно обойти.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2015-01-23T02:52:22Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=90886#p90886</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Получение текста из GUI]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=90879#p90879" />
			<content type="html"><![CDATA[<p>Спасибо, работает. Но только на AHK выше v1.1</p><p><span style="color: green"><strong>vkvolk</strong>, не нужно цитировать сообщение целиком, тем более такое объёмное.</span></p>]]></content>
			<author>
				<name><![CDATA[vkvolk]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32817</uri>
			</author>
			<updated>2015-01-22T18:53:24Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=90879#p90879</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Получение текста из GUI]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=90877#p90877" />
			<content type="html"><![CDATA[<p>Да, модуль здесь может означать загруженный в память экзешник. Тогда узнать адрес его загрузки можно приведённой ниже функцией PsGetModuleBase. Но если процесс 64-битный, то скрипт нужно запускать 64-битным АНК. Я там также поправил функцию чтения памяти (типы параметров и возвращаемых значений), чтобы работала с 64-битным процессом. Попробуйте, прочитает ли что-то этот пример. Укажите имя процесса или его PID, а в качестве имени модуля — имя процесса.<br /></p><div class="codebox"><pre><code>
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 &quot;Ошибка #0&quot;
    }
    PID := ErrorLevel
    ReadSize = 4
    VarSetCapacity(Buf, ReadSize, 0)

    PROCESS_VM_READ = 0x10

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

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

    Result := NumGet(Buf, 0, &quot;UInt&quot;)
    
    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, &quot;uint&quot;)
    }
    Process, Exist, %Process%
    If (ErrorLevel = 0)
        Return 0

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

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

        While DllCall(&quot;Module32NextW&quot;, &quot;ptr&quot;, snapMod, &quot;ptr&quot;, &amp;MODULEENTRY32)
        {
            If DllCall(&quot;lstrcmpiW&quot;, &quot;wstr&quot;, DllName, &quot;ptr&quot;, pszModule) = 0
            {
                DllCall(&quot;CloseHandle&quot;, &quot;ptr&quot;, snapMod)
                Return NumGet(MODULEENTRY32, AddrOffset, &quot;ptr&quot;)
            }
        }
    }
    DllCall(&quot;CloseHandle&quot;, &quot;ptr&quot;, snapMod)
    Return 0
}
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2015-01-22T15:49:24Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=90877#p90877</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Получение текста из GUI]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=90876#p90876" />
			<content type="html"><![CDATA[<p>Не так выразился... К адресу, который содержится по адресу указателя, прибавить смещение. Как на картинке выше...</p>]]></content>
			<author>
				<name><![CDATA[Alectric]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26027</uri>
			</author>
			<updated>2015-01-22T15:15:50Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=90876#p90876</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Получение текста из GUI]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=90874#p90874" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>Ну, надо хотя бы посмотреть переменную A_LastError, чтобы понять, что за ошибка. Но только сразу после вызова ReadProcessMemory.</p><p>Не знаю, что такое адрес в модуле. Возможно, смещение от адреса самого модуля, т.е. надо адрес модуля ещё знать, чтобы вычислить адрес числа. Адрес самого модуля известен?</p></blockquote></div><p>A_LastError выдает &quot;299&quot;. Скорее всего именно так. Модулем является непосредственно процесс программы. Вот только как получить этот адрес модуля, а тем более на AHK...</p><div class="quotebox"><cite>Alectric пишет:</cite><blockquote><p>Судя по справке АМ, нужно к указателю прибавлять смещение.<br /></p><div class="codebox"><pre><code>pointer:=GetAdressValue(pid,0x01301f60)

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

msgbox,% value
</code></pre></div><p>Или я ошибаюсь?</p><p>Вырезка из справки АМ:</p></blockquote></div><p>Смещение указано только у указателя, а его адрес меняется, так что он не подходит.</p>]]></content>
			<author>
				<name><![CDATA[vkvolk]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32817</uri>
			</author>
			<updated>2015-01-22T14:51:46Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=90874#p90874</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Получение текста из GUI]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=90873#p90873" />
			<content type="html"><![CDATA[<p>Судя по справке АМ, нужно к указателю прибавлять смещение.<br /></p><div class="codebox"><pre><code>pointer:=GetAdressValue(pid,0x01301f60)

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

msgbox,% value
</code></pre></div><p>Или я ошибаюсь?</p><p>Вырезка из справки АМ:</p>]]></content>
			<author>
				<name><![CDATA[Alectric]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26027</uri>
			</author>
			<updated>2015-01-22T14:34:12Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=90873#p90873</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Получение текста из GUI]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=90870#p90870" />
			<content type="html"><![CDATA[<p>Ну, надо хотя бы посмотреть переменную A_LastError, чтобы понять, что за ошибка. Но только сразу после вызова ReadProcessMemory.</p><p>Не знаю, что такое адрес в модуле. Возможно, смещение от адреса самого модуля, т.е. надо адрес модуля ещё знать, чтобы вычислить адрес числа. Адрес самого модуля известен?</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2015-01-22T14:09:19Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=90870#p90870</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Получение текста из GUI]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=90869#p90869" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>А как вы пытаетесь его получить? Надо открывать процесс на чтение и читать API-функцией ReadProcessMemory. Вы так делаете?</p></blockquote></div><p>ReadAdress подаю &quot;0x001D1F60&quot;. Возвращает &quot;Ошибка #2&quot;.</p><div class="codebox"><pre><code>GetAdressValue(PID, ReadAddress) {
    ReadSize = 4
    VarSetCapacity(Buf, ReadSize, 0)

    PROCESS_VM_READ = 0x10

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

    Ret := DllCall(&quot;ReadProcessMemory&quot;, UInt, hProcess
                                      , UInt, ReadAddress
                                      , UInt, &amp;Buf
                                      , UInt, ReadSize
                                      , UInt, 0)

    DllCall(&quot;CloseHandle&quot;, UInt, hProcess)

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

    Result := NumGet(Buf, 0, &quot;UInt&quot;)
    
    Return Result
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[vkvolk]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32817</uri>
			</author>
			<updated>2015-01-22T13:53:14Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=90869#p90869</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Получение текста из GUI]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=90864#p90864" />
			<content type="html"><![CDATA[<p>А как вы пытаетесь его получить? Надо открывать процесс на чтение и читать API-функцией ReadProcessMemory. Вы так делаете?</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2015-01-22T03:37:16Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=90864#p90864</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Получение текста из GUI]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=90858#p90858" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>Я делал подобное в одной игре, и тоже адрес был непостоянным. Но нашёлся ориентир, от которого эти данные всегда были на определённом расстоянии. Какая-то текстовая строка, всегда одна и та же, если я ничего не путаю.</p></blockquote></div><p>Я обратил внимание, что &quot;Адрес в модуле&quot; всегда один и тот же, в отличие от указателя. Но когда я пытаюсь получить значение по этому адресу из AHK, то он не находит этот адрес.</p>]]></content>
			<author>
				<name><![CDATA[vkvolk]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32817</uri>
			</author>
			<updated>2015-01-21T21:33:22Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=90858#p90858</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Получение текста из GUI]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=90537#p90537" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>vkvolk пишет:</cite><blockquote><p><strong>YMP</strong>, нет. Нужные данные - число.</p></blockquote></div><p>А тема называется &quot;Получение текста&quot;?</p><div class="quotebox"><blockquote><p>Вот я это число стал искать через ArtMoney, потом посмотрел в какой ячейке из большого кол-ва найденных оно изменится на новое значение в программе. Вот только после перезапуска программы адрес ячейки уже другой.</p></blockquote></div><p>Я делал подобное в одной игре, и тоже адрес был непостоянным. Но нашёлся ориентир, от которого эти данные всегда были на определённом расстоянии. Какая-то текстовая строка, всегда одна и та же, если я ничего не путаю.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2015-01-15T00:50:32Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=90537#p90537</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Получение текста из GUI]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=90534#p90534" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Irbis пишет:</cite><blockquote><p>В вышеупомянутой АМ описан способ, как искать значения, не имеющие фиксированного адреса в памяти.</p></blockquote></div><p>По указателю получает значение даже после перезагрузки программы, да. Но все равно много условий - работает только если сначала запустить именно тот аккаунт, на цифровое значение которого искался указатель, только в определенном состоянии программы и само собой ни на какой другой ОС не работает, хоть даже с той же битностью, что и изначальная, где искался указатель.</p>]]></content>
			<author>
				<name><![CDATA[vkvolk]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32817</uri>
			</author>
			<updated>2015-01-14T23:11:32Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=90534#p90534</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Получение текста из GUI]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=90518#p90518" />
			<content type="html"><![CDATA[<p>В вышеупомянутой АМ описан способ, как искать значения, не имеющие фиксированного адреса в памяти.</p>]]></content>
			<author>
				<name><![CDATA[Irbis]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27384</uri>
			</author>
			<updated>2015-01-14T17:24:54Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=90518#p90518</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Получение текста из GUI]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=90517#p90517" />
			<content type="html"><![CDATA[<p><strong>YMP</strong>, нет. Нужные данные - число. Вот я это число стал искать через ArtMoney, потом посмотрел в какой ячейке из большого кол-ва найденных оно изменится на новое значение в программе. Вот только после перезапуска программы адрес ячейки уже другой.</p>]]></content>
			<author>
				<name><![CDATA[vkvolk]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32817</uri>
			</author>
			<updated>2015-01-14T16:07:02Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=90517#p90517</id>
		</entry>
</feed>
