1

FormBorderStyle が None で、フォームにピクチャボックスがドッキングされているウィンドウがあります。したがって、基本的に表示されているのは写真だけです。私は今それを一番上に設定しました。私がやりたいことは、画像のどこかをクリックすると、そのウィンドウのクリックが無視され、その下のウィンドウと対話することです。私はこれがうまくいくと思ってこれをしましたが、うまくいきません。クリックがフォームを表示するのに十分な速さではないか、フォームを閉じるか最小化する必要があると思います。

    Me.Hide()
    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    Me.Show()
4

1 に答える 1

2

Win32 プログラミング モデルでは、説明しているウィンドウの種類を「透明な」ウィンドウと呼びます。

これは、よく混同されるopacityとは異なることに注意してください。透明なウィンドウは、マウス クリックなどのイベントに対して透けて見えますが、それでも不透明な場合があります(つまり、視覚的に透明ではありません)。ヒット テストの透過性と視覚的な透過性の両方を使用することも、1 つだけを使用することも、どちらも使用しないこともできます。

ウィンドウ ヒット テストを透明にするには、ウィンドウの作成時にWS_EX_TRANSPARENT拡張ウィンドウ スタイルを設定する必要があります。

VB.NET からこれを行うには、フォームのCreateParamsプロパティをオーバーライドし、次のようにスタイル フラグを追加します。

Protected Overrides ReadOnly Property CreateParams As CreateParams
    Get
        Const WS_EX_TRANSPARENT As Integer = &H20

        Dim cp As CreateParams = MyBase.CreateParams
        cp.ExStyle = cp.ExStyle Or WS_EX_TRANSPARENT
        Return cp
    End Get
End Property

ウィンドウを透明にすると、あなたが尋ねたように、完全に透明なウィンドウが得られることに注意してください。つまり、非クライアント領域を含め、マウス クリックからは完全に見えなくなります。ユーザーは、左上のクローズ ボックスをクリックすることさえできません。アプリケーションは、プログラムでウィンドウを閉じる必要があります。これを設計で考慮する必要があります。


スタイルのオンとオフを切り替えるには、もう少しコードが必要です。現在のウィンドウ スタイルを取得して設定するには、Win32 関数を P/Invoke する必要があります。例えば:

Imports System
Imports System.Windows.Forms
Imports System.Runtime.InteropServices
' ...etc.

Public Class MyForm : Inherits Form

    ' P/Invoke stuff

    Private Const GWL_EXSTYLE As Integer = -20
    Private Const WS_EX_TRANSPARENT As Integer = &H20

    <DllImport("user32.dll")> _
    Private Shared Function GetWindowLongPtr(hWnd As IntPtr, _
                                             nIndex As Integer) As IntPtr
    End Function

    <DllImport("user32.dll")> _
    Private Shared Function SetWindowLongPtr(hWnd As IntPtr, _
                                            nIndex As Integer, _
                                            dwNewLong As IntPtr) As IntPtr                                                
    End Function

    ' Toggling function
    Public Sub ToggleClickTransparency()
        ' Get the form's current extended window styles.
        Dim exStyle As IntPtr = GetWindowLongPtr(Me.Handle, GWL_EXSTYLE)

        ' Determine if the transparency flag is currently set.
        If (exStyle Or WS_EX_TRANSPARENT) = WS_EX_TRANSPARENT Then
            ' Remove the flag.
            exStyle = exStyle And (Not WS_EX_TRANSPARENT)
        Else
            ' Add the flag.
            exStyle = exStyle Or WS_EX_TRANSPARENT
        End If

        ' Update the window's styles.
        SetWindowLongPtr(Me.Handle, GWL_EXSTYLE, exStyle)
    End Sub

    ' Other code
    ' ...

End Class
于 2013-04-24T03:49:39.177 に答える