2010-07-18 62 views
0

在我的C#Winforms應用程序中,我使用ITaskbarList3::SetOverlayIcon界面在應用程序的任務欄按鈕(Windows 7下)上設置狀態疊加層。這一切似乎爲我工作得很好,圖標正確顯示和刪除。爲什麼SetOverlayIcon偶爾會拋出一個'無效光標句柄'COMException?

從形式加載事件,我的一個功能,使通話

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

(其中parentForm是負載事件爲觸發的形式),這很偶然的(在別人的機器)拋出以下例外:

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); 
} 
+0

你的簽名是什麼樣的? – 2012-08-13 11:00:26

+0

@MathiasLykkegaardLorenzen我已經更新了我的問題,以包含我正在使用的ITaskbarList3簽名。 – ribbons 2012-08-22 18:42:31

回答

0

您應該使用Windows API Code Pack,負責處理所有的這個要求。

+0

我的應用程序是GPL許可的,所以我不能/不希望包含Windows API代碼包。此外,代碼包使用與我傳遞的參數相同的參數調用相同的方法,並且不添加任何額外的異常處理,所以我期望看到相同的結果。 – ribbons 2010-07-18 16:20:44

相關問題