vb.net 调用 win7 任务栏进度条、图标、按钮

 

定义com接口

Imports System.Runtime.InteropServices

Namespace Windows7DesktopIntegration

	<StructLayout(LayoutKind.Sequential)> _
	Public Structure RECT
		Public left As Integer
		Public top As Integer
		Public right As Integer
		Public bottom As Integer

		Public Sub New(left As Integer, top As Integer, right As Integer, bottom As Integer)
			Me.left = left
			Me.top = top
			Me.right = right
			Me.bottom = bottom
		End Sub
	End Structure

	Public Enum TBPFLAG
		TBPF_NOPROGRESS = 0
		TBPF_INDETERMINATE = &H1
		TBPF_NORMAL = &H2
		TBPF_ERROR = &H4
		TBPF_PAUSED = &H8
	End Enum

	Public Enum TBATFLAG
		TBATF_USEMDITHUMBNAIL = &H1
		TBATF_USEMDILIVEPREVIEW = &H2
	End Enum

	Public Enum THBMASK
		THB_BITMAP = &H1
		THB_ICON = &H2
		THB_TOOLTIP = &H4
		THB_FLAGS = &H8
	End Enum

	Public Enum THBFLAGS
		THBF_ENABLED = 0
		THBF_DISABLED = &H1
		THBF_DISMISSONCLICK = &H2
		THBF_NOBACKGROUND = &H4
		THBF_HIDDEN = &H8
	End Enum

	<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
	Public Structure THUMBBUTTON
		<MarshalAs(UnmanagedType.U4)> _
		Public dwMask As THBMASK
		Public iId As UInteger
		Public iBitmap As UInteger
		Public hIcon As IntPtr
		<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
		Public szTip As String
		<MarshalAs(UnmanagedType.U4)> _
		Public dwFlags As THBFLAGS
	End Structure

	<ComImportAttribute()> _
	<GuidAttribute("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")> _
	<InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)> _
	Public Interface ITaskbarList3
		' ITaskbarList
		<PreserveSig()> _
		Sub HrInit()
		<PreserveSig()> _
		Sub AddTab(hwnd As IntPtr)
		<PreserveSig()> _
		Sub DeleteTab(hwnd As IntPtr)
		<PreserveSig()> _
		Sub ActivateTab(hwnd As IntPtr)
		<PreserveSig()> _
		Sub SetActiveAlt(hwnd As IntPtr)

		' ITaskbarList2
		<PreserveSig()> _
		Sub MarkFullscreenWindow(hwnd As IntPtr, <MarshalAs(UnmanagedType.Bool)> fFullscreen As Boolean)

		' ITaskbarList3
		Sub SetProgressValue(<[In]()> ByVal hwnd As IntPtr, <[In]()> ByVal ullCompleted As UInt64, <[In]()> ByVal ullTotal As UInt64)
		Sub SetProgressState(<[In]()> ByVal hwnd As IntPtr, <[In]()> ByVal tbpFlags As TBPFLAG)
		Sub RegisterTab(hwndTab As IntPtr, hwndMDI As IntPtr)
		Sub UnregisterTab(hwndTab As IntPtr)
		Sub SetTabOrder(hwndTab As IntPtr, hwndInsertBefore As IntPtr)
		Sub SetTabActive(hwndTab As IntPtr, hwndMDI As IntPtr, tbatFlags As TBATFLAG)
		Sub ThumbBarAddButtons(ByVal hwnd As IntPtr, ByVal cButtons As UInteger, <MarshalAs(UnmanagedType.LPArray)> pButtons As THUMBBUTTON())
		Sub ThumbBarUpdateButtons(hwnd As IntPtr, cButtons As UInteger, <MarshalAs(UnmanagedType.LPArray)> pButtons As THUMBBUTTON())
		Sub ThumbBarSetImageList(hwnd As IntPtr, himl As IntPtr)
		Sub SetOverlayIcon(hwnd As IntPtr, hIcon As IntPtr, <MarshalAs(UnmanagedType.LPWStr)> pszDescription As String)
		Sub SetThumbnailTooltip(hwnd As IntPtr, <MarshalAs(UnmanagedType.LPWStr)> pszTip As String)
		Sub SetThumbnailClip(hwnd As IntPtr, ByRef prcClip As RECT)
	End Interface

	<GuidAttribute("56FDF344-FD6D-11d0-958A-006097C9A090")> _
	<ClassInterfaceAttribute(ClassInterfaceType.None)> _
	<ComImportAttribute()> _
	Public Class CTaskbarList
	End Class

End Namespace

方便调用的类

Imports 工程名.Windows7DesktopIntegration

Public Class Windows7taskbar

	Private Shared ReadOnly [syncLock] As New Object()
	Private Shared w7tb As ITaskbarList3
	Private Shared bInitialize As Boolean = False

	Public Enum Windows7TaskbarState
		NOPROGRESS = TBPFLAG.TBPF_NOPROGRESS
		INDETERMINATE = TBPFLAG.TBPF_INDETERMINATE
		NORMAL = TBPFLAG.TBPF_NORMAL
		[ERROR] = TBPFLAG.TBPF_ERROR
		PAUSED = TBPFLAG.TBPF_PAUSED
	End Enum

	''' <summary>
	''' 初始化Windows7taskbar
	''' </summary>
	''' <remarks></remarks>
	Public Shared Sub Initialization()
		If Not bInitialize Then
			If System.Environment.OSVersion.Version >= New Version(6, 1) Then
				Try
					If w7tb Is Nothing Then
						SyncLock [syncLock]
							w7tb = CType(New CTaskbarList, ITaskbarList3)
						End SyncLock
						bInitialize = True
					End If
				Catch ex As Exception
					bInitialize = False
					addLog(ex.Message)
				End Try
			End If
		End If
	End Sub

	Public Shared Sub SetWindows7Progress(ByVal hwnd As IntPtr, ByVal iNow As Integer, ByVal iMax As Integer)
		If bInitialize Then
			w7tb.SetProgressValue(hwnd, iNow, iMax)
		End If
	End Sub

	Public Shared Sub ResetWindows7Progress(ByVal hwnd As IntPtr)
		If bInitialize Then
			w7tb.SetProgressState(hwnd, TBPFLAG.TBPF_NOPROGRESS)
		End If
	End Sub

	Public Shared Sub SetWindows7ProgressState(ByVal hwnd As IntPtr, ByVal state As Windows7TaskbarState)
		If bInitialize Then
			w7tb.SetProgressState(hwnd, state)
		End If
	End Sub

	Public Shared Sub AddWindows7ThumbBarButtons(ByVal hwnd As IntPtr, ByVal itbL As Integer, ByVal tb() As THUMBBUTTON)
		If bInitialize Then
			w7tb.ThumbBarAddButtons(hwnd, itbL, tb)
		End If
	End Sub

	Public Shared Sub UpdateWindows7ThumbBarButtons(ByVal hwnd As IntPtr, ByVal itbL As Integer, ByVal tb() As THUMBBUTTON)
		If bInitialize Then
			w7tb.ThumbBarUpdateButtons(hwnd, itbL, tb)
		End If
	End Sub

	Public Shared Sub SetWindows7OverlayIcon(ByVal hwnd As IntPtr, ByVal icon As IntPtr, ByVal sText As String)
		If bInitialize Then
			w7tb.SetOverlayIcon(hwnd, icon, sText)
		End If
	End Sub

End Class

部分使用例子

	Public Const WM_COMMAND As Integer = &H111
	Public Const THBN_CLICKED As Integer = &H1800

	Private Sub Form1_HandleCreated(sender As Object, e As EventArgs) Handles MyBase.HandleCreated
		Windows7taskbar.Initialization()
	End Sub

	Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown

		Dim thbButtons(2) As Windows7DesktopIntegration.THUMBBUTTON

		thbButtons(0).dwMask = Windows7DesktopIntegration.THBMASK.THB_FLAGS Or Windows7DesktopIntegration.THBMASK.THB_ICON Or Windows7DesktopIntegration.THBMASK.THB_TOOLTIP
		thbButtons(0).iId = 500
		thbButtons(0).hIcon = My.Resources.play.Handle
		thbButtons(0).szTip = "Go"
		thbButtons(0).dwFlags = Windows7DesktopIntegration.THBFLAGS.THBF_ENABLED

		'略 
	End Sub

	Protected Overrides Sub WndProc(ByRef m As Windows.Forms.Message)
		If m.Msg = WM_COMMAND Then
			Dim wparam As UInt64 = m.WParam.ToInt64
			Dim wparam32 As UInt32 = wparam And &HFFFFFFFFUI
			'Clear top 32 bits
			If (wparam32 >> 16 = THBN_CLICKED) Then
				Dim id As UInteger = wparam32 And &HFFFF
				Select Case id
					Case 500
						ThumbButtonId500()
					Case 501
						ThumbButtonId501()
					Case 502
						ThumbButtonId502()
					Case Else
						Exit Select
				End Select
			End If
		End If
		MyBase.WndProc(m)
	End Sub

	Private Sub ThumbButtonId500()
		If BackgroundWorker1.IsBusy Or BackgroundWorker2.IsBusy Then
			bWaitCancelAsync = False
			Windows7taskbar.SetWindows7ProgressState(Me.Handle, Windows7taskbar.Windows7TaskbarState.NORMAL)
			Windows7taskbar.SetWindows7OverlayIcon(Me.Handle, My.Resources.play2.Handle, "Go")
		End If
	End Sub

	Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
		If 0 = e.ProgressPercentage Then
			Windows7taskbar.SetWindows7ProgressState(Me.Handle, Windows7taskbar.Windows7TaskbarState.INDETERMINATE)
		Else
			Windows7taskbar.SetWindows7ProgressState(Me.Handle, Windows7taskbar.Windows7TaskbarState.NORMAL)
			Windows7taskbar.SetWindows7Progress(Me.Handle, e.ProgressPercentage, 100)
		End If
	End Sub

《vb.net 调用 win7 任务栏进度条、图标、按钮》有2个评分

★★★★★
★★★★
★★★
★★
1
0
0
0
1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注