改变LoadCursorFromFile返回的游标大小

本文关键字:游标 LoadCursorFromFile 返回 改变 | 更新日期: 2023-09-27 18:07:45

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        private static extern IntPtr LoadCursorFromFile(string path);
public static Cursor LoadCustomCursor(string path)
        {
            try {
                IntPtr hCurs = LoadCursorFromFile(path);
                if (hCurs == IntPtr.Zero) throw new Win32Exception();
                var curs = new Cursor(hCurs);
                // Note: force the cursor to own the handle so it gets released properly
                var fi = typeof(Cursor).GetField("ownHandle", BindingFlags.NonPublic | BindingFlags.Instance);
                fi.SetValue(curs, true);
                return curs;

            }
            catch(Exception ex)
            {
                Logger.Error(ex, true);
                return Cursor.Current;
            }
        }

我从文件中加载cursor图像,无论图像大小是什么,cursor大小将是32*32,我如何强制它加载图像的实际大小?

改变LoadCursorFromFile返回的游标大小

这可能只是您确切需求的部分答案。可以使用游标的Tag属性来存储Size对象。在我下面的例子中,我从一个位图中创建一个光标,它可能比默认的32X32大,所以我知道光标的大小是什么。

    public static Cursor CreateCursor(Bitmap bm, int xHotspot, int yHotspot, bool resize = true)
    {
        IntPtr ptr = (resize) ? ((Bitmap)ResizeBitmap(bm, 32, 32)).GetHicon() : bm.GetHicon();
        IconInfo inf = new IconInfo();
        GetIconInfo(ptr, ref inf);
        inf.xHotspot = xHotspot;
        inf.yHotspot = yHotspot;
        inf.fIcon = false;
        IntPtr cursorPtr = CreateIconIndirect(ref inf);
        if (inf.hbmColor != IntPtr.Zero) { DeleteObject(inf.hbmColor); }
        if (inf.hbmMask != IntPtr.Zero) { DeleteObject(inf.hbmMask); }
        if (ptr != IntPtr.Zero) { DestroyIcon(ptr); }
        Cursor c = new Cursor(cursorPtr);
        c.Tag = (resize) ? new Size(32, 32) : bm.Size;
        return c;
    }

我可以使用动态关键字在代码的其他地方检查标签属性-这里我从存储在标签

中的大小检索宽度属性
int cWidth = ((dynamic)cursors[2].Tag).Width