public static void ToggleMouseCursorVisibility(Forms.MainWindow frmMain, Tools.Boolstate forced = Tools.Boolstate.Indeterminate) { if (((forced == Tools.Boolstate.True) && (!Manipulation.MouseCursorIsHidden)) || ((forced == Tools.Boolstate.False) && Manipulation.MouseCursorIsHidden)) { return; } if ((forced == Tools.Boolstate.True) || Manipulation.MouseCursorIsHidden) { Native.SetSystemCursor(Manipulation.hCursorOriginal, OCR_SYSTEM_CURSORS.OCR_NORMAL); Native.DestroyIcon(Manipulation.hCursorOriginal); Manipulation.hCursorOriginal = IntPtr.Zero; Manipulation.MouseCursorIsHidden = false; } else { string fileName = null; try { Manipulation.hCursorOriginal = frmMain.Cursor.CopyHandle(); if (Manipulation.curInvisibleCursor == null) { // Can't load from a memory stream because the constructor new Cursor() does not accept animated or non-monochrome cursors fileName = Path.GetTempPath() + Guid.NewGuid().ToString() + ".cur"; using (FileStream fileStream = File.Open(fileName, FileMode.Create)) { using (MemoryStream ms = new MemoryStream(Properties.Resources.blank)) { ms.WriteTo(fileStream); } fileStream.Flush(); fileStream.Close(); } Manipulation.curInvisibleCursor = new Cursor(Native.LoadCursorFromFile(fileName)); } Native.SetSystemCursor(Manipulation.curInvisibleCursor.CopyHandle(), OCR_SYSTEM_CURSORS.OCR_NORMAL); Manipulation.MouseCursorIsHidden = true; } catch { // swallow exception and assume cursor set failed } finally { try { if (!string.IsNullOrEmpty(fileName)) { if (File.Exists(fileName)) { File.Delete(fileName); } } } catch { } } } }