C++:正确使用 LoadImage 和 SetCursor 函数

标签 c++ winapi

我正在尝试编写一个快速简单的 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

The data in the file must be in either .CUR or .ANI format

虽然对于 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);
}

关于C++:正确使用 LoadImage 和 SetCursor 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38166076/

相关文章:

c++ - C++11 中具有 C 链接的复杂类型

c# - UWP 应用中的视频编辑

c++ - 如何为使用 createwindow 创建的窗口创建自定义背景颜色

c++ - 使用头文件中定义的方法调用 SetWindowsHookEx

c++ - 将 HTTP 连接绑定(bind)到特定适配器(提示 : Metered Connection)

windows - 是什么导致 SwitchDesktop 在用户解锁 session 后无法立即工作?

c++ - 为什么在 Windows API 中调用 CoCreateInstance 函数时没有类型不匹配?

c++ - Objective-C 中的多态性 - iOS

c++ - 有没有办法从 string_view 创建字符串流而不复制数据?

c++ - 为什么 fltk-config 的输出会截断 gcc 的参数?