【问题标题】:Can I set a taskbar progress state on a dialog box rather than my main form?我可以在对话框而不是主窗体上设置任务栏进度状态吗?
【发布时间】:2016-05-26 15:42:44
【问题描述】:

在我的 VB.Net 应用程序中,我有以下代码,它允许我将应用程序的任务栏图标用作进度条。

Public Sub setTaskbarProgress(ByVal upTo As Integer, ByVal outOfTotal As Integer, ByVal stateType As TaskbarProgressBarState)
If TaskbarManager.IsPlatformSupported Then
        If stateType = Nothing Then stateType = TaskbarProgressBarState.Normal
        Dim tbm As TaskbarManager = TaskbarManager.Instance
        tbm.SetProgressValue(upTo, outOfTotal)
        If upTo = 0 And outOfTotal = 100 Then
            tbm.SetProgressState(TaskbarProgressBarState.NoProgress)
        Else
            tbm.SetProgressState(stateType)
        End If
    End If
End Sub

我想扩展那个函数,理想情况下它有第四个参数,例如

Public Sub setTaskbarProgress(ByVal upTo As Integer,
ByVal outOfTotal As Integer, ByVal stateType As TaskbarProgressBarState, _
ByRef target As Form)

以便进度条(Taskbar.SetProgressValue 和 TaskBar.SetProgressState)应用于我项目中的特定子表单或对话框,而不是始终应用​​于主表单。

有没有一种方法可以指定“TaskbarManager”实际应用到哪个窗口?我看不出我将如何喂它一个“目标”? Windows 允许这样做吗?欢迎任何积分。

【问题讨论】:

  • 只要对话框有句柄(它有)和任务栏存在(可能有,但没有),我认为 Windows 不在乎。
  • 谢谢,这是个好消息。对话框具有属性 ShowInTaskbar=True 并且它确实有自己的任务栏存在。但是如何将相关对话框的句柄提供给 TaskbarManager?我错过了一些东西。
  • 您在使用 WindowsAPICodePack 吗?
  • 为非常迟缓的反应道歉,出现了一些躁狂症。是的,我使用的是 Microsoft 标准的 WindowsAPICodePack。 @RoyalPotato
  • "yourDialogBox.Handle" 应该是框的句柄。继承自“Control.Handle”。 msdn.microsoft.com/en-us/library/…

标签: vb.net taskbar


【解决方案1】:

好吧,无论如何,是的,您可以这样做,但是您提供的代码缺乏必要的细节,说明谁以及如何包装它以了解它的行为,因为如果您拥有完全访问权限,那就不一样了源代码进行任何必要的修改,不清楚是官方WindowsAPICodePack C#代码的VB.NET翻译,还是其他人自定义的包装器。

无论如何,您可以拥有的代码,特别是 TaskbarManager.Instance 成员应该实现 ITaskbarList 接口之一,可能是 ITaskbarList4(全部),并且这意味着您应该能够重新设计包装器以调用 ITaskbarList::SetProgressValue 方法并传递对话框的目标窗口句柄。

如果由于某种原因您可能需要 ITaskbarList 定义,我之前将其翻译为 VB.NET(忽略了一些我不想使用的名为“Fake”的方法)

    ''' <remarks>
    ''' <see href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd562040(v=vs.85).aspx"/>
    ''' </remarks>
    <ComImport>
    <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
    <Guid("C43DC798-95D1-4BEA-9030-BB99E2983A1A")>
    Public Interface ITaskbarList4

#Region " ITaskbarList "

        <PreserveSig>
        Sub HrInit()

        <PreserveSig>
        Sub AddTab(ByVal hwnd As IntPtr)

        <PreserveSig>
        Sub DeleteTab(ByVal hwnd As IntPtr)

        <PreserveSig>
        Sub ActivateTab(ByVal hwnd As IntPtr)

        <PreserveSig>
        Sub SetActiveAlt(ByVal hwnd As IntPtr)

#End Region

#Region " ITaskbarList2 "

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

#End Region

#Region " ITaskbarList3 "

        <PreserveSig>
        Sub SetProgressValue(ByVal hwnd As IntPtr, ByVal ullCompleted As UInt64, ByVal ullTotal As UInt64)

        <PreserveSig>
        Sub SetProgressState(ByVal hwnd As IntPtr, ByVal tbpFlags As TaskbarProgressBarState)

        <PreserveSig>
        Sub RegisterTab(ByVal hwndTab As IntPtr, ByVal hwndMdi As IntPtr)

        <PreserveSig>
        Sub UnregisterTab(ByVal hwndTab As IntPtr)

        <PreserveSig>
        Sub SetTabOrder(ByVal hwndTab As IntPtr, ByVal hwndInsertBefore As IntPtr)

        <PreserveSig>
        Sub SetTabActive(ByVal hwndTab As IntPtr, ByVal hwndInsertBefore As IntPtr, ByVal dwReserved As UInteger)

        <PreserveSig>
        Function Fake1() As HResult
        ' Function ThumbBarAddButtons(byval hwnd As IntPtr, byval cButtons As UInteger, <MarshalAs(UnmanagedType.LPArray)> byval pButtons As ThumbButton()) As HResult

        <PreserveSig>
        Function Fake2() As HResult
        ' Function ThumbBarUpdateButtons(byval hwnd As IntPtr, byval cButtons As UInteger, <MarshalAs(UnmanagedType.LPArray)> byval pButtons As ThumbButton()) As HResult

        <PreserveSig>
        Sub Fake3()
        ' Sub ThumbBarSetImageList(byval hwnd As IntPtr, byval himl As IntPtr)

        <PreserveSig>
        Sub SetOverlayIcon(ByVal hwnd As IntPtr, ByVal hIcon As IntPtr, <MarshalAs(UnmanagedType.LPWStr)> ByVal pszDescription As String)

        <PreserveSig>
        Sub SetThumbnailTooltip(ByVal hwnd As IntPtr, <MarshalAs(UnmanagedType.LPWStr)> ByVal pszTip As String)

        <PreserveSig>
        Sub SetThumbnailClip(ByVal hwnd As IntPtr, ByVal prcClip As IntPtr)

#End Region

#Region " ITaskbarList4 "

        Sub Fake4()
        ' Sub SetTabProperties(byval hwndTab As IntPtr, byval stpFlags As SetTabPropertiesOption)

#End Region

    End Interface

另外这个枚举:

''' <remarks>
''' <see href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd391697%28v=vs.85%29.aspx"/>
''' </remarks>
Public Enum TaskbarProgressBarState
    NoProgress = 0
    Indeterminate = &H1
    Normal = &H2
    [Error] = &H4
    Paused = &H8
End Enum

【讨论】:

  • “不清楚这是官方WindowsAPICodePack C#代码的VB.NET翻译”还是他使用的是二进制形式的代码包。引用 .dll。
  • 我只是在引用 DLL,我没有进入“幕后”或使用第三方包装器。如果我没记错的话,我刚刚从这里下载了包:[link]nuget.org/packages/WindowsAPICodePack-Core[/link]@ElektroStudios
猜你喜欢
  • 2017-01-27
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 2011-07-12
相关资源
最近更新 更多