【问题标题】:VB.Net - Check when user has clicked outside Form but not minimisedVB.Net - 检查用户何时单击表单外部但未最小化
【发布时间】:2013-07-24 11:11:14
【问题描述】:

我正在尝试在 VB.NET 表单中创建一个复制粘贴实用程序,我从任何地方选择文本,将其拖到文本框,然后它会自动以纯文本形式复制到剪贴板。我希望它设置为当窗口打开并单击它时,执行此行:

CopyBox.SelectAll()

但是我尝试过的所有事件都没有奏效。我尝试过使用 MyBase.LostFocus、MyBase.Leave、MyBase.Deactivate,但是当我在表单外单击时,它们都不会被触发。如果我最小化表单,它们就可以工作,但这没有帮助。有没有办法做到这一点?

【问题讨论】:

  • 你试过drag and drop events吗?
  • 我刚刚尝试对文本框使用 .DragOver 和 .DragEnter,但是当我尝试将文本拖入文本框时,它们都没有触发。

标签: vb.net winforms forms events


【解决方案1】:

在鼠标 Keydown 事件中,检查光标相对于表单的位置。如果它在外面,只需执行所需的功能。

根据我的评论

Declare Auto Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Short

While True
  If GetAsyncKeyState(1) <> 0 Then
        MsgBox("click")
  End If
  System.Threading.Thread.Sleep(150) 
End While

【讨论】:

  • 有没有办法在不知道表单的确切边界的情况下指定它,例如"If CursorPosition is OutsideOfForm" 还是我需要使用 x 和 y 坐标以及表单的大小?
  • 您也可以尝试设置表单的 Capture 属性。将此设置为 true ,只要没有其他控件具有焦点,即使鼠标在表单之外,它也会导致该表单接收鼠标事件。我认为 lostfocus 事件会以这种方式触发。
  • 听起来不错,虽然我不太确定该怎么做。我尝试使用 MyBase.MouseDown,但只有当鼠标悬停在表单上时才有效,这会失败。
  • 您可以使用 GetAsyncKeyState 来检测表单外的点击。我用 sn-p 代码编辑了我的回复
  • 再次,好主意,但我不知道如何实现它。我只在 Console 中使用过 GetAsyncKeyState,我不知道如何翻译它或在 Forms 中的何处使用它。
【解决方案2】:

您是否尝试过“表单”本身的 Deactivate 事件而不是文本控件?

【讨论】:

  • 是的。我刚刚又试了一次,很奇怪,它只在Debug中有效。当我放一个断点时,在文本框内单击,然后在表单外单击,事件触发,一切顺利。没有断点,我在文本框内单击,在表单外单击,然后是 nada。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多