Автор Тема: [Окна, Диалоги] Функция события дочерних окон  (Прочитано 253 раз)

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

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 99
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Имеется скрипт, отрабатывающий на событие открытия любого окна. Нужно точно так же получить событие, когда открываются дочерние окна. Как это реализовать?? Например, открыли «сетевые подключения», определяется как explorer.exe, но если открывается свойства какого-то подключения, то скрипт этого не фиксирует. Облазил весь инет, похоже, что AutoIt не имеет стандартных решений.
Код: AutoIt [Выделить]
#include <Misc.au3>
#include <Process.au3>
#Include <WinAPI.au3>

Global Const $HSHELL_WINDOWCREATED = 1
Global Const $HSHELL_WINDOWACTIVATED = 4;
Global Const $HWND_MESSAGE  = -3
Global $bHook = 1

$hGui = GUICreate("", 10, 10, -1, 0,-1,-1,$HWND_MESSAGE)
GUIRegisterMsg(_WinAPI_RegisterWindowMessage("SHELLHOOK"), "HookProc")
ShellHookWindow($hGui, $bHook)

Func hookproc($hwnd, $msg, $wparam, $lparam); функция отрабатывает при открытии любого окна
    Switch $wparam
        Case $hshell_windowcreated        
            $Win = _processgetname(WinGetProcess($lparam)); получаем имя процесса открытого окна.
        Case $hshell_windowactivated
    EndSwitch
EndFunc
;процедура перехвата дочерних окон, может быть как-то так:
Func hookproc("??????")
   $Win = _processgetname(WinGetProcess($lparam)); получаем имя процесса открытого дочернего окна
EndFunc
 
Func ShellHookWindow($hWnd, $bFlag)
    Local $sFunc = 'DeregisterShellHookWindow'
    If $bFlag Then $sFunc = 'RegisterShellHookWindow'
    Local $aRet = DllCall('user32.dll', 'int', $sFunc, 'hwnd', $hWnd)
    Return $aRet[0]
EndFunc
 


Пока нахожу только одно решение — включить цикл и мониторить активные окна:
Код: AutoIt [Выделить]
$Handle = WinGetHandle("[active]")

Но такой вариант не совсем устраивает. В этот момент могут открываться какие угодно окна и будут ложные результаты.

Может есть способ получить, является ли в данный момент активное окно дочерним к определенному? Создать маску?? Фильтровать по маске?
« Последнее редактирование: Апрель 19, 2017, 19:02:18 от musicstashall »

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

[Окна, Диалоги] Функция события дочерних окон
« Отправлен: Апрель 19, 2017, 18:15:36 »


Оффлайн musicstashall [?]

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

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Зачем вам это?
Для кастомизации интерфейса.


Добавлено: Апрель 20, 2017, 05:28:14
Ко всем найденным окнам применяется enableblurbehind($lparam):
Код: AutoIt [Выделить]
Func EnableBlurBehind($hWnd)
    Const $DWM_BB_ENABLE = 0x00000001
    $Struct = DllStructCreate("dword;int;ptr;int")
    DllStructSetData($Struct,1,$DWM_BB_ENABLE)
    DllStructSetData($Struct,2,"1")
    DllStructSetData($Struct,4,"1")
    DllCall("dwmapi.dll","int","DwmEnableBlurBehindWindow","hwnd",$hWnd,"ptr",DllStructGetPtr($Struct))
EndFunc

Есть идея сделать еще библиотеку плагин для Rainmeter, реализующую эффект Blur, что официально не поддерживается в Windows выше Seven.


Добавлено: Апрель 20, 2017, 10:00:40
Реализовал задачу сам. Спасибо всем, кто молился.
Запустил в цикле мониторинг активных окон и отфильтровал по маске:
Код: AutoIt [Выделить]
While 1
    $h = WinGetHandle("[active]")
    $win = _processgetname(WinGetProcess($h))
    If StringInStr($sValue, $win) or StringInStr($uValue, $win) Then
        enableblurbehind($h)
    EndIf
    Sleep(500)
WEnd

« Последнее редактирование: Апрель 20, 2017, 10:00:40 от musicstashall, Причина: Объединение сообщений »

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

Re: [Окна, Диалоги] Функция события дочерних окон
« Ответ #2 Отправлен: Апрель 20, 2017, 05:07:59 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
7 Ответов
3951 Просмотров
Последний ответ Июль 16, 2010, 18:34:17
от tech-gs
5 Ответов
2820 Просмотров
Последний ответ Февраль 03, 2011, 14:38:22
от asdf8
19 Ответов
5513 Просмотров
Последний ответ Октябрь 31, 2011, 09:41:38
от madmasles
14 Ответов
4061 Просмотров
Последний ответ Февраль 19, 2012, 11:13:30
от Dimmak
5 Ответов
3031 Просмотров
Последний ответ Март 18, 2013, 02:24:06
от DarWiM
2 Ответов
1670 Просмотров
Последний ответ Март 27, 2013, 13:25:02
от mef-t
1 Ответов
1327 Просмотров
Последний ответ Июнь 02, 2014, 12:23:52
от WSWR
3 Ответов
1267 Просмотров
Последний ответ Август 07, 2014, 04:06:20
от 1dark1
0 Ответов
582 Просмотров
Последний ответ Август 06, 2014, 22:08:07
от madmasles
0 Ответов
306 Просмотров
Последний ответ Апрель 19, 2017, 10:36:22
от musicstashall