改变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,我如何强制它加载图像的实际大小?
这可能只是您确切需求的部分答案。可以使用游标的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