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

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

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 157
  • Репутация: 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 [?]

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

  • Автор темы
  • Репутация: 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 Ответов
4040 Просмотров
Последний ответ Июль 16, 2010, 18:34:17
от tech-gs
5 Ответов
2872 Просмотров
Последний ответ Февраль 03, 2011, 14:38:22
от asdf8
19 Ответов
5712 Просмотров
Последний ответ Октябрь 31, 2011, 09:41:38
от madmasles
14 Ответов
4183 Просмотров
Последний ответ Февраль 19, 2012, 11:13:30
от Dimmak
5 Ответов
3117 Просмотров
Последний ответ Март 18, 2013, 02:24:06
от DarWiM
2 Ответов
1725 Просмотров
Последний ответ Март 27, 2013, 13:25:02
от mef-t
1 Ответов
1429 Просмотров
Последний ответ Июнь 02, 2014, 12:23:52
от WSWR
3 Ответов
1323 Просмотров
Последний ответ Август 07, 2014, 04:06:20
от 1dark1
0 Ответов
616 Просмотров
Последний ответ Август 06, 2014, 22:08:07
от madmasles
0 Ответов
353 Просмотров
Последний ответ Апрель 19, 2017, 10:36:22
от musicstashall