我需要让我的vb.net应用程序能够在应用程序中收到通知时闪烁/闪烁以吸引用户的注意。
与此图片中的DW图标类似:
我已经谷歌搜索了一段时间并尝试了各种代码示例,但都没有成功。
这是我到目前为止所得到的:
Public Class FlashWindow
Private Declare Function FlashWindow Lib "user32" (ByVal hwnd As Long, ByVal bInvert As Long) As Long
Shared Sub main()
FlashWindow(Me.Handle, 1)
End Sub
End Class
此代码会立即引发以下错误:
'我'仅在实例方法中有效
任何人都可以让我知道我哪里出错或者如何实现这个目标吗?
答案 0 :(得分:9)
首先Me
用于引用当前类。当该代码在Form类中时,它具有属性Handle
。在您的示例中,FlashWindow类没有属性Handle,因此不会编译。
其次我认为你对API函数的定义有点偏。
将此课程添加到您的项目中:
Public Class WindowsApi
Private Declare Function FlashWindowEx Lib "User32" (ByRef fwInfo As FLASHWINFO) As Boolean
' As defined by: http://msdn.microsoft.com/en-us/library/ms679347(v=vs.85).aspx
Public Enum FlashWindowFlags As UInt32
' Stop flashing. The system restores the window to its original state.
FLASHW_STOP = 0
' Flash the window caption.
FLASHW_CAPTION = 1
' Flash the taskbar button.
FLASHW_TRAY = 2
' Flash both the window caption and taskbar button.
' This is equivalent to setting the FLASHW_CAPTION | FLASHW_TRAY flags.
FLASHW_ALL = 3
' Flash continuously, until the FLASHW_STOP flag is set.
FLASHW_TIMER = 4
' Flash continuously until the window comes to the foreground.
FLASHW_TIMERNOFG = 12
End Enum
Public Structure FLASHWINFO
Public cbSize As UInt32
Public hwnd As IntPtr
Public dwFlags As FlashWindowFlags
Public uCount As UInt32
Public dwTimeout As UInt32
End Structure
Public Shared Function FlashWindow(ByRef handle As IntPtr, ByVal FlashTitleBar As Boolean, ByVal FlashTray As Boolean, ByVal FlashCount As Integer) As Boolean
If handle = Nothing Then Return False
Try
Dim fwi As New FLASHWINFO
With fwi
.hwnd = handle
If FlashTitleBar Then .dwFlags = .dwFlags Or FlashWindowFlags.FLASHW_CAPTION
If FlashTray Then .dwFlags = .dwFlags Or FlashWindowFlags.FLASHW_TRAY
.uCount = CUInt(FlashCount)
If FlashCount = 0 Then .dwFlags = .dwFlags Or FlashWindowFlags.FLASHW_TIMERNOFG
.dwTimeout = 0 ' Use the default cursor blink rate.
.cbSize = CUInt(System.Runtime.InteropServices.Marshal.SizeOf(fwi))
End With
Return FlashWindowEx(fwi)
Catch
Return False
End Try
End Function
End Class
然后可以像这样闪烁窗口 - 传递对主申请表的引用:
Dim res = WindowsApi.FlashWindow(Process.GetCurrentProcess().MainWindowHandle, True, True, 5)
注意:
我编辑了此处的代码:http://pinvoke.net/default.aspx/user32.FlashWindowEx
并使用此处定义的定义:Get user attention without stealing focus
这两个可能对你有用的参考
答案 1 :(得分:1)
如果您正在构建Windows窗体应用程序,Me.Handle
将是可行的方法,但这看起来像一个控制台应用程序,在这种情况下尝试使用Process.GetCurrentProcess().MainWindowHandle
而不是Me.Handle。有关详细信息,请参阅this question。