【问题标题】:Open a form with Form.Show: The first mouse click is ignored. Winforms, .Net使用 Form.Show 打开一个表单:第一次鼠标点击被忽略。 Winforms,.Net
【发布时间】:2010-12-15 21:54:05
【问题描述】:

使用下面的代码:

Private Sub ShowDropDown()
    Using f As New DropDownForm
        f.Visible = True
        Do While f.Visible
            Application.DoEvents()
            // Call to not take up 100% resources
        Loop
    End Using
End Sub

如果 ShowDropDown 方法不是由单击按钮调用的,则在 DropDownForm 中的第一次鼠标单击将被忽略。 因此,如果它是在单击 PictureBox 或单击窗体后调用的,则会被忽略。

我可以通过执行以下操作来解决问题:

Private Sub ShowDropDown()
    Using f As New DropDownForm
        f.Visible = True
        Dim capture As IntPtr = GetCapture()
        If (capture <> IntPtr.Zero) Then
            SendMessage(New HandleRef(Nothing, capture), &H1F, IntPtr.Zero, IntPtr.Zero)
            ReleaseCapture()
        End If
        Do While f.Visible
            Application.DoEvents()
        Loop
    End Using
End Sub

这是一个猜测,在查看反射器中的 Form.ShowDialog 方法之后。

我的问题是,我可以进行托管调用来获得相同的结果吗?按钮点击有什么其他点击没有的功能?

ETA:如果我使用键打开表单,则不会出现此问题。

【问题讨论】:

  • 仅供参考 - 您可以使用 Thread.Sleep(0) 作为 Application.DoEvents() 的替代方法来停止 100% CPU... Application.DoEvents() 可能会给您带来您没有的副作用想要。
  • 我不知道哪个更好,但我使用 Application.DoEvents(),然后是 MsgWaitForMultipleObjectsEx(0, IntPtr.Zero, 250, &HFF, 4)。这就是 PropertyGrid 处理它的方式。

标签: .net vb.net winforms forms


【解决方案1】:

是的,鼠标捕获是您的问题。您可以通过将 Control.Capture 属性显式设置为 false 来修复它。例如:

    private void pictureBox1_Click(object sender, EventArgs e) {
        pictureBox1.Capture = false;
        ShowDropDown();
    }

【讨论】:

  • 谢谢你,我怀疑会有更简单的方法。
猜你喜欢
  • 2014-12-12
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多