C#获取当前光标图标

C#获取当前光标图标,c#,wpf,cursor,C#,Wpf,Cursor,我一直试图这么做,但没能成功,这就是我要做的: [DllImport("user32.dll")] static extern bool SetSystemCursor(IntPtr hcur, uint id); [DllImport("user32.dll", EntryPoint = "GetCursorInfo")] public static extern bool GetCursorInfo(out CURSORINFO pci); [DllImport("user32.dll"

我一直试图这么做,但没能成功,这就是我要做的:

[DllImport("user32.dll")]
static extern bool SetSystemCursor(IntPtr hcur, uint id);

[DllImport("user32.dll", EntryPoint = "GetCursorInfo")]
public static extern bool GetCursorInfo(out CURSORINFO pci);

[DllImport("user32.dll", EntryPoint = "CopyIcon")]
public static extern IntPtr CopyIcon(IntPtr hIcon);

[StructLayout(LayoutKind.Sequential)]
public struct CURSORINFO
{
    public Int32 cbSize;        // Specifies the size, in bytes, of the structure. 
    public Int32 flags;         // Specifies the cursor state. This parameter can be one of the following values:
    public IntPtr hCursor;          // Handle to the cursor. 
    public POINT ptScreenPos;       // A POINT structure that receives the screen coordinates of the cursor. 
}

public void etc()
{
    IntPtr hwndic = new IntPtr();
    CURSORINFO curin = new CURSORINFO();
    curin.cbSize = Marshal.SizeOf(curin);
    if (GetCursorInfo(out curin))
    {
        if (curin.flags == CURSOR_SHOWING)
        {
            hwndic = CopyIcon(curin.hCursor);
            SetSystemCursor(hwndic, OCR_NORMAL);
        }
    }
}
问题是复制的图标有时不同于默认的鼠标图标,例如,如果它在等待位置捕捉到它,那么它可能会给我鼠标等待图标

我希望获得运行系统的默认光标图标(空闲时的图标),我如何才能这样做


提前谢谢。

我已经解决了我的问题,经过一些研究,我找到了一些有趣的东西,可能一直都能用

我没有试图保存光标图标并加载它,而是想到了一个不同的想法

我注意到,每当我更改光标图标时(比如说使用代码,更改为随机图标),当我转到windows光标设置时,图标不会在那里更改,但没有应用按钮来应用我以前的设置,因为windows认为我正在使用这些设置

所以我将设置更改为一些随机的其他设置,而不应用,并返回到我以前和应用过的设置,这样做会在任何更改之前将光标重置到其原始光标

因此windows所做的只是“刷新”鼠标,所以我这样做了,也许如果我能强制刷新,一切都会很完美,所以我找到了一种方法,使用这个函数:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern Int32 SystemParametersInfo(UInt32 uiAction,UInt32 uiParam, String pvParam, UInt32 fWinIni);
在观看msdn时,我在其参数中发现了一些有趣的东西,参数“SPI_SETCURSORS(0x57)”,我引用:

“重新加载系统游标。将uiParam参数设置为零,将pvParam参数设置为NULL。”

所以我试过了,它成功了,这个过程的例子:

[DllImport("User32.dll", CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)]
private static extern IntPtr LoadCursorFromFile(String str);

uint SPI_SETCURSORS = 0x57;
var NewArrow = LoadCursorFromFile("C:\\Users\\mtnju\\Downloads\\invisible.cur"); // loads some new cursor icon using the LoadCursorFromFile function
SetSystemCursor(NewArrow, OCR_NORMAL); // sets the new cursor icon using the SetSystemCursor function
SystemParametersInfo(SPI_SETCURSORS, 0, null, 0);// reloads all of the system cursors

我想我需要5分钟来做这样的事情。。。我希望它能对你们有所帮助,我真的很感谢你们的评论试图帮助我。

看看LoadCursor和IDC\u ARROWconstant@Pascalz这对我没有帮助,它没有检测到系统的光标是什么。你能在复制之前设置cursor.Current=Cursors.Default吗?@obl我以前试过这样做,它说不能用实例引用访问成员“cursor.current”,而是用类型名限定它,据我所知,cursor命令只能在表单设计器文件中使用,不能在表单设计器文件之外使用。因此,即使我在应用程序启动时成功获取光标图标,用户可能会在启动后更改光标图标,而我将无法返回到上次用户更改的光标图标。@obl您所说的东西也不会正常工作,即使它会,因为setsystemcursor函数粘贴的光标的阴影比它应该粘贴的更多。无论如何,我已经解决了这个问题,我会回答这个问题。