Что нового

DWM - Desktop Window Manager (Vista / 7): возможности и методы работы

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Поставил недавно Windows 7, и решил поиграться с Aero... Вот пример того, как сделать прозрачный (Glass) фон у окна, используя новый движок. Для того, чтобы это все работало, нужно естественно Windows Vista/7 и включенный Aero.

Код:
Global Const $WM_DWMCOMPOSITIONCHANGED = 0x031E

$hForm = GUICreate('MyGUI', 400, 400)
GUIRegisterMsg($WM_DWMCOMPOSITIONCHANGED, 'WM_DWMCOMPOSITIONCHANGED')
WM_DWMCOMPOSITIONCHANGED($hForm, $WM_DWMCOMPOSITIONCHANGED, 0, 0)
GUISetState()

Do
Until GUIGetMsg() = -3

Func _WinAPI_DwmExtendFrameIntoClientArea($hWnd, $tMargins = 0)

	If Not IsDllStruct($tMargins) Then
		$tMargins = DllStructCreate('int;int;int;int')
		For $i = 1 To 4
			DllStructSetData($tMargins, $i, -1)
		Next
	EndIf

	Local $Ret = DllCall('dwmapi.dll', 'int', 'DwmExtendFrameIntoClientArea', 'hwnd', $hWnd, 'ptr', DllStructGetPtr($tMargins))

	If @error Then
		Return SetError(1, 0, 0)
	Else
		If $Ret[0] Then
			Return SetError(1, $Ret[0], 0)
		EndIf
	EndIf
	Return 1
EndFunc   ;==>_WinAPI_DwmExtendFrameIntoClientArea

Func _WinAPI_DwmIsCompositionEnabled()

	Local $Ret = DllCall('dwmapi.dll', 'int', 'DwmIsCompositionEnabled', 'int*', 0)

	If @error Then
		Return SetError(1, 0, 0)
	Else
		If $Ret[0] Then
			Return SetError(1, $Ret[0], 0)
		EndIf
	EndIf
	Return $Ret[1]
EndFunc   ;==>_WinAPI_DwmIsCompositionEnabled

Func WM_DWMCOMPOSITIONCHANGED($hWnd, $iMsg, $wParam, $lParam)

	Local $RGB = 0xFFFFFF

	Switch $hWnd
		Case $hForm
			If _WinAPI_DwmIsCompositionEnabled() Then
				_WinAPI_DwmExtendFrameIntoClientArea($hWnd)
				$RGB = 0
			EndIf
			GUISetBkColor($RGB, $hWnd)
	EndSwitch
	Return 0
EndFunc   ;==>WM_DWMCOMPOSITIONCHANGED
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Стеклянный фон для окна (Vista/7)

Yashied
Красиво.
А как узнать, включен Aero или нет.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Стеклянный фон для окна (Vista/7)

madmasles сказал(а):
А как узнать, включен Aero или нет.

Код:
_WinAPI_DwmIsCompositionEnabled()
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Стеклянный фон для окна (Vista/7)

Yashied [?]
_WinAPI_DwmIsCompositionEnabled()
А в какой библиотеке эта функция ? Не нашел ее ни в <WinAPI.au3>, ни в <WinAPIEx.au3> v.2.5.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Re: Стеклянный фон для окна (Vista/7)

madmasles [?]
А в какой библиотеке эта функция ?
в самом первом посте приведен список функций. один из них
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Стеклянный фон для окна (Vista/7)

Извините, туплю... :smile:
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Re: Стеклянный фон для окна (Vista/7)

Очучаю ... что это надо добавит в WinAPIEx.au3 :-[
А если на это окно приляпать кнопку .... то текст на кнопке тоже прозрачный
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Стеклянный фон для окна (Vista/7)

Вот еще один прикольный пример на эту тему (в аттаче).



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

FlatX007 сказал(а):
???

FlatX007 сказал(а):
А если на это окно приляпать кнопку .... то текст на кнопке тоже прозрачный
Если по быстрому, то можешь сделать так:

Код:
GUICtrlCreateButton('OK', 10, 10, 70, 24)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, 0)
 

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
Re: Стеклянный фон для окна (Vista/7)

Вот ещё адын пример с элементами управления....

Взял с забугорного форума

Код:
#include <GDIPlus.au3>
#include <GUIConstants.au3>

_GDIPlus_Startup ()

Global Const $DWM_BB_ENABLE = 0x00000001
Global $MyArea[4] = [0, 0, 0, 45]
$Struct = DllStructCreate("int cxLeftWidth;int cxRightWidth;int cyTopHeight;int cyBottomHeight;")
$sStruct = DllStructCreate("dword;int;ptr;int")

$hGUI = GUICreate("Windows Vista DWM", 243, 243)
;$Label = GUICtrlCreateLabel("Aero Test", 10, 10)
$Apply = GUICtrlCreateButton("Apply", 80, 104, 83, 25, 0)
$ICE = GUICtrlCreateButton("DWM Check", 80, 134, 83, 25, 0)
GUISetState()

$hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
_GDIPlus_GraphicsDrawString ($hGraphic, "This is a test string on DWM.", 35, 20)

While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
        Case $GUI_EVENT_CLOSE
            _GDIPlus_GraphicsDispose ($hGraphic)
            _GDIPlus_Shutdown ()
            Exit
        Case $Apply
            ;_DWM_Aero_ApplyGlass($hGUI)
            _DWM_Aero_EnableBlurBehind($hGUI)
            ;_DWM_Aero_ApplyGlassArea($hGUI, $MyArea, 0xE2E2E2)
            If Not @error Then
                GUICtrlSetColor($Apply, 0xFFFFFF)
                GUICtrlSetBkColor($Apply, 0x000000)
                GUICtrlSetColor($ICE, 0xFFFFFF)
                GUICtrlSetBkColor($ICE, 0x000000)
                ;GuiCtrlSetColor($Label, 0xFFFFFF)
            EndIf
        Case $ICE
            If _DWM_ICE() Then
                MsgBox(0, "_DWM_Aero_ICE", "DWM is enabled!")
            Else
                MsgBox(0, "_DWM_Aero_ICE", "DWM is NOT enabled!")
            EndIf
    EndSwitch
WEnd

; #FUNCTION#;===============================================================================
;
; Name...........: _DWM_Aero_ApplyGlass
; Description ...: Applys glass effect to a window
; Syntax.........: _DWM_Aero_ApplyGlass($hWnd, [$bColor)
; Parameters ....: $hWnd - Window handle:
;                  $bColor  - Background color
; Return values .: Success - No return
;                  Failure - Returns 0
; Author ........: James Brooks
; Modified.......:
; Remarks .......: Thanks to weaponx!
; Related .......:
; Link ..........;
; Example .......; Yes
;
;;==========================================================================================
Func _DWM_Aero_ApplyGlass($hWnd, $bColor = 0x000000)
    If Not _IsWinAero() Then
        SetError(0, 0, -1)
        Return 0
    Else
        GUISetBkColor($bColor); Must be here!
        $Ret = DllCall("dwmapi.dll", "long", "DwmExtendFrameIntoClientArea", "hwnd", $hWnd, "long*", DllStructGetPtr($Struct))
        If @error Then
            SetError(0)
            Return 0
        Else
            Return $Ret
        EndIf
    EndIf
EndFunc   ;==>_DWM_Aero_ApplyGlass

; #FUNCTION#;===============================================================================
;
; Name...........: _DWM_Aero_ApplyGlassArea
; Description ...: Applys glass effect to a window area
; Syntax.........: _DWM_Aero_ApplyGlassArea($hWnd, $Area, [$bColor)
; Parameters ....: $hWnd - Window handle:
;                   $Area - Array containing area points
;                  $bColor  - Background color
; Return values .: Success - No return
;                  Failure - Returns 0
; Author ........: James Brooks
; Modified.......:
; Remarks .......: Thanks to monoceres!
; Related .......:
; Link ..........;
; Example .......; Yes
;
;;==========================================================================================
Func _DWM_Aero_ApplyGlassArea($hWnd, $Area, $bColor = 0x000000)
    If Not _IsWinAero() Then
        SetError(0, 0, -1)
        Return 0
    Else
        If _DWM_ICE() Then
            ConsoleWrite("ICE ENABLED!" & @CRLF)
            If IsArray($Area) Then
                DllStructSetData($Struct, "cxLeftWidth", $Area[0])
                DllStructSetData($Struct, "cxRightWidth", $Area[1])
                DllStructSetData($Struct, "cyTopHeight", $Area[2])
                DllStructSetData($Struct, "cyBottomHeight", $Area[3])
                GUISetBkColor($bColor); Must be here!
                $Ret = DllCall("dwmapi.dll", "long*", "DwmExtendFrameIntoClientArea", "hwnd", $hWnd, "ptr", DllStructGetPtr($Struct))
                If @error Then
                    SetError(0, 0, 1)
                    Return 0
                Else
                    Return $Ret
                EndIf
            Else
                ConsoleWrite("ICE DISABLED!" & @CRLF)
                SetError(1)
                Return 0
            EndIf
        Else
            SetError(2, 0, 2)
            Return 0
        EndIf
    EndIf
EndFunc   ;==>_DWM_Aero_ApplyGlassArea

; #FUNCTION#;===============================================================================
;
; Name...........: _DWM_Aero_EnableBlurBehind
; Description ...: Enables the blur effect on the provided window handle.
; Syntax.........: _DWM_Aero_EnableBlurBehind($hWnd)
; Parameters ....: $hWnd - Window handle:
; Return values .: Success - No return
;                  Failure - Returns 0
; Author ........: James Brooks
; Modified.......:
; Remarks .......: Thanks to komalo
; Related .......:
; Link ..........;
; Example .......; Yes
;
;;==========================================================================================
Func _DWM_Aero_EnableBlurBehind($hWnd, $bColor = 0x000000)
    If Not _IsWinAero() Then
        SetError(0, 0, -1)
        Return 0
    Else
        DllStructSetData($sStruct, 1, $DWM_BB_ENABLE)
        DllStructSetData($sStruct, 2, "1")
        DllStructSetData($sStruct, 4, "1")

        GUISetBkColor($bColor); Must be here!
        $Ret = DllCall("dwmapi.dll", "int", "DwmEnableBlurBehindWindow", "hwnd", $hWnd, "ptr", DllStructGetPtr($sStruct))
        If @error Then
            SetError(0, 0, 1)
            Return 0
        Else
            Return $Ret
        EndIf
    EndIf
EndFunc   ;==>_DWM_Aero_EnableBlurBehind

; #FUNCTION#;===============================================================================
;
; Name...........: _DWM_ICE
; Description ...: Returns 1 if DWM is enabled or 0 if not
; Syntax.........: _DWM_ICE()
; Parameters ....:
; Return values .: Success - Returns 1
;                  Failure - Returns 0
; Author ........: James Brooks
; Example .......; Yes
;
;;==========================================================================================
Func _DWM_ICE()
    If Not _IsWinAero() Then
        $ICEStruct = DllStructCreate("int;")
        $Ret = DllCall("dwmapi.dll", "int", "DwmIsCompositionEnabled", "ptr", DllStructGetPtr($ICEStruct))
        If @error Then
            SetError(0, 0, -1) ; DWM is not active
            Return 0
        Else
            Return DllStructGetData($ICEStruct, 1)
        EndIf
    Else
        SetError(1, 0, 1) ; Not running Windows 6.1 or above
        Return 1
    EndIf
EndFunc   ;==>_DWM_Aero_ICE

; #FUNCTION#;===============================================================================
;
; Name...........: __GetVersionEx
; Description ...: Returns version number of OS
; Syntax.........: _GetVersionEx()
; Parameters ....:
; Return values .: Success - Returns version integer
;                  Failure - Returns 0
; Author ........: James Brooks
;
;;==========================================================================================
Func _IsWinAero()
    Local $__iVer = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentVersion")
    If $__iVer >= 6.1 Then
        Return 1
    Else
        Return 0
    EndIf
EndFunc
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Re: Стеклянный фон для окна (Vista/7)

а как быть с GUICtrlCreateEdit ... текст прозрачный

Пробовал менять через GuiRichEdit.au3 цвет текста меняется но становится блёклым и перемешивается с цветом окна.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Стеклянный фон для окна (Vista/7)

Можно почитать здесь.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Стеклянный фон для окна (Vista/7)

sforce5 сказал(а):
Вот ещё адын пример с элементами управления...

Эту функцию можно использовать еще и так:

Код:
#Include <WinAPIEx.au3>

Global Const $DWM_BB_ENABLE = 0x01
Global Const $DWM_BB_BLURREGION = 0x02
Global Const $DWM_BB_TRANSITIONONMAXIMIZED = 0x04

If Not _WinAPI_DwmIsCompositionEnabled() Then
	MsgBox(16, 'Error', 'Require Windows Vista or above with enabled Aero theme.')
	Exit
EndIf

$hForm = GUICreate('MyGUI', 400, 400)

GUISetBkColor(0)

_WinAPI_DwmGetColorizationColor()
If Not @extended Then
	$hRgn = _WinAPI_CreateEllipticRgn(_WinAPI_CreateRectEx(50, 50, 300, 300))
Else
	$hRgn = 0
EndIf
_WinAPI_DwmEnableBlurBehindWindow($hForm, $hRgn, 1, 0, BitOR($DWM_BB_ENABLE, $DWM_BB_BLURREGION))
If $hRgn Then
	_WinAPI_FreeObject($hRgn)
EndIf

GUISetState()

Do
Until GUIGetMsg() = -3

Func _WinAPI_DwmEnableBlurBehindWindow($hWnd, $hRgn, $fEnable, $fTransition, $iFlags)

	Local $tBLURBEHIND = DllStructCreate('dword;ushort;ptr;ushort')

	DllStructSetData($tBLURBEHIND, 1, $iFlags)
	DllStructSetData($tBLURBEHIND, 2, $fEnable)
	DllStructSetData($tBLURBEHIND, 3, $hRgn)
	DllStructSetData($tBLURBEHIND, 4, $fTransition)

	Local $Ret = DllCall('dwmapi.dll', 'uint', 'DwmEnableBlurBehindWindow', 'hwnd', $hWnd, 'ptr', DllStructGetPtr($tBLURBEHIND))

	If @error Then
		Return SetError(1, 0, 0)
	Else
		If $Ret[0] Then
			Return SetError(1, $Ret[0], 0)
		EndIf
	EndIf
	Return 1
EndFunc   ;==>_WinAPI_DwmEnableBlurBehindWindow

Func _WinAPI_DwmGetColorizationColor()

	Local $Ret = DllCall('dwmapi.dll', 'uint', 'DwmGetColorizationColor', 'dword*', 0, 'int*', 0)

	If @error Then
		Return SetError(1, 0, 0)
	Else
		If $Ret[0] Then
			Return SetError(1, $Ret[0], 0)
		EndIf
	EndIf
	Return SetError(0, $Ret[2], $Ret[1])
EndFunc   ;==>_WinAPI_DwmGetColorizationColor

Func _WinAPI_DwmIsCompositionEnabled()

	Local $Ret = DllCall('dwmapi.dll', 'uint', 'DwmIsCompositionEnabled', 'int*', 0)

	If @error Then
		Return SetError(1, 0, 0)
	Else
		If $Ret[0] Then
			Return SetError(1, $Ret[0], 0)
		EndIf
	EndIf
	Return $Ret[1]
EndFunc   ;==>_WinAPI_DwmIsCompositionEnabled

FlatX007, еще про DWM кое-что можно почитать здесь. Получается, что рисовать на "стеклянном" окне не такая уж и тривиальная задача...
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Стеклянный фон для окна (Vista/7)

FlatX007 сказал(а):
а как быть с GUICtrlCreateEdit ... текст прозрачный

Можно сделать такой трюк (зацени):

Код:
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

Global $hForm, $AlphaKey = 0xABABAB

$hForm = GUICreate('MyGUI', 400, 400, -1, -1, -1, $WS_EX_LAYERED)
GUISetBkColor($AlphaKey)
GUICtrlCreateInput('Simple Text', 20, 20, 360, 19)
GUICtrlCreateEdit('', 20, 47, 360, 200)
GUICtrlCreateButton('OK', 165, 370, 70, 23)

_WinAPI_SetLayeredWindowAttributes($hForm, $AlphaKey, 0, $LWA_COLORKEY)
_WinAPI_DwmExtendFrameIntoClientArea($hForm)

GUISetState()

Do
Until GUIGetMsg() = -3


В следующим примере я добавил Hook на мышь, что бы окно не "простреливалось".

Код:
#Include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)
Opt('WinWaitDelay', 0)

Global Const $WM_NCXBUTTONDOWN = 0x00AB

Global $hForm, $Area, $hDll, $pDll, $hHook, $AlphaKey = 0xABABAB

OnAutoItExitRegister('OnAutoItExit')

$hForm = GUICreate('MyGUI', 400, 400, -1, -1, -1, $WS_EX_LAYERED)
GUISetBkColor($AlphaKey)
$Area = GUICtrlCreateLabel('', 0, 0, 400, 400)
GUICtrlSetBkColor(-1, $AlphaKey)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateInput('Simple Text', 20, 20, 360, 19)
GUICtrlCreateEdit('', 20, 47, 360, 200)
GUICtrlCreateButton('OK', 165, 370, 70, 23)

_WinAPI_SetLayeredWindowAttributes($hForm, $AlphaKey, 0, $LWA_COLORKEY)
_WinAPI_DwmExtendFrameIntoClientArea($hForm)

$hDll = DllCallbackRegister('_MouseHook', 'ptr', 'int;wparam;lparam')
$pDll = DllCallbackGetPtr($hDll)
$hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, $pDll, 0)

GUISetState()

Do
Until GUIGetMsg() = -3

Func _MouseHook($iCode, $wParam, $lParam)
    If $iCode > -1 Then
        Switch $wParam
			Case $WM_LBUTTONDOWN, $WM_MBUTTONDOWN, $WM_RBUTTONDOWN, $WM_XBUTTONDOWN, $WM_NCXBUTTONDOWN

				Local $Data = GUIGetCursorInfo($hForm)

                If (IsArray($Data)) And ($Data[4] = $Area) Then
                    If Not BitAND(WinGetState($hForm), 8) Then
                        WinActivate($hForm)
                    EndIf
                    Return -1
                EndIf
        EndSwitch
    EndIf
    Return _WinAPI_CallNextHookEx($hHook, $iCode, $wParam, $lParam)
EndFunc   ;==>_MouseHook

Func OnAutoItExit()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hDll)
EndFunc   ;==>OnAutoItExit
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вот еще одна плюшка из нового интерфейса "живые" миниатюры.

Код:
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

If Not _WinAPI_DwmIsCompositionEnabled() Then
	MsgBox(16, 'Error', 'Require Windows Vista or above with enabled Aero theme.')
	Exit
EndIf

Global $hWnd, $hForm, $hThumbnail, $tSIZE, $tDestRect, $tSrcRect, $Width, $Height

Run(@SystemDir & '\calc.exe')
$hWnd = WinWaitActive('Calculator', '', 3)
If Not $hWnd Then
	Exit
EndIf

; Create GUI
$hForm = GUICreate('MyGUI', 400, 400)

GUISetBkColor(0)

; Create the "sheet of glass" effect for the entire window. You must call this function whenever DWM composition is toggled.
_WinAPI_DwmExtendFrameIntoClientArea($hForm)

; Create a DWM thumbnail relationship (2:1)
$hThumbnail = _WinAPI_DwmRegisterThumbnail($hForm, $hWnd)
$tSIZE = _WinAPI_DwmQueryThumbnailSourceSize($hThumbnail)
$Width = DllStructGetData($tSIZE, 1)
$Height = DllStructGetData($tSIZE, 2)
$tDestRect = _WinAPI_CreateRectEx((400 - $Width / 2) / 2, (400 - $Height / 2) / 2, $Width / 2, $Height / 2)
$tSrcRect = _WinAPI_CreateRectEx(-20, -20, $Width + 40, $Height + 40)
_WinAPI_DwmUpdateThumbnailProperties($hThumbnail, 1, 0, 255, $tDestRect, $tSrcRect)

GUISetState()

Do
Until GUIGetMsg() = -3
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Yashied - заценил ...очень мило. Как раз то что нужно.

Вследующим примере я добавил Hook на мышь, что бы окно не "простреливалось". - ошибку выдаёт хз из за чего

C:\MyDocum\Profiles\Олег\Temp\1.au3(39,13) : ERROR: syntax error
Local
~~~~~~~~~~~~^
C:\MyDocum\Profiles\Олег\Temp\1.au3(12,36) : ERROR: OnAutoItExit(): undefined function.
OnAutoItExitRegister('OnAutoItExit')
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\MyDocum\Profiles\Олег\Temp\1.au3 - 2 error(s), 0 warning(s)
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Поправил.
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
А если на это окно прилепить чекбокс (без текста, просто квадратик 13*13) то окно теряет фокус если нажать рядом с чекбоксом
 

HukpoFuJl

AццkuЙ HukpoFuJl
Сообщения
98
Репутация
38
Yashied сказал(а):
Вот еще одна плюшка из нового интерфейса "живые" миниатюры.
Код:
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

If Not _WinAPI_DwmIsCompositionEnabled() Then
	MsgBox(16, 'Error', 'Require Windows Vista or above with enabled Aero theme.')
	Exit
EndIf

Global $hWnd, $hForm, $hThumbnail, $tSIZE, $tDestRect, $tSrcRect, $Width, $Height

Run(@SystemDir & '\calc.exe')
$hWnd = WinWaitActive('Calculator', '', 3)
If Not $hWnd Then
	Exit
EndIf

; Create GUI
$hForm = GUICreate('MyGUI', 400, 400)

GUISetBkColor(0)

; Create the "sheet of glass" effect for the entire window. You must call this function whenever DWM composition is toggled.
_WinAPI_DwmExtendFrameIntoClientArea($hForm)

; Create a DWM thumbnail relationship (2:1)
$hThumbnail = _WinAPI_DwmRegisterThumbnail($hForm, $hWnd)
$tSIZE = _WinAPI_DwmQueryThumbnailSourceSize($hThumbnail)
$Width = DllStructGetData($tSIZE, 1)
$Height = DllStructGetData($tSIZE, 2)
$tDestRect = _WinAPI_CreateRectEx((400 - $Width / 2) / 2, (400 - $Height / 2) / 2, $Width / 2, $Height / 2)
$tSrcRect = _WinAPI_CreateRectEx(-20, -20, $Width + 40, $Height + 40)
_WinAPI_DwmUpdateThumbnailProperties($hThumbnail, 1, 0, 255, $tDestRect, $tSrcRect)

GUISetState()

Do
Until GUIGetMsg() = -3
Ничего не происходит, запускается калькулятор, спустя секунду скрипт заканчивает работу без ошибок...

Yashied сказал(а):
sforce5 сказал(а):
Вот ещё адын пример с элементами управления...
Эту функцию можно использовать еще и так:
Код:
#Include <WinAPIEx.au3>

Global Const $DWM_BB_ENABLE = 0x01
Global Const $DWM_BB_BLURREGION = 0x02
Global Const $DWM_BB_TRANSITIONONMAXIMIZED = 0x04

If Not _WinAPI_DwmIsCompositionEnabled() Then
	MsgBox(16, 'Error', 'Require Windows Vista or above with enabled Aero theme.')
	Exit
EndIf

$hForm = GUICreate('MyGUI', 400, 400)

GUISetBkColor(0)

_WinAPI_DwmGetColorizationColor()
If Not @extended Then
	$hRgn = _WinAPI_CreateEllipticRgn(_WinAPI_CreateRectEx(50, 50, 300, 300))
Else
	$hRgn = 0
EndIf
_WinAPI_DwmEnableBlurBehindWindow($hForm, $hRgn, 1, 0, BitOR($DWM_BB_ENABLE, $DWM_BB_BLURREGION))
If $hRgn Then
	_WinAPI_FreeObject($hRgn)
EndIf

GUISetState()

Do
Until GUIGetMsg() = -3

Func _WinAPI_DwmEnableBlurBehindWindow($hWnd, $hRgn, $fEnable, $fTransition, $iFlags)

	Local $tBLURBEHIND = DllStructCreate('dword;ushort;ptr;ushort')

	DllStructSetData($tBLURBEHIND, 1, $iFlags)
	DllStructSetData($tBLURBEHIND, 2, $fEnable)
	DllStructSetData($tBLURBEHIND, 3, $hRgn)
	DllStructSetData($tBLURBEHIND, 4, $fTransition)

	Local $Ret = DllCall('dwmapi.dll', 'uint', 'DwmEnableBlurBehindWindow', 'hwnd', $hWnd, 'ptr', DllStructGetPtr($tBLURBEHIND))

	If @error Then
		Return SetError(1, 0, 0)
	Else
		If $Ret[0] Then
			Return SetError(1, $Ret[0], 0)
		EndIf
	EndIf
	Return 1
EndFunc   ;==>_WinAPI_DwmEnableBlurBehindWindow

Func _WinAPI_DwmGetColorizationColor()

	Local $Ret = DllCall('dwmapi.dll', 'uint', 'DwmGetColorizationColor', 'dword*', 0, 'int*', 0)

	If @error Then
		Return SetError(1, 0, 0)
	Else
		If $Ret[0] Then
			Return SetError(1, $Ret[0], 0)
		EndIf
	EndIf
	Return SetError(0, $Ret[2], $Ret[1])
EndFunc   ;==>_WinAPI_DwmGetColorizationColor

Func _WinAPI_DwmIsCompositionEnabled()

	Local $Ret = DllCall('dwmapi.dll', 'uint', 'DwmIsCompositionEnabled', 'int*', 0)

	If @error Then
		Return SetError(1, 0, 0)
	Else
		If $Ret[0] Then
			Return SetError(1, $Ret[0], 0)
		EndIf
	EndIf
	Return $Ret[1]
EndFunc   ;==>_WinAPI_DwmIsCompositionEnabled
FlatX007, еще про DWM кое-что можно почитать здесь. Получается, что рисовать на "стеклянном" окне не такая уж и тривиальная задача...
Скрипт не выходит запустить:
Код:
C:\Program Files\AutoIt3\temp.au3(22,97) : ERROR: _WinAPI_DwmEnableBlurBehindWindow() called with wrong number of args.
_WinAPI_DwmEnableBlurBehindWindow($hForm, $hRgn, 1, 0, BitOR($DWM_BB_ENABLE, $DWM_BB_BLURREGION))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\Program Files\AutoIt3\Include\WinAPIEx.au3(6464,89) : REF: definition of _WinAPI_DwmEnableBlurBehindWindow().
Func _WinAPI_DwmEnableBlurBehindWindow($hWnd, $fEnable = 1, $fTransition = 0, $hRgn = 0)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\Program Files\AutoIt3\temp.au3(32,86) : ERROR: _WinAPI_DwmEnableBlurBehindWindow() already defined.
Func _WinAPI_DwmEnableBlurBehindWindow($hWnd, $hRgn, $fEnable, $fTransition, $iFlags)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\Program Files\AutoIt3\temp.au3(53,39) : ERROR: _WinAPI_DwmGetColorizationColor() already defined.
Func _WinAPI_DwmGetColorizationColor()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\Program Files\AutoIt3\temp.au3(67,39) : ERROR: _WinAPI_DwmIsCompositionEnabled() already defined.
Func _WinAPI_DwmIsCompositionEnabled()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\Program Files\AutoIt3\temp.au3(24,26) : ERROR: _WinAPI_FreeObject(): undefined function.
	_WinAPI_FreeObject($hRgn)
	~~~~~~~~~~~~~~~~~~~~~~~~^
C:\Program Files\AutoIt3\temp.au3 - 5 error(s), 0 warning(s)

Yashied сказал(а):
FlatX007 сказал(а):
а как быть с GUICtrlCreateEdit ... текст прозрачный
Можно сделать такой трюк (зацени):
Код:
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

Global $hForm, $AlphaKey = 0xABABAB

$hForm = GUICreate('MyGUI', 400, 400, -1, -1, -1, $WS_EX_LAYERED)
GUISetBkColor($AlphaKey)
GUICtrlCreateInput('Simple Text', 20, 20, 360, 19)
GUICtrlCreateEdit('', 20, 47, 360, 200)
GUICtrlCreateButton('OK', 165, 370, 70, 23)

_WinAPI_SetLayeredWindowAttributes($hForm, $AlphaKey, 0, $LWA_COLORKEY)
_WinAPI_DwmExtendFrameIntoClientArea($hForm)

GUISetState()

Do
Until GUIGetMsg() = -3
В следующим примере я добавил Hook на мышь, что бы окно не "простреливалось".
Код:
#Include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)
Opt('WinWaitDelay', 0)

Global Const $WM_NCXBUTTONDOWN = 0x00AB

Global $hForm, $Area, $hDll, $pDll, $hHook, $AlphaKey = 0xABABAB

OnAutoItExitRegister('OnAutoItExit')

$hForm = GUICreate('MyGUI', 400, 400, -1, -1, -1, $WS_EX_LAYERED)
GUISetBkColor($AlphaKey)
$Area = GUICtrlCreateLabel('', 0, 0, 400, 400)
GUICtrlSetBkColor(-1, $AlphaKey)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateInput('Simple Text', 20, 20, 360, 19)
GUICtrlCreateEdit('', 20, 47, 360, 200)
GUICtrlCreateButton('OK', 165, 370, 70, 23)

_WinAPI_SetLayeredWindowAttributes($hForm, $AlphaKey, 0, $LWA_COLORKEY)
_WinAPI_DwmExtendFrameIntoClientArea($hForm)

$hDll = DllCallbackRegister('_MouseHook', 'ptr', 'int;wparam;lparam')
$pDll = DllCallbackGetPtr($hDll)
$hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, $pDll, 0)

GUISetState()

Do
Until GUIGetMsg() = -3

Func _MouseHook($iCode, $wParam, $lParam)
    If $iCode > -1 Then
        Switch $wParam
			Case $WM_LBUTTONDOWN, $WM_MBUTTONDOWN, $WM_RBUTTONDOWN, $WM_XBUTTONDOWN, $WM_NCXBUTTONDOWN

				Local $Data = GUIGetCursorInfo($hForm)

                If (IsArray($Data)) And ($Data[4] = $Area) Then
                    If Not BitAND(WinGetState($hForm), 8) Then
                        WinActivate($hForm)
                    EndIf
                    Return -1
                EndIf
        EndSwitch
    EndIf
    Return _WinAPI_CallNextHookEx($hHook, $iCode, $wParam, $lParam)
EndFunc   ;==>_MouseHook

Func OnAutoItExit()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hDll)
EndFunc   ;==>OnAutoItExit
Во втором примере "простреливается" иконка указателя мыши и контекстное меню правой кнопки мыши :smile:
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
HukpoFuJl сказал(а):
Ничего не происходит, запускается калькулятор, спустя секунду скрипт заканчивает работу без ошибок...

Код:
WinWaitActive('Calculator', '', 3)


У тебя название не "Calculator"... Может "Калькулятор"?
 

HukpoFuJl

AццkuЙ HukpoFuJl
Сообщения
98
Репутация
38
Yashied сказал(а):
HukpoFuJl сказал(а):
Ничего не происходит, запускается калькулятор, спустя секунду скрипт заканчивает работу без ошибок...
Код:
WinWaitActive('Calculator', '', 3)

У тебя название не "Calculator"... Может "Калькулятор"?
Точно, как-то я сразу на это внимания не обратил :smile:
Сделал WinWaitActive('[CLASS:CalcFrame]', '', 3) и всё стало норм =)) классная штучка ;) спасибо

Так же со вторым примером, процитированным мною я тоже разобрался, там вышел конфликт с объявленными функциями и уже имеющимися в библиотеке WinAPIEx.au3. В итоге рабочий код выглядит так:
Код:
#Include <WinAPIEx.au3>

Global Const $DWM_BB_ENABLE = 0x01
Global Const $DWM_BB_BLURREGION = 0x02
Global Const $DWM_BB_TRANSITIONONMAXIMIZED = 0x04

If Not _WinAPI_DwmIsCompositionEnabled() Then
    MsgBox(16, 'Error', 'Require Windows Vista or above with enabled Aero theme.')
    Exit
EndIf

$hForm = GUICreate('MyGUI', 400, 400)

GUISetBkColor(0)

_WinAPI_DwmGetColorizationColor()
If Not @extended Then
    $hRgn = _WinAPI_CreateEllipticRgn(_WinAPI_CreateRectEx(50, 50, 300, 300))
Else
    $hRgn = 0
EndIf
_WinAPI_DwmEnableBlurBehindWindow($hForm, 1, 0, $hRgn)

GUISetState()

Do
Until GUIGetMsg() = -3
 
Верх