Что нового

Как отследить событие, не мешая работе программы

Suppir

Продвинутый
Сообщения
967
Репутация
62
Скрипт работает в фоновом режиме. В этот момент пользователь работает в другой программе. Каким образом отследить следующее действие в программе:
1) пользователь выполняет двойной клик мышкой
2) скрипт должен "насторожиться" и начать проверять следующие события
2.1) если в течение секунды становится активным окно с именем "ERROR"
то выполнять функцию а()
2.2.) если такое окно не появлятся в течение секунды, то не делать ничего

При этом скрипт не должен никаким образом мешать работы программы (забирать ее хоткеи) и тормозить ее. Спасибо
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Suppir
Это не полный ответ...
Это промежуточный результат...
Можно поймать двойной щелчок в любом месте GUI...

Код:
; НАЧАЛО
 GUICreate("")

 GUISetState ()

 GUIRegisterMsg(0x0203,"MOUSE")

 $TC=false

 While true
  if $TC then
   SplashTextOn("Внимание!","Двойной щелчок мыши",300,50)
   Sleep(3000)
   SplashOff()
   $TC=false
  endif
  Sleep(100)
 Wend

 Func MOUSE()
  $TC=true
  Return "GUI_RUNDEFMSG"
 EndFunc

; КОНЕЦ
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Кстати, 0x0203 - это, вроде двойной левый щелчок. Но у пользователя (левши) главная клавиша на мышке может быть правой. То есть мне нужно перехватить не левый двойной щелчкой, а "primary" двойной щелчок...
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Suppir
Проверил - 0x203 - это и есть primary и для правши, и для левши...
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Suppir
Вариант для произвольного расположения мыши, но...
Только шелчок...
Двойной щелчок, наверное, надо рассматривать как два одиночных через определенный интервал...

Код:
#include <WinAPI.au3>

; Нужна только для завершения скрипта
HotKeySet('{ESC}', '_EXIT')

Dim $hMHook, $pMHook, $hHook

$hMHook = DllCallbackRegister('LowLevelMouseProc', 'long', 'int;wparam;lparam')
$pMHook = DllCallbackGetPtr($hMHook)

$hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, $pMHook, _WinAPI_GetModuleHandle(0))

$MC=false

Do
  if $MC then
   SplashTextOn("Внимание!","Щелчок мыши",300,50)
   Sleep(1000)
   SplashOff()
   $MC=false
  endif
 Sleep(50)
Until GUIGetMsg() = -3

Func _EXIT()
    Exit
EndFunc

Func OnAutoItExit()
    DllCallbackFree($hMHook)
    _WinAPI_UnhookWindowsHookEx($hHook)
EndFunc

Func LowLevelMouseProc($iCode, $iwParam, $ilParam)
 If $iCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $iCode, $iwParam, $ilParam)
 Switch $iwParam 
  Case 0x201
   $MC=true
   Return _WinAPI_CallNextHookEx($hHook, $iCode, $iwParam, $ilParam)
 EndSwitch
 Return _WinAPI_CallNextHookEx($hHook, $iCode, $iwParam, $ilParam)
EndFunc
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Еще проблема в том, что если делать через определенный интервал, то у разных пользователей этот интервал разный (в настройках мыши). Может быть есть более простое решение или пользовательский udf какой?
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Suppir
Вот функция, которая узнает интервал двойного щелчка...
Я так понял, если между щелчками интервал меньше или равен этому времени, то засчитывается двойной щелчок...

Код:
Func _WinAPI_GetDoubleClickTime()
    Local $aResult = DllCall("user32.dll", "uint", "GetDoubleClickTime")
    Return $aResult[0]
EndFunc
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Спасибо, это очень поможет!
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Есть UDF.

*click*
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
OffTopic:
snoitaleR
Две заметки:

1) Настоятельно рекомендую перестать использовать магические числа.
2) Почему у тебя весь код имеет пробелы в начале каждой строки, где ты набираешь код? :-\
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
OffTopic:
snoitaleR
Я тоже тебе рекомендую писать код в соответствии с Tidy. Так будет проще всем (я думаю).
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Спасибо за советы. Я решил пойти более простым (надеюсь) путем - считывать сумму пикселей в окнах.
 
Верх