1 (изменено: mozers, 2016-12-12 14:17:52)

Тема: AHK: Найти окно по имени и послать Нажать

Народ, помогите пожалуйста!
Нужен готовый exe-шник выполняющий следующие действия (Windows 7 Pro русская):
1. Запустить c:\Windows\system32\SystemPropertiesPerformance.exe
2. Ждать открытия окна с классом "#32770" и текстом в заголовке "Параметры быстродействия"
3. Найти дочернее окно с классом "Button" и текстом в заголовке "Обеспечить наилучшее &быстродействие"
4. Послать найденному дочернему окну сообщение Нажать WND_CLICK
5. Найти дочернее окно с классом "Button" и текстом в заголовке "ОК"
6. Послать найденному дочернему окну сообщение Нажать WND_CLICK

Сделал на Sign 0f Misery версии 2.7. Все работает отлично, но Symantec ругается на exe-шник как на вирус. Добавить файл в исключения не могу (нет прав).
Пробовал сделать на более новой версии Sign 0f Misery 0.0.9 - нефига не работает - не ищет окна - хоть убейся.
К сожалению ни на AutoHotkey ни на AutoIt никогда ничего не писал. Разбираться тупо нет времени (а вопрос надо решить срочно).
Поэтому, кому не влом - помогите пожалуйста - буду очень благодарен. Почта - mozers(собака)майл.ру

2

Re: AHK: Найти окно по имени и послать Нажать

Вот скелет набросал. Может и этого будет достаточно.

;RUN, C:\WINDOWS\system32\rundll32.exe /d C:\WINDOWS\system32\shell32.dll`,Control_RunDLL SYSDM.CPL ;Для WinXP выводит окно "Свойства системы"
RUN, c:\Windows\system32\SystemPropertiesPerformance.exe  ;Для Win7
WinWait, Параметры быстродействия
ControlClick , Button3, Параметры быстродействия ; радио-точка "Обеспечить наилучшее &быстродействие"
Sleep, 250
ControlClick , Button5, Параметры быстродействия ; кнопка "OK"
Return

3

Re: AHK: Найти окно по имени и послать Нажать

ypppu
Откомпилил в AHK 1.1.24.03 командой

Ahk2Exe.exe /in SetBestPerformance.ahk /out SetBestPerformance.exe

Огромное СПАСИБО! Все работает отлично. Я - Ваш должник.

4

Re: AHK: Найти окно по имени и послать Нажать

Попробовал деактивировать эффекты через DllCall, не срабатывает.
Кто знает почему?

SPI_SETUIEFFECTS = 0x103F
SPIF_SENDWININICHANGE = 0x2
SPIF_UPDATEINIFILE = 0x1
DllCall("SystemParametersInfo", UInt, SPI_SETUIEFFECTS, UInt, 0, UInt, 0, UInt, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE)

5 (изменено: mozers, 2016-12-13 16:53:11)

Re: AHK: Найти окно по имени и послать Нажать

2Malcev
Действительно отрабатывают только отдельные установки, такие как SPI_SETFONTSMOOTHING. Общая установка SPI_SETUIEFFECTS не меняет ничего. Видимо - баг ms.
Кстати, как показывает вчерашний опыт, за отключение некоторых визуальных эффектов (того же сглаживания) пользователи могут запросто тебя убить, поскольку реальное быстродействие при этом увеличивается на 0,001%, а глаза начинают болеть и слезится на 90%.

6

Re: AHK: Найти окно по имени и послать Нажать

При всей своей элегантности (ну люблю я WinAPI) DllCall запросы, в данном случае, работают из рук вон плохо.
Поэтому, после длительных и безуспешных эксперементов, был написан такой тупой код:


RUN, c:\Windows\system32\SystemPropertiesPerformance.exe
WinWait, Параметры быстродействия
ControlClick , Button3, Параметры быстродействия ; радио-точка "Обеспечить наилучшее &быстродействие"
Sleep, 250
Send {Tab}
Send {Down}
Send {Down}
Send {Down}
Send {Down}
Send {Down}
Send {Down}
Send {Space}
Send {Down}
Send {Down}
Send {Down}
Send {Down}
Send {Down}
Send {Space}
ControlClick , Button5, Параметры быстродействия ; кнопка "OK"
Return

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

7

Re: AHK: Найти окно по имени и послать Нажать

Командой SetKeyDelay можно увеличить паузы между нажатиями и время нажатия посылаемых клавиш.

8

Re: AHK: Найти окно по имени и послать Нажать

Лучше так посылать:

RUN, c:\Windows\system32\SystemPropertiesPerformance.exe
WinWait, ahk_exe SystemPropertiesPerformance.exe
ControlClick, Button3,,,,, NA
ControlSend, SysTreeView321, {down 6}{Space}{down 5}{Space}
ControlClick, Button5,,,,, NA
Return

9

Re: AHK: Найти окно по имени и послать Нажать

Спасибо, мужики! Вроде так действительно стало понадежнее срабатывать. Да и сам АНК становится интереснее и интереснее (SetKeyDelay, неожиданные параметры для WinWait, да много еще чего тут подглядел...) Спасибо!

10

Re: AHK: Найти окно по имени и послать Нажать

А как возможно ревизовать следующую ситуацию:

Окно приложения имеет разные названия (в начало подставляется название открытого файла) только в конце присутствует само название программ.

Я создал GUI который отображается поверх открытых окон, в нем есть картинка при нажатии и удерживании на которую необходимо отправлять в данное окно залипание кнопки Down до отпускания мышки.

Пытаюсь использовать такой код, но он работает только если заголовок четко определяется, как быть в моем случае? Предлагается использовать WinTitle но как не понятно…


	GUIMouseShowButtonKEY:	
		{
			IfWinExist, IrfanView 64-bit
			WinActivate
			KeyWait LButton, L
			Send, {Down down}
			gosub GuiEscapeMouseShowButtonKEY
			exit
		}
	Return

	GUIEscapeMouseShowButtonKEY:
		{
			Send, {Down up}
			Sleep 128
			exit
		}
	Return

11 (изменено: grisha.puding, 2023-03-28 18:08:02)

Re: AHK: Найти окно по имени и послать Нажать

grisha.puding пишет:

А как возможно ревизовать следующую ситуацию:

Окно приложения имеет разные названия (в начало подставляется название открытого файла) только в конце присутствует само название программ.

Я создал GUI который отображается поверх открытых окон, в нем есть картинка при нажатии и удерживании на которую необходимо отправлять в данное окно залипание кнопки Down до отпускания мышки.

Пытаюсь использовать такой код, но он работает только если заголовок четко определяется, как быть в моем случае? Предлагается использовать WinTitle но как не понятно…


	GUIMouseShowButtonKEY:	
		{
			IfWinExist, IrfanView 64-bit
			WinActivate
			KeyWait LButton, L
			Send, {Down down}
			gosub GuiEscapeMouseShowButtonKEY
			exit
		}
	Return

	GUIEscapeMouseShowButtonKEY:
		{
			Send, {Down up}
			Sleep 128
			exit
		}
	Return

Решение проблемы оказалось проще но не так как хотелось изначально:
Посмотрев WindowSpy ahk_class
Заменил строку на IfWinExist, ahk_class IrfanView

Но вопрос остался: Как правильно искать окно по части его заголовка?

12

Re: AHK: Найти окно по имени и послать Нажать

grisha.puding, https://forum.script-coding.com/rules.html#3.11.

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

13 (изменено: grisha.puding, 2023-03-28 19:23:15)

Re: AHK: Найти окно по имени и послать Нажать

teadrinker

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

14

Re: AHK: Найти окно по имени и послать Нажать

Во-первых, всё равно не нужно поднимать темы многолетней давности. Единственное исключение — на ваш вопрос может ответить только автор темы. Во-вторых, как я понял, ваш вопрос

grisha.puding пишет:

Как правильно искать окно по части его заголовка?

как раз связан с темой лишь косвенно. Ответ скорее всего найдёте, прочитав справку по WinExist(). Подсказка: SetTitleMatchMode.

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