2015-03-07 2 views
0

Можно ли получать уведомления об изменениях курсора мыши? Я заинтересован в изменениях, вызванных в моем процессе, но системное уведомление было бы столь же хорошим. Поскольку я использую сторонние библиотеки, может быть несколько причин для изменения курсора.Уведомления о изменениях курсора

В частности, я хотел бы знать, когда курсор становится IDC_HAND. При чтении в Интернете, похоже, для этого не существует ориентированного на уведомление подхода.

Мое текущее решение - проверить, совпадает ли указатель мыши с LoadCursor(nullptr, IDC_HAND). Однако:

  • Может ли это вызвать утечки ресурсов? documentation для LoadCursor указывает, что если ресурс уже существует, тогда ссылка на указанный ресурс возвращается вместо нового ресурса. Поэтому кажется, что я не должен пытаться выпустить ручку.
  • Стоит ли часто выполнять эту проверку, так как LoadCursor будет называться много раз?
  • Должен ли я кэшировать курсор IDC_HAND? Если он не существует, когда я выполняю LoadCursor, когда создается ручной курсор, обязательно ли он будет иметь тот же самый дескриптор? Из моих тестов ответы кажутся «да».

Насколько я могу судить, идеальным сценарием является то, что есть сообщение Windows, указывающее изменение курсора, на каком этапе я мог выполнить проверку дескриптора LoadCursor. Есть ли альтернативы?

Спасибо за ваше время и помощь.

+0

Вы можете использовать [обход] (http://research.microsoft.com/en-us/projects/detours/) для подключения ['SetCursor()'] (https://msdn.microsoft .com/en-us/library/windows/desktop/ms648393.aspx). –

+2

Система загружает IDC_HAND при запуске, поэтому ваш вызов будет просто получать ссылку на существующий курсор. Чтобы получать уведомления при изменении курсора, используйте доступность. Найдите изменения в 'OBJID_CURSOR'. –

+1

Ага, это дубликат [Захват события изменения формы указателя мыши в MFC] (http://stackoverflow.com/questions/10100769/capturing-mouse-pointer-shape-change-event-in-mfc) –

ответ

0

Поздний ответ, извинения. Основа обратной связи Раймонд Чен (спасибо любезно), и его post, насторить крючок для только EVENT_OBJECT_NAMECHANGE события (который срабатывает, когда курсор мыши изменился):

SetWinEventHook(EVENT_OBJECT_NAMECHANGE, EVENT_OBJECT_NAMECHANGE, nullptr, WinEventProc, GetCurrentProcessId(), GetCurrentThreadId(), WINEVENT_INCONTEXT); 

И прислушался к OBJID_CURSOR ID объекту:

void CALLBACK WinEventProc(
    HWINEVENTHOOK hWinEventHook, 
    DWORD   event, 
    HWND   hwnd, 
    LONG   idObject, 
    LONG   idChild, 
    DWORD   dwEventThread, 
    DWORD   dwmsEventTime 
) 
{ 
    if (idObject == OBJID_CURSOR) 
    { 
    ... 
    } 
} 

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

  • Нет связанных вопросов^_^