Что нового

Pixelsearch в активном окне - ищет по всему рабочему столу

m4e

Чайник
Сообщения
21
Репутация
0
Господа, такая проблема - хочу сделать быстрое переключение с усилителя на обычные колонки в 7й винде.
так как я овощ, пошел тем путем, которым смог.
Реализовал такую функцию - вызывается микшер, дальше ищется зелёный пиксель, открывается второе окно, автоматически прокликивается и всё закрывается.
Проблема в том, что не могу заставить искать пиксель в конкретном окне - он или ищется по всему раб. столу, либо не ищется совсем.
Чтобы было проще понять - выкладываю весь скрипт.
Всё что я хочу - чтобы мой пиксель искался в конкретном активном окне.
Буду признателен за помощь, спасибо!


Код:
ShellExecute ("C:\Windows\System32\mmsys.cpl");
 WinWaitActive("[CLASS:#32770]")
 Opt("PixelCoordMode", 0)
 $HWnd = WinGetHandle("[CLASS:#32770]")
 $coord = PixelSearch(0, 0, 2500, 2700, 0x25c600, 20, $HWnd)
 if IsArray ($coord) = True Then
 	MouseClick ("left", $coord[0], $coord[1] ,2)
 Else
 	MsgBox(0, "Error","no pixel search", 0.3)
 EndIf
 send ("{TAB}");
 send ("{TAB}");
 send ("{TAB}");
 send ("{TAB}");
 send ("{TAB}");
 send ("{TAB}");
 send ("{TAB}");
 send ("{right}");
 send ("{right}");
 send ("{TAB}");
 send ("{SPACE}");
 sleep (100);
WinClose("[CLASS:#32770]","")
WinClose("[CLASS:#32770]","")
 

Prog

Осваивающий
Сообщения
335
Репутация
31
Возможно окно не успевает прорисоваться на экране. Нужно запустить приложение, немного подождать, затем активировать окно, немного подождать и после этого выполнять поиск.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Может это поможет?
 
Автор
M

m4e

Чайник
Сообщения
21
Репутация
0
Yashied сказал(а):
Спасибо, но это ещё более сложный способ. Я уже к своему за 4 года привык, просто иногда он ищет пиксель на рабочем столе и не срабатывает. Хотелось допилить, вот...


Добавлено:
Сообщение автоматически объединено:

Prog сказал(а):
Возможно окно не успевает прорисоваться на экране. Нужно запустить приложение, немного подождать, затем активировать окно, немного подождать и после этого выполнять поиск.
Пошаманил - не помогло. Ощущение, что он не ищет пиксель в этом окне. Скорее всего, я где-то элементарно ошибся в этом куске -

Код:
Opt("PixelCoordMode", 0)
 Sleep (500);
 $HWnd = WinGetHandle("[CLASS:#32770]")
 $coord = PixelSearch(0, 0, 2500, 2700, 0x25c600, 20, $HWnd)
 
A

Alofa

Гость
Почитайте Коментарии:
Код:
ShellExecute(@SystemDir & "\mmsys.cpl");
$HWnd = WinWaitActive("[CLASS:#32770;TITLE:Звук]")
$WinPos = WinGetPos($HWnd)
$coord = PixelSearch($WinPos[0], $WinPos[1], $WinPos[0] + 114, $WinPos[1] + 377, 0x57C637, 2, 1, $HWnd)

If IsArray($coord) = True Then
	MouseClick("left", $coord[0], $coord[1], 2, 0)
Else
	MsgBox(0, "Error", "no pixel search", 3)
	Exit ; Выход
EndIf

$iTimer = TimerInit() ; Включаем таймер - это необходимо для предотвращения возможного бесконечного цикла (перестраховка)
Do ; Ожидаем дочернее окно (у меня оно всплывает), а точнее его клиентской области
	Sleep(250)
	If TimerDiff($iTimer) >= 3000 Then Exit ; Максимальное время работы данного цикла ~3 секунд
Until ControlFocus('[CLASS:#32770]', '', '[CLASS:SysTabControl32; ID:12320]') = 1

$HWnd_2 = WinActive('[CLASS:#32770]')

;#cs############## Блок #############################################
Send("{TAB}");		|
Sleep(50);			|
Send("{TAB}");		|
Sleep(50);			|
Send("{TAB}");		|
Sleep(50);			|
Send("{TAB}");		|
Sleep(50);			|
Send("{TAB}");		|
Sleep(50);			|
Send("{TAB}");		| ==> Какие кнопки и когда нажимать решайте сами
Sleep(50);			|
Send("{TAB}");		|
Sleep(50);			|
Send("{TAB}");		|
Sleep(50);			|
Send("{right}");	|
Sleep(50);			|
Send("{right}");	|
Sleep(50);			|
Send("{TAB}");		|
Sleep(50);			|
Send("{SPACE}");	|
;#ce###################################################################

#cs############## Это тоже самое что и предыдущий блок #################

Local $Press[] = ['{TAB}', '{RIGHT}', '{SPACE}']
For $i = 1 To 12
	Switch $i
		Case 1 To 8, 11
			$ic = $Press[0]
		Case 9, 10
			$ic = $Press[1]
		Case 12
			$ic = $Press[2]
	EndSwitch
	Send($ic)
	Sleep(50)
Next

#ce###################################################################

Sleep(50);
WinClose($HWnd_2)
WinClose($HWnd)


P.s: Уж очень это все некрасиво смотрится.
 
Автор
M

m4e

Чайник
Сообщения
21
Репутация
0
Все круто, только процентах в 25 не может найти пиксель. Окно открывается в левой части экрана, но каждый раз в хаотичном месте.

Изменил глубину поиска пикселя с 2 на 10. Вроде стабильно работает.

Вот такой вариант получился окончательный:

Код:
ShellExecute(@SystemDir & "\mmsys.cpl");
$HWnd = WinWaitActive("[CLASS:#32770;TITLE:Звук]")
$WinPos = WinGetPos($HWnd)
$coord = PixelSearch($WinPos[0], $WinPos[1], $WinPos[0] + 114, $WinPos[1] + 377, 0x57C637, 10, 1, $HWnd)

If IsArray($coord) = True Then
    MouseClick("left", $coord[0], $coord[1], 2, 0)
Else
    MsgBox(0, "Error", "no pixel search", 0.3)
    Exit ; Выход
	WinClose("[CLASS:#32770]","")
EndIf

$iTimer = TimerInit() ; Включаем таймер - это необходимо для предотвращения возможного бесконечного цикла (перестраховка)
Do ; Ожидаем дочернее окно (у меня оно всплывает), а точнее его клиентской области
    Sleep(250)
    If TimerDiff($iTimer) >= 3000 Then Exit ; Максимальное время работы данного цикла ~3 секунд
Until ControlFocus('[CLASS:#32770]', '', '[CLASS:SysTabControl32; ID:12320]') = 1
 send ("{right}");
 send ("{right}");
 send ("{TAB}");
 send ("{SPACE}");
 sleep (100);
WinClose("[CLASS:#32770]","")
WinClose("[CLASS:#32770]","")


Буду тестировать. Большое спасибо!
 
A

Alofa

Гость
Вот, слегка подправил ваш скрипт:
Код:
ShellExecute(@SystemDir & "\mmsys.cpl");
$HWnd = WinWaitActive("[CLASS:#32770;TITLE:Звук]")
$WinPos = WinGetPos($HWnd)
$coord = PixelSearch($WinPos[0], $WinPos[1], $WinPos[0] + 114, $WinPos[1] + 377, 0x57C637, 10, 1, $HWnd)

If IsArray($coord) = True Then
    MouseClick("left", $coord[0], $coord[1], 2, 0)
Else
    MsgBox(0, "Error", "no pixel search", 3)
    _Exit()
EndIf

$iTimer = TimerInit()
Do
    Sleep(250)
    If TimerDiff($iTimer) >= 3000 Then _Exit()
Until ControlFocus('[CLASS:#32770]', '', '[CLASS:SysTabControl32; ID:12320]')
 send ("{right}");
 send ("{right}");
 send ("{TAB}");
 send ("{SPACE}");
 sleep (100);
 _Exit()
 
Func _Exit()
	WinClose("[CLASS:#32770]")
	WinClose($HWnd)
	Exit
EndFunc
 
Автор
M

m4e

Чайник
Сообщения
21
Репутация
0
Работает прекрасно! Уверен, кому-то скрипт будет полезен даже больше, чем мне. Может быть, Модератор переименует тему в что-то наподобие -
"Автоматическое переключение звукового входа на цифровой в Windows 7".

Еще раз большое спасибо, Alofa
 
Верх