我正在尝试编写一个快速简单的C ++程序,它将光标图标从目录更改为自定义图像。 Windows开发中心似乎有some fairly straightforward documentation on how to do this in C++,我从中得到了这段代码:
#include <iostream>
#include <chrono>
#include <thread>
#include <Windows.h>
using namespace std;
int main(int argc, char** argv)
{
//HINSTANCE hInst = GetModuleHandle(NULL);
HINSTANCE hInst = NULL;
HCURSOR cursor = (HCURSOR)LoadImage(hInst, "Image.bmp", IMAGE_BITMAP,
32, 32, LR_LOADFROMFILE); //Also tried LR_SHARED
cout << "Initializing\n";
Sleep(1500);
SetCursor(cursor);
//Also tried SetSystemCursor(cursor, 32512);
cout << "Setting cursor\n";
Sleep(1500);
DestroyCursor(cursor);
cout << "Restoring cursor\n";
Sleep(2000);
return 0;
}
程序应将光标更改为位图图像,然后将其更改回来,然后退出。我运行它时会打印消息,但光标不会像它应该的那样改变。我不完全确定我的问题是在于LoadImage函数,使用SetCursor函数还是其他东西。我已经为LoadImage函数的HINSTANCE参数尝试了各种类型的HINSTANCE,我为LoadImage函数的最后一个参数尝试了不同的标志,并且我也尝试使用SetSystemCursor函数而不是SetCursor函数。
我想要做的就是更改鼠标光标图像。看起来这应该很简单,但结果却比我想象的要复杂得多。我的目的是将此代码导出为DLL,以便与我正在使用的Java项目的Java Native Interface一起使用,因为JVM无法将光标更改到程序窗口之外。
我在这里搜索过,在这里看到了一些略有相似的问题,但没有一个能够正确解决我遇到的问题。我看到有些人提到我需要调用SetCursor函数来响应WM_SETCURSOR消息,但我不太清楚他们的意思(我没有太多的C ++经验,所以请耐心等待我)。我希望你们能帮助我。谢谢。
您的代码似乎存在一些问题。你试图加载.bmp
,然而,LoadCursorFromFile状态
文件中的数据必须是.CUR或.ANI格式
虽然这对LoadImage
来说可能并不完全正确,因为我已经能够将.ico
加载到光标中,但我认为你不能加载.bmp
。
尝试类似的东西
const HCURSOR customCursor = static_cast<HCURSOR>(LoadImage(nullptr, L"Cursor.cur", IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE));
另外,我相信SetCursor
仅适用于带有窗口的C ++桌面应用程序。但是,您可以使用SetSystemCursor替换系统游标。
#define OEMRESOURCE
#include <windows.h>
#include <chrono>
#include <thread>
void SetAllSystemCursorsToCursor(HCURSOR cursor)
{
//Need to copy the cursor each time as SetSystemCursor consumes the cursor
HCURSOR cursorCopy = CopyCursor(cursor);
SetSystemCursor(cursorCopy, OCR_APPSTARTING);
cursorCopy = CopyCursor(cursor);
SetSystemCursor(cursorCopy, OCR_NORMAL);
cursorCopy = CopyCursor(cursor);
SetSystemCursor(cursorCopy, OCR_CROSS);
cursorCopy = CopyCursor(cursor);
SetSystemCursor(cursorCopy, OCR_HAND);
cursorCopy = CopyCursor(cursor);
SetSystemCursor(cursorCopy, OCR_IBEAM);
cursorCopy = CopyCursor(cursor);
SetSystemCursor(cursorCopy, OCR_NO);
cursorCopy = CopyCursor(cursor);
SetSystemCursor(cursorCopy, OCR_SIZEALL);
cursorCopy = CopyCursor(cursor);
SetSystemCursor(cursorCopy, OCR_SIZENESW);
cursorCopy = CopyCursor(cursor);
SetSystemCursor(cursorCopy, OCR_SIZENS);
cursorCopy = CopyCursor(cursor);
SetSystemCursor(cursorCopy, OCR_SIZENWSE);
cursorCopy = CopyCursor(cursor);
SetSystemCursor(cursorCopy, OCR_SIZEWE);
cursorCopy = CopyCursor(cursor);
SetSystemCursor(cursorCopy, OCR_UP);
cursorCopy = CopyCursor(cursor);
SetSystemCursor(cursorCopy, OCR_WAIT);
}
int main()
{
//Load cursor
const HCURSOR customCursor = LoadCursorFromFile(L"Cursor.cur");
//Replace all system cursors with loaded cursor
SetAllSystemCursorsToCursor(customCursor);
//Sleep the current thread to allow the user to play with new cursor
std::this_thread::sleep_for(std::chrono::milliseconds(5000));
//Restore original system cursors
SystemParametersInfo(SPI_SETCURSORS, 0, nullptr, 0);
}
我不认为你可以在控制台窗口上更改光标。如果你弹出一个对话框,我认为光标会改变。我从未在Windows中的控制台窗口上看到过光标更改。