如here所述,我设法拥有一个可以单击的Windows窗体。
我(对于这个问题,我认为大部分)相关的代码部分如下:
首次导入:
...
Imports System.Runtime.InteropServices
...
然后定义和导入DLL
...
Private InitialStyle As Integer
Dim PercentVisible As Decimal
...
<DllImport("user32.dll", EntryPoint:="GetWindowLong")> Public Shared Function GetWindowLong(ByVal hWnd As IntPtr, ByVal nIndex As Integer) As Integer
End Function
<DllImport("user32.dll", EntryPoint:="SetWindowLong")> Public Shared Function SetWindowLong(ByVal hWnd As IntPtr, ByVal nIndex As Integer, ByVal dwNewLong As Integer) As Integer
End Function
<DllImport("user32.dll", EntryPoint:="SetLayeredWindowAttributes")> Public Shared Function SetLayeredWindowAttributes(ByVal hWnd As IntPtr, ByVal crKey As Integer, ByVal alpha As Byte, ByVal dwFlags As Integer) As Boolean
End Function
...
最后使用它
...
InitialStyle = GetWindowLong(Me.Handle, -20)
PercentVisible = 0.8
SetWindowLong(Me.Handle, -20, InitialStyle Or &H80000 Or &H20)
SetLayeredWindowAttributes(Me.Handle, 0, 255 * PercentVisible, &H2)
...
如前所述,此代码使单击Windows窗体成为可能,因此单击到达位于Windows窗体后面的程序。在我看来,最好将该功能描述为部分或整个显示器的彩色滤光片。
是否可以通过仅通过表格传递左击的方式来修改代码?需要鼠标右键才能打开上下文菜单等。
答案 0 :(得分:0)
如果要接收鼠标事件,则必须像这样从窗口样式中删除&H20
SetWindowLong(Me.Handle, -20, InitialStyle Or &H80000)
但是这可以防止所有鼠标事件在表单中传播。现在,您可以根据需要处理事件。而且,您必须将与鼠标左键单击相关的事件全部传播给其他应用程序。