Тема: AHK: Активация окна наведением курсора без вывода на передний план
По следам этой темы. Недавно обнаружил, как можно включать и выключать "active window tracking" без перезагрузки. В принципе, я предпочитаю пользоваться этой возможностью постоянно, но встречаются приложения, работать с которыми не очень удобно, когда она включена (окна подсказок забирают фокус), и всегда хотелось иметь возможность отключать её ненадолго. Однако, иного способа, кроме как правка реестра и последующая перезагрузка (или logout + login, как верно подсказал creature.ws, а вот версия Irbis'а не сработала) известно мне не было. Но теперь всё изменилось!
Следующая функция работает, как переключатель:
F11::
ToolTip % "ActiveWindowTracking " . (ActiveWindowTracking_Toggle() ? "В" : "ОТ") . "ключен!"
Sleep, 1000
ToolTip
return
ActiveWindowTracking_Toggle(ActiveWndTrkZorder=0, ActiveWndTrkTimeout=0)
{
; ActiveWndTrkZorder — выводить ли активируемое мышью окно на передний план
; ActiveWndTrkTimeout — таймаут при активации мышью в милисекундах
SPI_GETACTIVEWINDOWTRACKING := 0x1000
SPI_SETACTIVEWINDOWTRACKING := 0x1001
SPI_GETACTIVEWNDTRKZORDER := 0x100C
SPI_SETACTIVEWNDTRKZORDER := 0x100D
SPI_GETACTIVEWNDTRKTIMEOUT := 0x2002
SPI_SETACTIVEWNDTRKTIMEOUT := 0x2003
SPIF_UPDATEINIFILE := 0x1
if b := CheckAndAction(SPI_GETACTIVEWINDOWTRACKING, SPI_SETACTIVEWINDOWTRACKING, SPIF_UPDATEINIFILE)
{
CheckAndAction(SPI_GETACTIVEWNDTRKZORDER , SPI_SETACTIVEWNDTRKZORDER , SPIF_UPDATEINIFILE, ActiveWndTrkZorder)
CheckAndAction(SPI_GETACTIVEWNDTRKTIMEOUT, SPI_SETACTIVEWNDTRKTIMEOUT, SPIF_UPDATEINIFILE, ActiveWndTrkTimeout)
}
Return !b
}
CheckAndAction(uiGET, uiSET, fWinIni, arg="")
{
VarSetCapacity(buffer, 4)
DllCall("SystemParametersInfo", UInt, uiGET, UInt, 0, Ptr, &buffer, UInt, 0)
if ((b := NumGet(buffer, "UInt")) != arg)
DllCall("SystemParametersInfo", UInt, uiSET, UInt, 0, Ptr, arg = "" ? !b : arg, UInt, fWinIni)
Return b
}
