Зафиксируйте, какой шаг анимированного системного курсора отображается в Windows

#c #winapi

Вопрос:

Я хочу как можно точнее отобразить системный курсор в ОС Windows в виде растрового изображения. Предоставленный API для этого, насколько мне известно, GetCursorInfo, DrawIconEx.

Простая цепочка действий такова:

  • Получить курсор с помощью GetCursorInfo
  • Нарисуйте курсор в контроллере памяти с помощью DrawIconEx.

Вот как примерно выглядит код.

 CURSORINFO  CursorInfo;

(VOID)memset(amp;CursorInfo, 0, sizeof(CursorInfo));
CursorInfo.cbSize = sizeof(CursorInfo);

if (GetCursorInfo(amp;CursorInfo) amp;amp;
    CursorInfo.hCursor)
{
    // ... create here the memory DC, memory bitmap

    boError |= !DrawIconEx(hCursorDC,   // device context
        0,              // xLeft
        0,              // yTop
        CursorInfo.hCursor,     // cursor handle
        0,              // width, use system default
        0,              // height, use system default
        0,              // step of animated cursor !!!!!!!!!
        NULL,               // flicker free brush, don't use it now
        DI_MASK | DI_DEFAULTSIZE);  // flags

    // ... do whatever we want with the cursor in our memory DC
}
 

Теперь кто-нибудь знает, как я мог бы определить, какой шаг анимированного курсора рисуется (мне нужно значение, которое затем можно передать параметру istepIfAniCur DrawIconEx…)? В настоящее время приведенный выше код, очевидно, всегда отображает только первый шаг анимированного курсора.

Я подозреваю, что это нелегко сделать, но все равно стоит спросить.

Ответ №1:

К сожалению, я не думаю, что существует API Windows, который раскрывает текущий кадр анимации курсора. Я предполагаю, что это то, что вам нужно: взгляд курсора в момент, когда вы делаете снимок.

Ответ №2:

Я подозреваю, что вы упускаете один шаг.

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

См. раздел CreateCompatibleBitmap в документации MSDN:

HBITMAP создать совместимую карту(
 HDC hdc, // дескриптор для DC
int nWidth, // ширина растрового изображения, в пикселях
int nHeight // высота растрового изображения, в пикселях
);

С помощью DrawIconEx параметр UINT istepIfAniCur позволяет выбрать, какой кадр рисовать, если это анимированный курсор.

Об этом говорится в ваших комментариях :

0, // шаг анимированного курсора 

Комментарии:

1. Привет, Дэвид, мне нужно знать, на каком шаге рисуется анимированный курсор, чтобы я мог передать это значение в DrawIconEx. Комментарий о создании постоянного тока заменяет весь код о создании постоянного тока, растровое изображение, выбор растрового изображения. Проблема не в этом.

2. Хмм. Почти другой вопрос. Я бы посмотрел на некоторые функции системного подключения. Но я сомневаюсь, что он там будет.

3. Если вам каким-то образом удастся определить текущий кадр, вы будете разочарованы, обнаружив, что DrawIconEx не будет работать с анимированными курсорами, которые не существуют в виде файла на диске. Это ограничение также обычно распространяется на доступ к курсорам из других приложений. Я потратил много времени, работая над этим для проекта Wine, и обнаружил, что вам нужно использовать GetCursorFrameInfo() для правильного получения кадров из всех различных типов анимированных курсоров.

4. @Compholio Кстати, вы знаете информацию/параметры для GetCursorFrameInfo?

5. @Nicke Manarin Да, смотрите здесь: https://source.winehq.org/source/dlls/user32/cursoricon.c?!v=вино-2.17#1924