Что может сбросить форму курсора кроме SetCursor? - PullRequest
0 голосов
/ 26 января 2012

Я поддерживаю приложение C ++, которое использует flash ocx для воспроизведения SWF-файла.

Когда пользователь нажимает на кнопку в SWF, внутренняя вспышка вызывает функцию WinAPI SetCursor для установки курсора IDC_HAND - я вижу, что когда я наблюдаю, как WinAPI вызывает функцию, связанную с курсором, через API Monitor V2 (rohitab.com) . Однако в моем случае курсор не меняется, то есть остается IDC_ARROW.

Само приложение вообще не вызывает SetCursor. Окно приложения обрабатывает сообщение WM_SETCURSOR следующим образом, т.е. не восстанавливает курсор:

case WM_SETCURSOR:
    {   
        static bool restoreCursor = false;
        if (LOWORD(lParam) != HTCLIENT)
        {
            restoreCursor = true;
        }

        if (restoreCursor)
        {
            restoreCursor = false;
            // DefWindowProc will set the cursor
            break;
        }
        return 1;
    }

Может кто-нибудь сообщить мне, кто может сбросить / изменить форму курсора в этом случае?

Обновление : Интересной является тот факт, что у меня есть 2 аналогичные установки, которые дают противоположные результаты.

Приложение, которое я поддерживаю, на самом деле устанавливает WH_GETMESSAGE хук на «SysListView32» и запускает поток, который создает Flash player. Таким образом, установка не так проста.

Однако, если я просто создам простой пример, который создает проигрыватель на основном winmain, то приведенный выше код работает отлично, и курсор меняется.

Так что, похоже, что-то сбрасывает состояние курсора в первом случае. Как узнать что сбрасывает курсор ?

Ответы [ 2 ]

1 голос
/ 26 января 2012

Ваше окно (родитель) получает трещину при переопределении курсора и возврате ИСТИНЫ (1), указывающего, что вы обработали его, и прекращает дальнейшую обработку.Стрелка, вероятно, исходит от вашей регистрации в WNDCLASS или от DefWindowProc.

Итак, мне кажется, что вы хотите вернуть FALSE, чтобы позволить дочерней кнопке получить трещину при фактической установке курсора.Или вообще удалите вручение WM_SETCURSOR.

0 голосов
/ 29 февраля 2012

ОК, реальный ответ на этот вопрос заключается в том, что не-GUI-поток не может изменить курсор напрямую. Смотрите комментарии внизу страницы http://msdn.microsoft.com/en-us/library/windows/desktop/ms648393%28v=vs.85%29.aspx

Другим решением может быть обход / подключение функции SetCursor к нашей, которая просто отправляет пользовательское сообщение в поток графического интерфейса, сигнализируя установить курсор.

Оба решения имеют свои плюсы и, конечно, :), минусы.

...