Что нового

[Окна, Диалоги] Функция события дочерних окон

musicstashall

Знающий
Сообщения
322
Репутация
7
Имеется скрипт, отрабатывающий на событие открытия любого окна. Нужно точно так же получить событие, когда открываются дочерние окна. Как это реализовать?? Например, открыли «сетевые подключения», определяется как explorer.exe, но если открывается свойства какого-то подключения, то скрипт этого не фиксирует. Облазил весь инет, похоже, что 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


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

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

Может есть способ получить, является ли в данный момент активное окно дочерним к определенному? Создать маску?? Фильтровать по маске?
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
inververs сказал(а):
Для кастомизации интерфейса.


Добавлено:
Сообщение автоматически объединено:

Ко всем найденным окнам применяется enableblurbehind($lparam):
Код:
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.


Добавлено:
Сообщение автоматически объединено:

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