【问题标题】:Win32 API AnimateWindow Freezes WinFormWin32 API AnimateWindow 冻结 WinForm
【发布时间】:2015-08-18 02:32:36
【问题描述】:

我在 WinForm 中调用本机 Win32 API。

在我进一步解释之前,我应该解释一下我想要做什么。我正在调用 API 来检索一些数据,然后将其显示在 WinForm 上。但是,我正在尝试复制本机 Toast 通知(但请注意,此时这是一个桌面 exe)。

我可以通过 AnimateWindow 检索数据并将其显示在表单上。

但是我需要显示表单 5 秒。我使用过 Thread.Sleep(5000) 并且我知道这不是显示表单的正确方式。

我还需要在表单上有一个关闭按钮(没有可见的表单边框),只是 PictureBox 中的“X”png。所以我希望在 PictureBox 点击事件上我能够关闭表单。

但是,由于我使用了 Thread.Sleep(5000),我无法点击表单!即使我将鼠标悬停在表单上,​​光标也会切换到等待光标。

有什么方法可以完成关闭按钮吗?

如果需要,我会发布代码。

【问题讨论】:

  • 使用计时器。 Win32中SetTimer是API函数。
  • @JonathanPotter 会让我的表单响应,以便我可以点击“X”图像?
  • 是的,您只需创建一个计时器,然后照常继续。当计时器响起时,您会收到一条消息。

标签: vb.net winforms winapi


【解决方案1】:

您可以在暂停期间使用 Async/Await 和 Task.Delay() 保持表单响应:

Private Async Sub AnimateWindowSub()

    ' ... { animate window call here } ...

    Await Task.Delay(5000)
    Me.Close()
End Sub

Private Sub pb_X_Close_Click(sender As Object, e As EventArgs) Handles pb_X_Close.Click
    Me.Close()
End Sub

Async/Await 组合允许消息泵仍然工作并捕获 PictureBox 点击事件,尽管暂停,然后关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多