#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