Mausklick abfragen, dann klicken oder nicht!

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Morrison.

    Mausklick abfragen, dann klicken oder nicht!

    Hallo!

    Wie ist es möglich entscheiden zu lassen ob ein Mausklick ausgeführt wird oder nicht??

    Quellcode

    1. CType(Browser, System.Windows.Forms.Control).Enabled = False


    Das deaktiviert sämtliche Mauseingaben auf meinem Browser-Control..
    ..ich möchte aber entscheiden ob eine Mausaktion durchgeführt wird oder nicht..wie kann man das machen?!?
    Um das Klicken innerhalb des Browsers auf Flächen zu verhinder?

    Wenn das Abfragen des Browser Klick Events nicht reicht, dann musst du wohl mit WndProc ran, also Windows-Nachrichten abfragen.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    OK, habs fast...

    VB.NET-Quellcode

    1. Private Const WM_LBUTTONDOWN As Integer = &H201
    2. Private Const WM_PARENTNOTIFY As Integer = &H210
    3. Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    4. Select Case m.Msg
    5. Case WM_PARENTNOTIFY
    6. If m.WParam.ToInt32 = WM_LBUTTONDOWN Then
    7. Debug.WriteLine("WM_LBUTTONDOWN")
    8. End If
    9. End Select
    10. MyBase.WndProc(m) 'Message weitergeben
    11. End Sub


    Wo muss denn das "MyBase.WndProc(m)" hin wenn ich den Mausklick nicht weitergeben will???
    Wenn ich das da wegnehme schmeisst er ´ne Exception...

    Oder muss ich da mit "IMessageFilter.PreFilterMessage" beigehen??

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Morrison“ ()

    :/
    So wie das oben steht wirds ja immer weitergeleitet..
    ..und wenn ich das nur unter "Case Else" schreib schmeisst er ne Exeption..und unter "Else" auch..
    ..hach..isch gukke.. :whistling:

    nain! Bekommst nich hin..hab was mit "IMessageFilter.PreFilterMessage" zugefügt! Jetzt wird zumindest der Klick schonmal nichtmehr weitergeleitet..nu muss ich das noch hübsch verschachteln..

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
    2. Select Case m.Msg
    3. Case LButtonDown ', LButtonUp, LButtonDoubleClick
    4. If bPointerClicked = False Then
    5. Return False
    6. Else
    7. Return True
    8. End If
    9. Case Else
    10. Return False
    11. End Select
    12. End Function

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Morrison“ ()

    Habs jetzt so:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Runtime.InteropServices
    3. Public Class Form1
    4. Implements IMessageFilter
    5. Dim htmlDoc As HtmlDocument
    6. Dim scrollY As Integer
    7. Dim scrollX As Integer
    8. Dim oldHTML As HtmlElement
    9. Private Const WM_LBUTTONDOWN As Integer = &H201
    10. Private Const WM_PARENTNOTIFY As Integer = &H210
    11. Private Const LButtonDown As Integer = &H201
    12. Private Const LButtonUp As Integer = &H202
    13. Private Const LButtonDoubleClick As Integer = &H203
    14. Private Sub BackButton_Click(sender As Object, e As System.EventArgs) Handles BackButton.Click
    15. Browser.GoBack()
    16. End Sub
    17. Private Sub ForwardButton_Click(sender As Object, e As System.EventArgs) Handles ForwardButton.Click
    18. Browser.GoForward()
    19. End Sub
    20. Private Sub StopButton_Click(sender As Object, e As System.EventArgs) Handles StopButton.Click
    21. Browser.[Stop]()
    22. End Sub
    23. Private Sub RefershButton_Click(sender As Object, e As System.EventArgs) Handles RefershButton.Click
    24. Browser.Refresh()
    25. End Sub
    26. Private Sub Go_Click(sender As Object, e As System.EventArgs) Handles Go.Click
    27. Browser.Navigate(AddressText.Text)
    28. End Sub
    29. Private Sub MouseMoveHandler(ByVal sender As Object, e As HtmlElementEventArgs)
    30. Dim o As HtmlElement = Browser.Document.GetElementFromPoint(e.ClientMousePosition)
    31. If o Is Nothing Then
    32. Exit Sub
    33. End If
    34. If oldHTML <> o Then
    35. oldHTML = o
    36. Else
    37. Exit Sub
    38. End If
    39. Form2.Refresh()
    40. htmlDoc = Browser.Document
    41. scrollY = htmlDoc.GetElementsByTagName("HTML")(0).ScrollTop
    42. scrollX = htmlDoc.GetElementsByTagName("HTML")(0).ScrollLeft
    43. PropGrid.SelectedObject = Browser.Document.GetElementFromPoint(e.ClientMousePosition)
    44. Dim increment As Integer
    45. Using g As Graphics = Form2.CreateGraphics
    46. If Me.WindowState = FormWindowState.Maximized Then
    47. increment = SystemInformation.ToolWindowCaptionHeight + SplitContainer1.SplitterDistance + (SplitContainer1.SplitterIncrement * 6)
    48. Else
    49. increment = SplitContainer1.SplitterDistance + (SplitContainer1.SplitterIncrement * 3)
    50. End If
    51. g.DrawRectangle(Pens.Red, GetLeft(o) - scrollX, GetTop(o) + increment - scrollY, o.ClientRectangle.Width, o.ClientRectangle.Height)
    52. End Using
    53. End Sub
    54. Private Function GetTop(ByVal element As HtmlElement) As Integer
    55. Dim value As Integer
    56. Do While Not element.OffsetParent Is Nothing
    57. value += element.OffsetRectangle.Top
    58. element = element.OffsetParent
    59. Loop
    60. Return value
    61. End Function
    62. Private Function GetLeft(ByVal element As HtmlElement) As Integer
    63. Dim value As Integer
    64. Do While Not element.OffsetParent Is Nothing
    65. value += element.OffsetRectangle.Left
    66. element = element.OffsetParent
    67. Loop
    68. Return value
    69. End Function
    70. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    71. AddressText.Text = "www.google.de"
    72. Browser.Navigate(AddressText.Text)
    73. While Browser.ReadyState <> WebBrowserReadyState.Complete
    74. Application.DoEvents()
    75. End While
    76. AddHandler Browser.Document.MouseMove, AddressOf MouseMoveHandler
    77. Browser.Document.Window.AttachEventHandler("onscroll", AddressOf htmlScroll)
    78. MoveForm2()
    79. Form2.Show(Me)
    80. Application.AddMessageFilter(Me)
    81. End Sub
    82. Private Sub MoveForm2()
    83. Dim crpos As Point = Me.PointToClient(Me.DesktopLocation)
    84. With Form2
    85. .WindowState = Me.WindowState
    86. .Size = Me.ClientSize
    87. .DesktopLocation = New Point(Me.DesktopLocation.X - crpos.X, Me.DesktopLocation.Y - crpos.Y)
    88. End With
    89. End Sub
    90. Private Sub Form1_Resize(sender As Object, e As EventArgs) Handles MyBase.Resize, MyBase.Move, MyBase.Shown
    91. SplitContainer1.SplitterDistance = 32
    92. MoveForm2()
    93. End Sub
    94. Private Sub htmlScroll(sender As Object, e As EventArgs)
    95. Form2.Refresh()
    96. End Sub
    97. Dim bPointerClicked As Boolean = False
    98. Private Sub Pointer_Click(sender As Object, e As EventArgs) Handles bPointer.Click
    99. If bPointerClicked = False Then
    100. bPointer.FlatStyle = FlatStyle.Flat
    101. bPointerClicked = True
    102. Else
    103. bPointer.FlatStyle = FlatStyle.Standard
    104. bPointerClicked = False
    105. End If
    106. End Sub
    107. Public Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
    108. Select Case m.Msg
    109. Case LButtonDown, LButtonUp, LButtonDoubleClick
    110. If bPointerClicked = False Then
    111. Return False
    112. Else
    113. Dim ctl As Control = FindControlAtCursor(Me)
    114. If ctl IsNot Nothing Then
    115. If ctl.Name = "bPointer" Then
    116. bPointer.FlatStyle = FlatStyle.Standard
    117. bPointerClicked = False
    118. End If
    119. End If
    120. Return True
    121. End If
    122. Case Else
    123. Return False
    124. End Select
    125. End Function
    126. Public Shared Function FindControlAtPoint(container As Control, pos As Point) As Control
    127. Dim child As Control
    128. For Each c As Control In container.Controls
    129. If c.Visible AndAlso c.Bounds.Contains(pos) Then
    130. child = FindControlAtPoint(c, New Point(pos.X - c.Left, pos.Y - c.Top))
    131. If child Is Nothing Then
    132. Return c
    133. Else
    134. Return child
    135. End If
    136. End If
    137. Next
    138. Return Nothing
    139. End Function
    140. Public Shared Function FindControlAtCursor(form As Form) As Control
    141. Dim pos As Point = Cursor.Position
    142. If form.Bounds.Contains(pos) Then
    143. Return FindControlAtPoint(form, form.PointToClient(Cursor.Position))
    144. End If
    145. Return Nothing
    146. End Function
    147. Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
    148. Application.RemoveMessageFilter(Me)
    149. End Sub
    150. End Class
    151. Public Class Form2
    152. <DllImport("user32.dll", EntryPoint:="GetWindowLong")> Public Shared Function GetWindowLong(ByVal hWnd As IntPtr, ByVal nIndex As Integer) As Integer
    153. End Function
    154. <DllImport("user32.dll", EntryPoint:="SetWindowLong")> Public Shared Function SetWindowLong(ByVal hWnd As IntPtr, ByVal nIndex As Integer, ByVal dwNewLong As Integer) As Integer
    155. End Function
    156. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    157. Me.BackColor = Color.Pink
    158. Me.TransparencyKey = Color.Pink
    159. Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    160. Dim InitialStyle As Integer
    161. InitialStyle = GetWindowLong(Me.Handle, -20)
    162. SetWindowLong(Me.Handle, -20, InitialStyle Or &H80000 Or &H20) 'Makes the window "click-throughable"
    163. Me.Size = New Size(Form1.Browser.Width, Form1.Browser.Height)
    164. Me.ShowInTaskbar = False
    165. End Sub
    166. End Class


    Zeile 124 !!

    ..und weiter..huh :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Morrison“ ()

    Forum-Bug!

    Iss immer so wenn ich was einfüge sind da immer Leerzeilen zwischen..manchmal bearbeite ich das nochmal aber nu habbich einfach C&P!

    K, habs jetzt mitm Notepad geöffnet und C&P! Nu siehts bissl besser aus! :rolleyes:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Morrison“ ()