Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ WinAPI SetSystemCursor和LoadCursorFrom-如何设置默认光标?_C++_Winapi_Cursor - Fatal编程技术网

C++ WinAPI SetSystemCursor和LoadCursorFrom-如何设置默认光标?

C++ WinAPI SetSystemCursor和LoadCursorFrom-如何设置默认光标?,c++,winapi,cursor,C++,Winapi,Cursor,我通过以下方式设置自己的光标: HCURSOR hCurStandard = LoadCursorFromFile(TEXT("cursor.cur")); SetSystemCursor(hCurStandard, 32512); DestroyCursor(hCurStandard); 如何返回并设置默认光标 这不起作用: SetSystemCursor(LoadCursor(0, IDC_ARROW), 32512); ----编辑----- 这适用于除IDC_ARROW之外的所有游

我通过以下方式设置自己的光标:

HCURSOR hCurStandard =  LoadCursorFromFile(TEXT("cursor.cur"));
SetSystemCursor(hCurStandard, 32512);
DestroyCursor(hCurStandard);
如何返回并设置默认光标

这不起作用:

SetSystemCursor(LoadCursor(0, IDC_ARROW), 32512);
----编辑-----


这适用于除IDC_ARROW之外的所有游标,根据
设置系统游标
文档:

要指定从资源加载的游标,请使用 CopyCursor函数,然后将副本传递给SetSystemCursor

因此,这样做可能会解决您原来的问题:

HCURSOR hCurDef = CopyCursor(LoadCursor(0, IDC_ARROW));
SetSystemCursor(hCurDef, OCR_NORMAL);
DestroyCursor(hCurDef);
如果不起作用,您可以存储现有光标的文件名,您可以通过读取注册表(
HKEY\U CURRENT\U USER\Control Panel\Cursors\Arrow
)获取该文件名,或者作为快捷方式使用
GetProfileString

TCHAR chCursorFile[MAX_PATH];
GetProfileString(TEXT("Cursors"), TEXT("Arrow"), TEXT(""), chCursorFile, MAX_PATH);
要恢复光标,请使用
LoadCursorFromFile
在中加载上一个光标,并使用
SetSystemCursor
进行设置


请注意,调用
SetSystemCursor
不会更新注册表,因此您的自定义光标无法在重新启动后继续使用。

根据
SetSystemCursor
文档:

要指定从资源加载的游标,请使用 CopyCursor函数,然后将副本传递给SetSystemCursor

因此,这样做可能会解决您原来的问题:

HCURSOR hCurDef = CopyCursor(LoadCursor(0, IDC_ARROW));
SetSystemCursor(hCurDef, OCR_NORMAL);
DestroyCursor(hCurDef);
如果不起作用,您可以存储现有光标的文件名,您可以通过读取注册表(
HKEY\U CURRENT\U USER\Control Panel\Cursors\Arrow
)获取该文件名,或者作为快捷方式使用
GetProfileString

TCHAR chCursorFile[MAX_PATH];
GetProfileString(TEXT("Cursors"), TEXT("Arrow"), TEXT(""), chCursorFile, MAX_PATH);
要恢复光标,请使用
LoadCursorFromFile
在中加载上一个光标,并使用
SetSystemCursor
进行设置


请注意,调用
SetSystemCursor
不会更新注册表,因此您的自定义光标在重新启动后将无法生存。

问题在于您可能使用SetSystemCursor函数更改标准箭头光标。此函数实际上使用您提供的HCURSOR覆盖系统游标,因此当您使用IDC_ARROW调用LoadCursor时,它将加载您的自定义游标。这就解释了你的程序的奇怪行为。为了避免这种情况,您应该在更改默认系统光标之前保存它

HCURSOR def_arrow_cur = CopyCursor(LoadCursor(0, IDC_ARROW));
//now you have a copy of the original cursor
SetSystemCursor(LoadCursorFromFile("my_awesome_cursor.cur"),OCR_NORMAL);
...
SetSystemCursor(def_arrow_cur,OCR_NORMAL);//restore the good old arrow

我知道这是一个迟来的答案,但我希望有人会觉得这很有用。

问题是您可能使用SetSystemCursor函数来更改标准箭头光标。此函数实际上使用您提供的HCURSOR覆盖系统游标,因此当您使用IDC_ARROW调用LoadCursor时,它将加载您的自定义游标。这就解释了你的程序的奇怪行为。为了避免这种情况,您应该在更改默认系统光标之前保存它

HCURSOR def_arrow_cur = CopyCursor(LoadCursor(0, IDC_ARROW));
//now you have a copy of the original cursor
SetSystemCursor(LoadCursorFromFile("my_awesome_cursor.cur"),OCR_NORMAL);
...
SetSystemCursor(def_arrow_cur,OCR_NORMAL);//restore the good old arrow

我知道这是一个迟来的答案,但我希望有人会觉得这很有用。

您是否检查了
SetSystemCursor
的返回值?如果为0,请调用
GetLastError
查看错误是什么。SetSytemCursor返回1,但无任何更改OK。文档说你不应该使用
LoadCursor
调用
SetSystemCursor
请看这里:下面的答案可能就是你需要做的。你说得对,我编辑了我的帖子,但仍然有一些奇怪的问题。你检查了
SetSystemCursor
的返回值了吗?如果为0,请调用
GetLastError
查看错误是什么。SetSytemCursor返回1,但无任何更改OK。文档说你不应该使用
LoadCursor
调用
SetSystemCursor
参见这里:所以下面的答案可能是你需要做的。你说得对,我编辑了我的帖子,但仍然有一些奇怪的问题。