- самой первой программой, но по предсказуемым правилам
- хоткеем
- мышкой,
Если эти события вы можете обрабатывать, то задача сводится к отслеживанию событий смены фокуса ввода и сравнению времени «кликов, нажатий» и времени смены фокуса.
Если смена фокуса и «клики, нажатия» произошли в «примерно одно время» то можно предположить, что смена фокуса произведена вами, а не молниеносной и непредсказуемой «второй программой».
#Persistent
DllCall("SetWinEventHook"
, "UInt", 0x8005
, "UInt", 0x8005
, "UInt", 0
, "Ptr", RegisterCallback("HookProc", "F")
, "UInt", 0
, "UInt", 0
, "UInt", 0)
return
HookProc(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime) {
global focusChanged := dwmsEventTime
}
#if WinActive("ahk_exe имяпервойпрограммы.exe") ; если активно окно нужной программы
&& (A_TickCount - focustChanged > 500 ; и изменение фокуса ввода произошло достаточно давно
|| Abs(focusChanged - focusSetByUser) > 100) ; или изменение фокуса ввода произошло совсем недавно, и есть шанс, что мы его прозевали и действия из цитаты в начале сообщения были произведены почти в то же время, что и смена фокуса...
; проблемные горячие клавиши
В переменную focusChanged записывается время изменения фокуса ввода.
В переменную focusSetByUser записывайте время произведения действий, приводящих к изменению активного окна первой программы.
Пример отслеживания изменения фокуса кликом левой кнопки мыши:
#if WinFromPoint("ahk_exe имяпервойпрограммы.exe")
~Lbutton::focusSetByUser := A_TickCount
WinFromPoint(args*) {
MouseGetPos,,, hwnd
return WinExist("ahk_id" hwnd " " args.Remove(1), args*)
}
…Из ситуации, в которой скрипт должен угадать, куда же смотрит юзер, когда жмёт клавиши.