1 (изменено: serzh82saratov, 2013-03-20 05:38:28)

Тема: AHK: Получать сообщение о активации\деактивации окон в системе

Господа, подскажите как получать сообщения о активации\деактивации любого окна в системе, в том числе если у самого скрипта нет своего Gui? Наверное это как-то возможно с помощью OnMessage, сам не могу разобратся.
И есть ли возможность получать в сообщении какие-то данные об этом окне?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2

Re: AHK: Получать сообщение о активации\деактивации окон в системе

Можно периодически проверять, которое окно на данный момент является активным.

3

Re: AHK: Получать сообщение о активации\деактивации окон в системе

Таймер на 10 мсек... Думаю скрипт с "критическими" функциями будет не оч. стабильно работать.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: Получать сообщение о активации\деактивации окон в системе

OnMessage отслеживает только сообщения, посланные своему приложению.
Смену активного окна, наверное, правильно отслеживать с помощью хука SetWindowsHookEx, но в AHK он не сработает.
Можно выйти из положения, установив SetWinEventHook и отслеживая событие смены клавиатурного фокуса EVENT_OBJECT_FOCUS. Но оно будет происходить даже при получении фокуса разными контролами внутри одного окна, поэтому нужно определять окно верхнего уровня, которому принадлежит контрол. Если его хэндл сменился — произошла смена активного окна.
Примерно так:

#Persistent
EVENT_OBJECT_FOCUS := 0x8005
global WS_CHILD := 0x40000000, hPrevActive

WinGet, hPrevActive,, A

HWINEVENTHOOK := SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_FOCUS, 0
                     , RegisterCallback("WatchingActivateWindow", "F"), 0, 0, 0)
                     
OnExit, Exit
return

Exit:
   DllCall("UnhookWinEvent", Ptr, HWINEVENTHOOK)
   ExitApp
   
WatchingActivateWindow(hWinEventHook, event, hwnd)
{
   h := hwnd
   While !toplevel
   {
      WinGet, Style, Style, ahk_id %h%
      if (Style & WS_CHILD)
         h := DllCall("GetParent", Ptr, h, Ptr)
      else
         toplevel := 1
   }
   
   if (h != hPrevActive)
      ToolTip % hPrevActive := h   ; хэндл активного в данный момент окна
}

SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)
{
   return DllCall("SetWinEventHook" , UInt, eventMin, UInt, eventMax
                                    , Ptr, hmodWinEventProc, Ptr, lpfnWinEventProc
                                    , UInt, idProcess, UInt, idThread
                                    , UInt, dwFlags, Ptr)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Получать сообщение о активации\деактивации окон в системе

OnMessage отслеживает только сообщения, посланные своему приложению.

Как раз, сам только понял

правильно отслеживать с помощью хука SetWindowsHookEx, но в AHK он не сработает.

Не понял, вы же его использовали в этом скрипте.

Примерно так:

Спасибо! Так и знал, что именно вы поможете

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Получать сообщение о активации\деактивации окон в системе

serzh82saratov пишет:

Не понял, вы же его использовали в этом скрипте.

Он работает в AHK без написания dll только для событий клавиатуры и мыши.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Получать сообщение о активации\деактивации окон в системе

Использую ваш код, и выяснилось - что если активировать окно, следом активировать меню пуск потом панель задач, и потом снова окно - то сообщение о изменении активного окна (после панели задач) не поступит.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Получать сообщение о активации\деактивации окон в системе

У меня иногда срабатывает, иногда нет. Причину не знаю.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Получать сообщение о активации\деактивации окон в системе

Сделал на примере кода creature.ws. Хотел бы знать, с этим могут быть проблемы?

CoordMode, ToolTip, Screen
DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd) 
OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellProc") 
OnExit, Exit
Return

ShellProc(nCode, wParam)
{ 
    static A := 1
    If (nCode = 4)
    { 
        WinGet, Process, ProcessName, % !wParam ? "A" : "ahk_id " wParam 
        ToolTip % A++ "`n`n" Process, 15, 15
    }    
} 

Exit:
    DllCall("DeregisterShellHookWindow", "UInt", A_ScriptHwnd)
    ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Получать сообщение о активации\деактивации окон в системе

с этим могут быть проблемы?

Вы серьёзно? Почему вы считаете этот вопрос уместным?

11

Re: AHK: Получать сообщение о активации\деактивации окон в системе

Я про то что: правильно ли я адаптировал код? Я же в WinApi совсем не бум-бум
И даже до конца не могу понять, что является "WinApi", а что нет. Увидел ваш код, и методом ненаучного тыка что-то "накатал".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: AHK: Получать сообщение о активации\деактивации окон в системе

serzh82saratov пишет:

с этим могут быть проблемы?

В Windows 7 вряд ли, а в XP SP1:
RegisterShellHookWindow function

MSDN пишет:

This function was not included in the SDK headers and libraries until Windows XP with Service Pack 1 (SP1) and Windows Server 2003. If you do not have a header file and import library for this function, you can call the function using LoadLibrary and GetProcAddress.

В будущих версиях Windows:

MSDN пишет:

This function is not intended for general use. It may be altered or unavailable in subsequent versions of Windows.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: Получать сообщение о активации\деактивации окон в системе

teadrinker

В будущих версиях Windows:

А в "восьмёрке" работает?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: Получать сообщение о активации\деактивации окон в системе

Судя по комментарию по ссылке, работает.