Я пытаюсь заменить несколько системных курсоров, используя SetSystemCursor. Мой первый вызов изменяет курсор OCR_NORMAL, но последующие вызовы не работают.

HCURSOR hWaitCur = LoadCursor(NULL, IDC_WAIT);
HCURSOR cursorCopy = CopyCursor(hWaitCur);

SetSystemCursor(cursorCopy, OCR_NORMAL); // This works

// Not working
SetSystemCursor(cursorCopy, OCR_APPSTARTING); 
SetSystemCursor(cursorCopy, OCR_CROSS);
SetSystemCursor(cursorCopy, OCR_HAND);
SetSystemCursor(cursorCopy, OCR_HELP);
SetSystemCursor(cursorCopy, OCR_IBEAM); 
SetSystemCursor(cursorCopy, OCR_NO);
SetSystemCursor(cursorCopy, OCR_WAIT);

Как правильно обновить сразу несколько системных курсоров?

0
floydian 25 Сен 2018 в 10:01

2 ответа

Лучший ответ

Из docs (подчеркните: меня):

Система уничтожает hcur , вызывая функцию DestroyCursor. Следовательно, hcur не может быть курсором, загруженным с помощью функции LoadCursor. Чтобы указать курсор, загруженный из ресурса, скопируйте курсор с помощью функции CopyCursor, затем передайте копию в SetSystemCursor.

Поэтому вам нужно копировать его перед каждым вызовом:

SetSystemCursor(CopyCursor(hWaitCur), OCR_NORMAL);
SetSystemCursor(CopyCursor(hWaitCur), OCR_APPSTARTING); 
SetSystemCursor(CopyCursor(hWaitCur), OCR_CROSS);
SetSystemCursor(CopyCursor(hWaitCur), OCR_HAND);
SetSystemCursor(CopyCursor(hWaitCur), OCR_HELP);
SetSystemCursor(CopyCursor(hWaitCur), OCR_IBEAM); 
SetSystemCursor(CopyCursor(hWaitCur), OCR_NO);
SetSystemCursor(CopyCursor(hWaitCur), OCR_WAIT);
2
Max Vollmer 25 Сен 2018 в 07:14

Я нашел решение.

Поскольку SetSystemCursor уничтожает cursorCopy после установки, необходимо повторно копировать hWaitCur для каждого вызова.

/* ... */

HCURSOR cursorCopy = CopyCursor(cursor);
SetSystemCursor(cursorCopy, OCR_APPSTARTING);

cursorCopy = CopyCursor(cursor);
SetSystemCursor(cursorCopy, OCR_NORMAL);

cursorCopy = CopyCursor(cursor);
SetSystemCursor(cursorCopy, OCR_CROSS);

/* ... */
1
floydian 25 Сен 2018 в 07:13