2009-06-21 4 views
0

J'essaie d'utiliser l'API Windows 7 Taskbar pour définir l'icône de surimpression de l'icône de l'application dans la barre des tâches. J'ai téléchargé les échantillons de Microsoft, mais je voulais extraire ce morceau de code pour éviter d'ajouter une référence à une énorme brique de code que je n'utiliserai pas.Windows 7 Barre des tâches SetOverlayIcon à partir de l'application WPF ne fonctionne pas

J'ai une application simple WPF dans VS 2010 sur Windows 7 x64.

code-behind pour mon Window1.xaml est comme ceci:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.Runtime.InteropServices; 
using System.Drawing; 
using System.Windows.Interop; 

namespace WpfApplication1 
{ 
/// <summary> 
/// Interaction logic for Window1.xaml 
/// </summary> 
public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private static ITaskbarList3 _taskbarList; 
    internal static ITaskbarList3 TaskbarList 
    { 
     get 
     { 
      if (_taskbarList == null) 
      { 
       if (_taskbarList == null) 
       { 
        _taskbarList = (ITaskbarList3)new CTaskbarList(); 
        _taskbarList.HrInit(); 
       } 
      } 
      return _taskbarList; 
     } 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     TaskbarList.SetOverlayIcon(new WindowInteropHelper(Application.Current.MainWindow).Handle, SystemIcons.Question.Handle, "Test"); 
    } 
} 

[ComImportAttribute()] 
[GuidAttribute("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")] 
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] 
internal interface ITaskbarList3 
{ 
    // ITaskbarList 
    [PreserveSig] 
    void HrInit(); 
    [PreserveSig] 
    void AddTab(IntPtr hwnd); 
    [PreserveSig] 
    void DeleteTab(IntPtr hwnd); 
    [PreserveSig] 
    void ActivateTab(IntPtr hwnd); 
    [PreserveSig] 
    void SetActiveAlt(IntPtr hwnd); 

    void SetOverlayIcon(
     IntPtr hwnd, 
     IntPtr hIcon, 
     [MarshalAs(UnmanagedType.LPWStr)] string pszDescription); 
} 

[GuidAttribute("56FDF344-FD6D-11d0-958A-006097C9A090")] 
[ClassInterfaceAttribute(ClassInterfaceType.None)] 
[ComImportAttribute()] 
internal class CTaskbarList { } 
    } 

Lorsque je clique sur le bouton, rien ne se passe. Pas d'erreur. L'icône ne change pas.

Je me demande si je passe la poignée correcte à la méthode SetOverlayIcon.

Quelqu'un sait-il comment résoudre ce problème?

Répondre

3

Votre interface ITaskBarList3 est incorrecte. Voici la bonne:

public enum TBPF 
{ 
    TBPF_NOPROGRESS = 0, 
    TBPF_INDETERMINATE = 0x1, 
    TBPF_NORMAL = 0x2, 
    TBPF_ERROR = 0x4, 
    TBPF_PAUSED = 0x8 
} 

public enum TBATF 
{ 
    TBATF_USEMDITHUMBNAIL = 0x1, 
    TBATF_USEMDILIVEPREVIEW = 0x2 
} 

public enum THB : uint 
{ 
    THB_BITMAP = 0x1, 
    THB_ICON = 0x2, 
    THB_TOOLTIP = 0x4, 
    THB_FLAGS = 0x8 
} 

public enum THBF : uint 
{ 
    THBF_ENABLED = 0, 
    THBF_DISABLED = 0x1, 
    THBF_DISMISSONCLICK = 0x2, 
    THBF_NOBACKGROUND = 0x4, 
    THBF_HIDDEN = 0x8 
} 

[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Auto)] 
public struct THUMBBUTTON 
{ 
    public THB dwMask; 
    public uint iId; 
    public uint iBitmap; 
    public IntPtr hIcon; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = Windows.MAX_PATH)] 
    public string szTip; 
    public THBF dwFlags; 
} 

[ComImport] 
[Guid("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
public interface ITaskbarList3 
{ 
    // ITaskbarList 
    void HrInit(); 
    void AddTab(IntPtr hwnd); 
    void DeleteTab(IntPtr hwnd); 
    void ActivateTab(IntPtr hwnd); 
    void SetActiveAlt(IntPtr hwnd); 

    // ITaskbarList2 
    void MarkFullscreenWindow(
     IntPtr hwnd, 
     [MarshalAs(UnmanagedType.Bool)] bool fFullscreen); 

    // ITaskbarList3 
    void SetProgressValue(IntPtr hwnd, ulong ullCompleted, ulong ullTotal); 
    void SetProgressState(IntPtr hwnd, TBPF tbpFlags); 
    void RegisterTab(IntPtr hwndTab, IntPtr hwndMDI); 
    void UnregisterTab(IntPtr hwndTab); 
    void SetTabOrder(IntPtr hwndTab, IntPtr hwndInsertBefore); 
    void SetTabActive(IntPtr hwndTab, IntPtr hwndMDI, TBATF tbatFlags); 

    void ThumbBarAddButtons(
     IntPtr hwnd, 
     uint cButtons, 
     [MarshalAs(UnmanagedType.LPArray)] THUMBBUTTON[] pButtons); 

    void ThumbBarUpdateButtons(
     IntPtr hwnd, 
     uint cButtons, 
     [MarshalAs(UnmanagedType.LPArray)] THUMBBUTTON[] pButtons); 

    void ThumbBarSetImageList(IntPtr hwnd, IntPtr himl); 

    void SetOverlayIcon(
     IntPtr hwnd, 
     IntPtr hIcon, 
     [MarshalAs(UnmanagedType.LPWStr)] string pszDescription); 

    void SetThumbnailTooltip(
     IntPtr hwnd, 
     [MarshalAs(UnmanagedType.LPWStr)] string pszTip); 

    void SetThumbnailClip(
     IntPtr hwnd, 
     [MarshalAs(UnmanagedType.LPStruct)] Rectangle prcClip); 
} 
+0

J'ai dû faire quelques modifications, mais cela a résolu mon problème. Merci. – MartinHN

+0

Quelles modifications que vous avez fait? Il est intéressant de moi, parce que j'utilise ce code par moi-même (mais je l'utilise surtout pour la barre des tâches barre de progression). Je ne peux voir qu'un seul endroit douteux - les méthodes avec THUMBBUTTON. – arbiter