为什么SetOverlayIcon偶尔抛出'无效的游标句柄'COMException?

时间:2010-07-18 15:50:38

标签: c# .net windows-7

在我的C#Winforms应用程序中,我使用ITaskbarList3::SetOverlayIcon界面在应用程序的任务栏按钮(在Windows 7下)设置状态覆盖。这一切似乎对我来说都很好,图标被正确显示和删除。

从表单加载事件中,我的一个函数进行调用

SetOverlayIcon(parentForm.Handle, IntPtr.Zero, String.Empty)

(其中parentForm是load事件触发的形式),偶尔(在其他人的机器上)抛出以下异常:

System.Runtime.InteropServices.COMException (0x8007057A): Invalid cursor handle. (Exception from HRESULT: 0x8007057A)
   at MyNamespace.TaskbarNotify.ITaskbarList3.SetOverlayIcon(IntPtr hwnd, IntPtr hIcon, String pszDescription)

在大约一千个用户(各种Windows版本)的用户群中,这已经在几个月内报告了大约100次。

我知道IntPtr.Zero不是有效的游标句柄,但是MSDN says NULL是要传递给hIcon的有效值。有关Windows告诉我的任何建议吗?

我正在使用.NET 2以防万一。

以下是我在ITaskbarList3应用程序中使用的定义:

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF")]
public interface ITaskbarList3
{
    void HrInit();
    void AddTab(IntPtr hwnd);
    void DeleteTab(IntPtr hwnd);
    void ActivateTab(IntPtr hwnd);
    void SetActivateAlt(IntPtr hwnd);
    void MarkFullscreenWindow(IntPtr hwnd, bool fFullscreen);
    void SetProgressValue(IntPtr hwnd, ulong ullCompleted, ulong ullTotal);
    void SetProgressState(IntPtr hwnd, TBPFLAG tbpFlags);
    void RegisterTab(IntPtr hwndTab, IntPtr hwndMDI);
    void UnregisterTab(IntPtr hwndTab);
    void SetTabOrder(IntPtr hwndTab, int hwndInsertBefore);
    void SetTabActive(IntPtr hwndTab, int hwndMDI, TBATFLAG tbatFlags);
    void ThumbBarAddButtons(IntPtr hwnd, uint cButtons, THUMBBUTTON[] pButton);
    void ThumbBarUpdateButtons(IntPtr hwnd, uint cButtons, THUMBBUTTON[] pButton);
    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, NativeMethods.RECT prcClip);
}

1 个答案:

答案 0 :(得分:0)

您应该使用Windows API Code Pack,它可以为您处理所有这些。