2009-06-21 90 views
0

我想使用Windows 7任务栏API来设置应用程序图标在任务栏上的重叠图标。从WPF应用程序的Windows 7任务栏SetOverlayIcon不起作用

我已经从微软下载了样本,但是想要提取那段代码,以避免添加对大量代码块的引用,我不会使用大部分代码。

我在Win 7 x64的VS 2010中有一个简单的WPF应用程序。

代码隐藏我的Window1.xaml是这样的:

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 { } 
    } 

当我按一下按钮,没有任何反应。没有错误。图标不会更改。

我想知道我是否将正确的句柄传递给SetOverlayIcon方法。

任何人都知道如何解决这个问题?

回答

3

您的ITaskBarList3接口错误。这里是正确的:

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

我不得不做一些修改,但它解决了我的问题。谢谢。 – MartinHN 2009-06-22 05:51:56

相关问题