Автор Тема: Pixelsearch в активном окне - ищет по всему рабочему столу  (Прочитано 1719 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн m4e [?]

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


Код: AutoIt [Выделить]
 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]","")
 


Русское сообщество AutoIt


Оффлайн Prog [?]

  • Осваивающий
  • **
  • Сообщений: 327
  • Репутация: 31
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Возможно окно не успевает прорисоваться на экране. Нужно запустить приложение, немного подождать, затем активировать окно, немного подождать и после этого выполнять поиск.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Может это поможет?


Думай, прежде чем говорить.

Русское сообщество AutoIt

Re: Pixelsearch в активном окне - ищет по всему рабочему столу
« Ответ #2 Отправлен: Декабрь 15, 2015, 22:03:42 »

Оффлайн m4e [?]

  • Новичок
  • *
  • Сообщений: 21

  • Автор темы
  • Репутация: 0
    • Награды
Может это поможет?

Спасибо, но это ещё более сложный способ. Я уже к своему за 4 года привык, просто иногда он ищет пиксель на рабочем столе и не срабатывает. Хотелось допилить, вот...


Добавлено: Декабрь 15, 2015, 22:33:13
Возможно окно не успевает прорисоваться на экране. Нужно запустить приложение, немного подождать, затем активировать окно, немного подождать и после этого выполнять поиск.
Пошаманил - не помогло. Ощущение, что он не ищет пиксель в этом окне. Скорее всего, я где-то элементарно ошибся в этом куске -

Код: AutoIt [Выделить]
 Opt("PixelCoordMode", 0)
 Sleep (500);
 $HWnd = WinGetHandle("[CLASS:#32770]")
 $coord = PixelSearch(0, 0, 2500, 2700, 0x25c600, 20, $HWnd)


Alofa

  • Гость
Почитайте Коментарии:
Код: AutoIt [Выделить]
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: Уж очень это все некрасиво смотрится.
« Последнее редактирование: Декабрь 16, 2015, 00:41:22 от Alofa »

Русское сообщество AutoIt

Re: Pixelsearch в активном окне - ищет по всему рабочему столу
« Ответ #4 Отправлен: Декабрь 15, 2015, 23:56:16 »

Оффлайн m4e [?]

  • Новичок
  • *
  • Сообщений: 21

  • Автор темы
  • Репутация: 0
    • Награды
Все круто, только процентах в 25 не может найти пиксель. Окно открывается в левой части экрана, но каждый раз в хаотичном месте.

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

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

Код: AutoIt [Выделить]
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]","")


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

Alofa

  • Гость
Вот, слегка подправил ваш скрипт:
(нажмите для показа/скрытия)

Оффлайн m4e [?]

  • Новичок
  • *
  • Сообщений: 21

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

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

Русское сообщество AutoIt

Re: Pixelsearch в активном окне - ищет по всему рабочему столу
« Ответ #7 Отправлен: Декабрь 18, 2015, 00:19:29 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
6058 Просмотров
Последний ответ Июль 09, 2010, 02:16:00
от CreatoR
7 Ответов
3747 Просмотров
Последний ответ Октябрь 03, 2011, 21:53:09
от madmasles
0 Ответов
1577 Просмотров
Последний ответ Июнь 14, 2013, 20:12:29
от madmasles
4 Ответов
2333 Просмотров
Последний ответ Март 05, 2014, 14:04:11
от Yuriy
1 Ответов
1836 Просмотров
Последний ответ Май 30, 2014, 13:32:39
от InnI
7 Ответов
2653 Просмотров
Последний ответ Январь 01, 2015, 12:49:41
от InnI
5 Ответов
3978 Просмотров
Последний ответ Апрель 07, 2015, 18:41:20
от darklord422
2 Ответов
2228 Просмотров
Последний ответ Июнь 01, 2015, 11:28:10
от ---Zak---
0 Ответов
589 Просмотров
Последний ответ Август 11, 2017, 10:03:51
от dimcomp
51 Ответов
4055 Просмотров
Последний ответ Май 21, 2018, 00:41:54
от Alofa