Sammy VSP Ответов: 1

Как сделать форму с эффектом размытия в windows 10


Этот код получен из Добавление размытия "Aero Glass" в ваши приложения Windows 10.
Я преобразовал этот код в vb.net но не работает на меня. Это полный код
Imports System.Runtime.InteropServices
Imports System.Windows.Interop
Friend Enum AccentState
    ACCENT_DISABLED = 0
    ACCENT_ENABLE_GRADIENT = 1
    ACCENT_ENABLE_TRANSPARENTGRADIENT = 2
    ACCENT_ENABLE_BLURBEHIND = 3
    ACCENT_INVALID_STATE = 4
End Enum

<StructLayout(LayoutKind.Sequential)>
Friend Structure AccentPolicy
    Public AccentState As AccentState
    Public AccentFlags As Integer
    Public GradientColor As Integer
    Public AnimationId As Integer
End Structure

<StructLayout(LayoutKind.Sequential)>
Friend Structure WindowCompositionAttributeData
    Public Attribute As WindowCompositionAttribute
    Public Data As IntPtr
    Public SizeOfData As Integer
End Structure

Friend Enum WindowCompositionAttribute
    ' ...
    WCA_ACCENT_POLICY = 19
    ' ...
End Enum
Public Class BlurBehindTest
    <DllImport("user32.dll")>
    Friend Shared Function SetWindowCompositionAttribute(ByVal hwnd As IntPtr, ByRef data As WindowCompositionAttributeData) As Integer
    End Function
    Friend Sub EnableBlur()
        Dim windowHelper = New Form 'WindowInteropHelper(Me) < This code only working on WPF app, so i've changed to Form

        Dim accent = New AccentPolicy()
        accent.AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND

        Dim accentStructSize = Marshal.SizeOf(accent)

        Dim accentPtr = Marshal.AllocHGlobal(accentStructSize)
        Marshal.StructureToPtr(accent, accentPtr, False)

        Dim data = New WindowCompositionAttributeData()
        data.Attribute = WindowCompositionAttribute.WCA_ACCENT_POLICY
        data.SizeOfData = accentStructSize
        data.Data = accentPtr

        SetWindowCompositionAttribute(windowHelper.Handle, data)

        Marshal.FreeHGlobal(accentPtr)
    End Sub
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        EnableBlur()
    End Sub
End Class


Что я уже пробовал:

Можно ли объединить форму WPF с формой Windows?
Если вы не можете, пожалуйста, поделитесь своими знаниями о WindowCompositionAttribute

Спасибо за аванс, Сэмми

1 Ответов

Рейтинг:
0

Richard Deeming

Цитата:

Dim windowHelper = New Form 'WindowInteropHelper(Me) < This code only working on WPF app, so i've changed to Form

Путем замены New WindowInteropHelper(Me) с New Form- вы изменили значение кода. Теперь эффект размытия будет применен к этой новой форме, которая никогда не отображается, а не к текущей форме.

Удалите эту строку и передайте текущую форму Handle к SetWindowCompositionAttribute метод:
SetWindowCompositionAttribute(Me.Handle, data)


Sammy VSP

Ты прав, но моя форма не стабильна. Вы уже проверили свой код?