深夜の星空観察用のプログラムを作成しようとしています。ラップトップの画面を赤だけにする必要があるため、赤のフィルターとして機能するプログラムを作成したいと考えています。画面全体を覆い、透明+赤になります。ユーザーはそれをクリックすることができます。これは、透明な赤いプラスチックを画面の前に置くようなものです。
これまでのところ、画面サイズに合わせてサイズを変更し、左上隅に移動するフォームがあります。少し透明で赤いです。
最終的にフォームを透明で赤くするため、フォームのすべてのクリックを通過させる必要がありますが、ユーザーがフォームを操作できないようにしたくありません。
プログラムは「Red_Filter」と呼ばれます
Public Class Form1
Dim Screens As Array
Dim TotalWidth As Integer
Dim TotalHeight As Integer
Dim Heights As List(Of Integer) = New List(Of Integer)
'Load / Close
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Screens = Screen.AllScreens
For I As Integer = 0 To UBound(Screens)
TotalWidth += Screens(I).Bounds.Width
Heights.Add(Screens(I).Bounds.Height)
Next
TotalHeight = Heights.Max()
Me.Width = TotalWidth
Me.Height = TotalWidth
Me.Location = New Point(0, 0)
Me.BackColor = Color.Red
Me.Opacity = 0.5
Me.TopMost = True
'Make it click through
SetWindowLong(Me.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT)
End Sub
'Click Through Functionality
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Const GWL_EXSTYLE = -20
Const WS_EX_TRANSPARENT = &H20
End Class
これは私がこれまでに持っていたもので、オンラインで見つけた「クリックスルー機能」の後の部分ですが、次のエラーが表示されます。
A call to PInvoke function 'Red Filter!Red_Filter.Form1::SetWindowLong' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.
オンラインで見つけたコードがどのように機能するかはわかりませんが、フォームのロード イベントの最後の行でエラーが発生します。
フォームをクリックスルーにする方法を知っている人はいますか?