Почему SetOverlayIcon иногда вызывает исключение COMException «Неверный дескриптор курсора»? - PullRequest
1 голос
/ 18 июля 2010

В моем приложении C # Winforms я использую интерфейс ITaskbarList3::SetOverlayIcon для установки наложений статуса на кнопке панели задач приложения (под Windows 7).Мне кажется, все это работает нормально, значки отображаются и удаляются правильно.

Из события загрузки формы одна из моих функций делает вызов

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 сообщает , что 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 голосов
/ 18 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...