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