2010-07-18 2 views
0

В моем приложении C# Winforms я использую интерфейс ITaskbarList3::SetOverlayIcon для установки оверлей состояния на панели задач приложения (под Windows 7). Кажется, что все это отлично работает для меня, при этом значки отображаются и удаляются правильно.Почему SetOverlayIcon иногда выдает «Invalid cursor handle» 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

Как выглядит ваша подпись? –

+0

@MathiasLykkegaardLorenzen Я обновил свой вопрос, чтобы включить подпись ITaskbarList3, которую я использую. – ribbons

ответ

0

Вы должны использовать Windows API Code Pack, который обрабатывает все это для вас.

+0

Мое приложение лицензировано GPL, поэтому я не могу/не хотел бы включать Windows Code Code Pack. Кроме того, пакет кода вызывает тот же метод с теми же аргументами, что и я, и не добавляет дополнительной обработки исключений, поэтому я ожидаю увидеть те же результаты. – ribbons

Смежные вопросы