1

ウィンドウのフォームフェードイン効果を無効にしたい。私は正しい機能を見つけたと思います

<DllImport("dwmapi.dll", PreserveSig:=True)> _
Private Shared Function DwmSetWindowAttribute(ByVal hwnd As IntPtr, ByVal attr As Integer, ByRef attrValue As Integer, ByVal attrSize As Integer) As Integer
End Function

フラグは

DWMWA_TRANSITIONS_FORCEDISABLED

しかし、VB.NETから呼び出す方法がわかりません。これは私がこれまでに持っているものです:

Imports System.Runtime.InteropServices

Public Class Form1

Public Enum DWMWINDOWATTRIBUTE
    DWMWA_ALLOW_NCPAINT = 4
    DWMWA_CAPTION_BUTTON_BOUNDS = 5
    DWMWA_FLIP3D_POLICY = 8
    DWMWA_FORCE_ICONIC_REPRESENTATION = 7
    DWMWA_LAST = 9
    DWMWA_NCRENDERING_ENABLED = 1
    DWMWA_NCRENDERING_POLICY = 2
    DWMWA_NONCLIENT_RTL_LAYOUT = 6
    DWMWA_TRANSITIONS_FORCEDISABLED = 3
End Enum

<DllImport("dwmapi.dll", PreserveSig:=True)> _
Private Shared Function DwmSetWindowAttribute(ByVal hwnd As IntPtr, ByVal attr As Integer, ByRef attrValue As Integer, ByVal attrSize As Integer) As Integer
End Function

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Environment.OSVersion.Version.Major >= 6 Then
        DwmSetWindowAttribute Me.Handle, 'here I don't know how to go on...
    End If
End Sub
End Class

助けてくれてありがとう!

4

3 に答える 3

2

DWMWA_TRANSITIONS_FORCEDISABLED読み取り用のドキュメント:

DwmSetWindowAttributeとともに使用します。DWMトランジションを有効または強制的に無効にします。pvAttributeパラメーターは、遷移を無効にする場合はTRUEの値を指し、遷移を有効にする場合はFALSEの値を指します。

マクロTRUEFALSEは次のように宣言されます。

#define FALSE 0
#define TRUE  1

1したがって、パラメータを渡す必要がありattrValueます。

Windowsがネイティブに使用するブール型はですBOOL。これは次のように宣言されます:

typedef int BOOL;

そして、なので、合格する必要があるsizeof(int)のはです。4attrSize4

于 2012-12-22T11:13:13.387 に答える
1

私のために働くのは

    If Environment.OSVersion.Version.Major >= 6 Then
        DwmSetWindowAttribute(Me.Handle, DWMWINDOWATTRIBUTE.DWMWA_TRANSITIONS_FORCEDISABLED, 1, 4)
    End If

しかし、それは単なる推測です。「1」がYESを表すかどうかはわかりません。また、長さ4がすべての条件下で正しいかどうかもわかりません。これを確認しておくといいでしょう。ありがとうございました!

于 2012-12-22T09:45:38.313 に答える
1

属性値の引数型のため、関数は扱いにくいです。さまざまなサイズの値を受け入れるC関数で一般的なvoid*を使用します。これは実際にはVB.NETで簡単に処理できるものであり、引数に異なるタイプを使用して同じ関数の異なるオーバーロードを記述できます。次に、コンパイラは、渡した引数に基づいて、どちらを呼び出すかを自動的に判断します。

変更する特定の属性に焦点を当てましょう。これはBOOL値です。したがって、ブール値をとる関数のオーバーロードを記述します。これは、ユーザーが支援しなくても自動的にBOOLにマーシャリングされます。

<DllImport("dwmapi.dll")> _
Private Shared Function DwmSetWindowAttribute(ByVal hwnd As IntPtr, _
            ByVal attr As Integer, ByRef attrValue As Boolean, _
            ByVal attrSize As Integer) As Integer
End Function

列挙型を単純化しましょう。必要なのはそのうちの1つだけです。

Private Const DWMWA_TRANSITIONS_FORCEDISABLED As Integer = 3

次に、この関数を呼び出す場所を変更する必要があります。ウィンドウは複数回作成できますが、Loadイベントは1回だけ実行されます。ウィンドウが作成された直後に呼び出す必要があります。実行時の問題を診断できるようにエラー処理を追加します。

Protected Overrides Sub OnHandleCreated(ByVal e As System.EventArgs)
    MyBase.OnHandleCreated(e)
    If Environment.OSVersion.Version.Major >= 6 Then
        Dim hr = DwmSetWindowAttribute(Me.Handle, _
                    DWMWA_TRANSITIONS_FORCEDISABLED, True, 4)
        If hr < 0 Then Marshal.ThrowExceptionForHR(hr)
    End If
End Sub

私がそれをテストしたとき、うまくいきました。

于 2012-12-22T12:26:25.043 に答える