1 (изменено: Dworkin, 2016-05-27 18:26:15)

Тема: AHK: закрытые скрипта из другого по pid

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

Вот код в первом скрипте:


Run,  slave script.ahk,,,proces_id

F2::PostMessage("Slave script", 1)	; exits slave script

PostMessage(Receiver, Message) {
	PostMessage, 0x1001,%Message%,,, %Receiver% ahk_pid proces_id
}

Вот код во втором скрипте:



OnMessage(0x1001,"ReceiveMessage")

F3::
;выполняется что-то
return

ReceiveMessage(Message) {
	if Message = 1
    msgbox, Скрипт закрыт
	ExitApp
}

2

Re: AHK: закрытые скрипта из другого по pid

Dworkin пишет:

Я нашел как, но там все через окна, а через пид не получается.

А кому вы сообщение PostMessage посылаете?

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

3

Re: AHK: закрытые скрипта из другого по pid

teadrinker пишет:

А кому вы сообщение PostMessage посылаете?

Во второй скрипт.

Вот функция, которая была:

PostMessage(Receiver, Message) {
	oldTMM := A_TitleMatchMode, oldDHW := A_DetectHiddenWindows
	SetTitleMatchMode, 3
	DetectHiddenWindows, on
	PostMessage, 0x1001,%Message%,,, %Receiver% ahk_class AutoHotkeyGUI
	SetTitleMatchMode, %oldTMM%
	DetectHiddenWindows, %oldDHW%
}

Я ее изменил что бы посылало во второй скрипт по пиду:

PostMessage(Receiver, Message) {
	PostMessage, 0x1001,%Message%,,, %Receiver% ahk_pid proces_id
}

4

Re: AHK: закрытые скрипта из другого по pid

Dworkin пишет:

Во второй скрипт.

Сообщение нельзя послать «в скрипт». Его можно послать только окну. У всех скриптов есть скрытое окно, которому в данном случае сообщение и посылается. А что нужно сделать, чтобы команда воспринимала скрытые окна?

Dworkin пишет:

Я ее изменил что бы посылало во второй скрипт по пиду

proces_id — это строка, или переменная?

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

5 (изменено: Dworkin, 2016-05-27 20:22:40)

Re: AHK: закрытые скрипта из другого по pid

proces_id - это переменная.

Сделал переменную proces_id глобальной что бы ее функция прочитала и добавил в функцию DetectHiddenWindows, on.

Вот первый скрипт который запускает второй и посылает его скрытому окну:

Run,  slave script.ahk,,,proces_id

global proces_id ;объявляю глобальную переменную что бы использовать ее в функции

F2::PostMessage("Slave script", 1)	; exits slave script

PostMessage(Receiver, Message) {
    DetectHiddenWindows, on ; что бы воспринимать скрытые окна
	PostMessage, 0x1001,%Message%,,, %Receiver% ahk_pid proces_id
}

Код второго скрипта:

OnMessage(0x1001,"ReceiveMessage")

F3::
;выполняется что-то
return

ReceiveMessage(Message) {
	if Message = 1
    msgbox, Скрипт закрыт
	ExitApp
}

Все равно не получается.

Кстати вот ссылка, которую нашел на этом форуме:
http://forum.script-coding.com/viewtopic.php?id=125

6

Re: AHK: закрытые скрипта из другого по pid

Dworkin пишет:

proces_id - это переменная

А Receiver — это строка, или переменная?

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

7 (изменено: Dworkin, 2016-05-27 20:27:39)

Re: AHK: закрытые скрипта из другого по pid

teadrinker пишет:

А Receiver — это строка, или переменная?

Receiver - это тоже переменная. Указывается какое окно(скрипт) должен(но) получить сообщение.
Message - тоже переменная. Это то что получит второй скрипт. Для удобства посылаем 1 во второй скрипт. И когда второй скрипт получить 1, то выполнит подпрограмму, то есть закрытие.

8

Re: AHK: закрытые скрипта из другого по pid

Ну, если Receiver — переменная, и proces_id — тоже переменная, то почему у вас они в одном и том же параметре по-разному оформлены?

Dworkin пишет:
%Receiver% ahk_pid proces_id
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: закрытые скрипта из другого по pid

teadrinker пишет:

Ну, если Receiver — переменная, и proces_id — тоже переменная, то почему у вас они в одном и том же параметре по-разному оформлены?

Подправил функцию:

PostMessage(Receiver, Message) {
    DetectHiddenWindows, on ; что бы воспринимать скрытые окна
	PostMessage, 0x1001,%Message%,,, %Receiver% ahk_pid %proces_id%
}

Не работает.

10

Re: AHK: закрытые скрипта из другого по pid

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

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

11

Re: AHK: закрытые скрипта из другого по pid

teadrinker пишет:

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

Приведу код оригинала рабочий.
Первый скрипт master:

F1::PostMessage("Slave script", 1)	; exits slave script

PostMessage(Receiver, Message) {
	oldTMM := A_TitleMatchMode, oldDHW := A_DetectHiddenWindows
	SetTitleMatchMode, 3
	DetectHiddenWindows, on
	PostMessage, 0x1001,%Message%,,, %Receiver% ahk_class AutoHotkeyGUI
	SetTitleMatchMode, %oldTMM%
	DetectHiddenWindows, %oldDHW%
}

Второй скрипт который называется Slave script:

Progress, m2 b fs13 zh0 WMn700, Slave script is running
Gui 99: show, hide, Slave script ; hidden "message receiver window"
OnMessage(0x1001,"ReceiveMessage")
return

ReceiveMessage(Message) {
	if Message = 1
	ExitApp
}

Как видно из первого скрипта master переменная Receiver это название скрипта, который получит сообщение. Сами пишем название.
Насчет без процента я не знаю, оригинал привел и он работает. Как из этого сделать что бы функция отправляла по пиду, а не по классу?

12

Re: AHK: закрытые скрипта из другого по pid

А вы попробуйте открыть главное окно принимающего скрипта и посмотреть на его заголовок. Потом сравните с тем, что вы посылаете (ваша переменная Receiver).

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

13 (изменено: Dworkin, 2016-05-28 04:14:30)

Re: AHK: закрытые скрипта из другого по pid

teadrinker пишет:

А вы попробуйте открыть главное окно принимающего скрипта и посмотреть на его заголовок. Потом сравните с тем, что вы посылаете (ваша переменная Receiver).

Спасибо! Проблема оказалась в этом. Ну а так же не надо было удалят ничего оригинального кода функции. Вот что у меня вышло.
Первый скрипт master:

Run,  slave script.ahk,,,proces_id

global proces_id

F2::PostMessage("D:\Функции и библиотеки\второй скрипт получает от первого\Slave script.ahk - AutoHotkey v1.1.22.09", 1)	; exits slave script

PostMessage(Receiver, Message) {
	oldTMM := A_TitleMatchMode, oldDHW := A_DetectHiddenWindows
	SetTitleMatchMode, 3
	DetectHiddenWindows, on
	PostMessage, 0x1001,%Message%,,, %Receiver% ahk_pid %proces_id%
	SetTitleMatchMode, %oldTMM%
	DetectHiddenWindows, %oldDHW%
}

Второй скрипт slave script:

OnMessage(0x1001,"ReceiveMessage")
return

ReceiveMessage(Message) {
	if Message = 1
       msgbox, off
	ExitApp
}

14

Re: AHK: закрытые скрипта из другого по pid

Ну, я б не так сделал:
Вместо

F2::PostMessage("D:\Функции и библиотеки\второй скрипт получает от первого\Slave script.ahk - AutoHotkey v1.1.22.09", 1)
...
SetTitleMatchMode, 3

лучше просто

PostMessage("Slave script.ahk", 1)
...
SetTitleMatchMode, 2

иначе вы будете привязаны к папке.
Читайте SetTitleMatchMode.

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

15 (изменено: Dworkin, 2016-05-28 04:37:26)

Re: AHK: закрытые скрипта из другого по pid

teadrinker пишет:

лучше просто

PostMessage("Slave script.ahk", 1)
...
SetTitleMatchMode, 2

Да, спасибо так намного удобнее