1

Тема: AHK: PID

Добрый день уважаемые форумчане. Хочется привязать свой скрипт к PID процесса - такой метод сделан в Uo Pilot, где скрипт можно привязать к ID окна (процесса) и он будет выполняться именно в этом окне, и считывать адреса именно этого процесса. Прочитав мануал сделал вот так:

ProcessName = Name.exe

ReadSize = 4
VarSetCapacity(Buf, ReadSize, 0)
PROCESS_VM_READ = 0x10
Process, Exist, %ProcessName%
PID := %ProcessPID%
hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_READ
                                 , Int, False
                                 , UInt, PID)
Ret := DllCall("ReadProcessMemory", UInt, hProcess
                                  , UInt, base
                                  , UInt, &Buf
                                  , UInt, ReadSize
                                  , UInt, 0)
DllCall("CloseHandle", UInt, hProcess)
pointer := NumGet(Buf)

; в GUI редактируемое поле
Gui, Add, Text, x10 y114 w450 h40 cRed, PID?
Gui, Add, Edit, x222 y114 w40 h20 vProcessPID, 0

; цикл
ControlSend,, {F1}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep, 300
ControlSend,, {F1}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep, 300
ControlSend,, {F1}, ahk_pid %ProcessPID%
SetKeyDelay, 1
ControlSend,, {F1}, ahk_pid %ProcessPID%
SetKeyDelay, 1

к моему сожилению данный способ не работает. Попробывал убрать поле из GUI и прописать в теле цикла

ProcessName = Name.exe
ProcessPID = 4022

но так тоже не работает.

Может кто подскажет, что не так?

2

Re: AHK: PID

PID := %ProcessPID%

Не правильно так, ведь я уже писал Вам. Два варианта правильных.

PID = %ProcessPID%
PID := ProcessPID
kamaz пишет:

привязать к ID окна (процесса)

ID окна и ID процесса — это разные вещи. У процесса может быть несколько окон и у каждого окна свой ID.
А что конкретно у Вас не получается: не считывается число из процесса или окно не реагирует на посылку клавиш?

3

Re: AHK: PID

YMP пишет:

Не правильно так, ведь я уже писал Вам. Два варианта правильных.

Это проверю когда приду домой. К сожилению нет возможности на работе проверить.

YMP пишет:

ID окна и ID процесса — это разные вещи. У процесса может быть несколько окон и у каждого окна свой ID.
А что конкретно у Вас не получается: не считывается число из процесса или окно не реагирует на посылку клавиш?

Конкретно не верно адреса считываются в процессе. Клавиши вроде нажимались правильно.

4

Re: AHK: PID

Если с именем процесса работало, значит сейчас PID неверный. Ничего другого в голову не приходит.

5

Re: AHK: PID

YMP пишет:

Если с именем процесса работало, значит сейчас PID неверный. Ничего другого в голову не приходит.

Ну вот PID я смотрел через Диспетчер задач. Через час проверю предложеные Вами варианты синтаксиса. Если они не сработают, я не знаю как можно привести в работоспособность мой код.

6

Re: AHK: PID

YMP пишет:
PID = %ProcessPID%
PID := ProcessPID

Оба предложенных варианта работают. Осталось теперь придумать как сделать чтобы это значение бралось из GUI и будет ли работать ahk_pid %ProcessPID%
Работоспособность предложенных вариантов проверялось на чтении адресов процесса, но не нажатии клавиш.

7

Re: AHK: PID

Не пойму, какой смысл в коде

Process, Exist, %ProcessName%
PID := ProcessPID

Переменная ProcessPID пуста. Чтобы получить PID процесса с именем %ProcessName% нужно

Process, Exist, %ProcessName%
PID := ErrorLevel

Читай документацию к команде Process.

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

8

Re: AHK: PID

teadrinker
ProcessID из GUI, видимо, берётся.

9

Re: AHK: PID

Тогда какой смысл в строчке

Process, Exist, %ProcessName%

?

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

10

Re: AHK: PID

Да никакого, наверно. Пример, похоже, просто иллюстрирует мысль и составлен из отрывков кода. Строчку забыли убрать.

11

Re: AHK: PID

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

12 (изменено: kamaz, 2011-12-23 22:40:08)

Re: AHK: PID


ProcessName = Name.exe
ProcessPID = 1234
ReadSize = 4
VarSetCapacity(Buf, ReadSize, 0)
PROCESS_VM_READ = 0x10
Process, Exist, %ProcessName%
PID := ProcessPID
hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_READ
                                 , Int, False
                                 , UInt, PID)
Ret := DllCall("ReadProcessMemory", UInt, hProcess
                                  , UInt, base
                                  , UInt, &Buf
                                  , UInt, ReadSize
                                  , UInt, 0)
DllCall("CloseHandle", UInt, hProcess)
pointer := NumGet(Buf)
 
; в GUI редактируемое поле
Gui, Add, Text, x10 y114 w450 h40 cRed, PID?
Gui, Add, Edit, x222 y114 w40 h20 vProcessPID, 0
 
; цикл
ControlSend,, {F1}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep, 300
ControlSend,, {F1}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep, 300
ControlSend,, {F1}, ahk_pid %ProcessPID%
SetKeyDelay, 1
ControlSend,, {F1}, ahk_pid %ProcessPID%
SetKeyDelay, 1

Получился работающий скрипт. Адреса считываются правильно, нажатия клавиш происходит в нужном окне. Только вот ни как не могу сделать метку в GUI, чтобы значение ProcessPID бралось оттуда. Это как то можно осуществить?

13 (изменено: creature.ws, 2011-12-24 00:55:05)

Re: AHK: PID

Трижды отвечали как получать данные из EDIT.
Стоит ли отвечать в 4-й раз?

14

Re: AHK: PID

kamaz
Создаёте Edit с меткой vProcessID. По команде Gui, Submit содержимое Edit'a окажется в переменной ProcessID. Вы ведь уже делали подобное. Или в чём именно проблема?

15 (изменено: kamaz, 2011-12-24 09:15:02)

Re: AHK: PID

YMP
Проблема в том, что у меня данный код не работает(( уже все перепробовал, не знаю просто в чем ошибка.

Gui, Submit, NoHide
{
ProcessPID := ProcessID
}
Gui, Add, Text, x50 y525 w450 h40 cRed, PID?
Gui, Add, Edit, x222 y525 w100 h20 vProcessID, 0

Соль еще в том, что ProcessPID = 1234 в коде находится перед созданием GUI. Пробовал переделать код - приводит к неработоспособности скрипта.

16

Re: AHK: PID

creature.ws пишет:

Трижды отвечали как получать данные из EDIT.
Стоит ли отвечать в 4-й раз?

Спасибо за ссылки. Буду разбираться

17 (изменено: kamaz, 2011-12-24 09:28:47)

Re: AHK: PID

Вроде бы решил проблему....
Перед запуском GUI присвоил переменной ProcessPID значение ErrorLevel

ProcessPID = ErrorLevel

А по кнопке Старт уже присвоение значения из GUI

Gui, Add, Text, x50 y523 w450 h40 cRed, PID?
Gui, Add, Edit, x222 y523 w100 h20 vProcessID, 0
ButtonStart!!!!:
Gui, Submit, NoHide
{
ProcessPID := ProcessID
}

Ну а после уже, чтение адреса:

ReadSize = 4
VarSetCapacity(Buf, ReadSize, 0)
PROCESS_VM_READ = 0x10
Process, Exist, %ProcessName%
PID := ProcessPID
hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_READ
                                 , Int, False
                                 , UInt, PID)
Ret := DllCall("ReadProcessMemory", UInt, hProcess
                                  , UInt, base
                                  , UInt, &Buf
                                  , UInt, ReadSize
                                  , UInt, 0)
DllCall("CloseHandle", UInt, hProcess)
pointer := NumGet(Buf)

18

Re: AHK: PID

kamaz пишет:

Соль еще в том, что ProcessPID = 1234 в коде находится перед созданием GUI.

Что это значит?

19

Re: AHK: PID

kamaz пишет:

Вроде бы решил проблему....
Перед запуском GUI присвоил переменной ProcessPID значение ErrorLevel

ProcessPID = ErrorLevel

Это Вы просто слово "ErrorLevel" туда занесли. Я же показывал правильные варианты присвоения значения одной переменной другой.

20 (изменено: kamaz, 2011-12-24 09:41:30)

Re: AHK: PID

YMP пишет:
kamaz пишет:

Вроде бы решил проблему....
Перед запуском GUI присвоил переменной ProcessPID значение ErrorLevel

ProcessPID = ErrorLevel

Это Вы просто слово "ErrorLevel" туда занесли. Я же показывал правильные варианты присвоения значения одной переменной другой.

ошибочка) Исправлю.
Сейчас по тестам все работает, запущено 2 скрипта - оба читают правильно адреса и нажимают нужные клавиши.


Всем спасибо за помощь.

21 (изменено: 4esa33, 2015-12-14 16:23:47)

Re: AHK: PID

Добрый день!
Помогите пожалуйста привязать данный скрипт к окну , даже когда он не активен необходимо чтоб алгоритм продолжался.

CoordMode, Mouse, Window
SetFormat, float, 0.1
SleepAndWaitKey(time)
{
KeyWait % A_ThisHotkey,% "D T" (time/1000)
if !ErrorLevel
	Exit
}

F9::
KeyWait % A_ThisHotkey
loop
{
	T := A_TickCount + 60 * 9 * 1000
	WinGetPos, , ,W,H,ahk_class SkyRo
	X_click := W//2,	Y_click := H//2,
	loop
	{
		ControlSend,, {F1},ahk_class SkyRo
		ControlClick, x%X_click% y%X_click%,ahk_class SkyRo
		SleepAndWaitKey(500)
		ControlSend,, {F2},ahk_class SkyRo
		SleepAndWaitKey(50)
		ControlClick, x%X_click% y%X_click%,ahk_class SkyRo
		SleepAndWaitKey(200)
		ControlSend,, {F3},ahk_class SkyRo
		SleepAndWaitKey(400)
	}	Until A_TickCount > T
	SleepAndWaitKey(3000)
	ControlSend,, {F8},ahk_class SkyRo
}

Мой скрипт позволяет только производить данные действия при активном окн

22

Re: AHK: PID

4esa33, http://forum.script-coding.com/rules.html#3.11.

4esa33 пишет:

при активном окн

Так не надо, если хотите получить ответ.

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