diff --git a/ShareX.HelpersLib/Native/NativeConstants.cs b/ShareX.HelpersLib/Native/NativeConstants.cs index c54425eb2..3de69c04a 100644 --- a/ShareX.HelpersLib/Native/NativeConstants.cs +++ b/ShareX.HelpersLib/Native/NativeConstants.cs @@ -82,6 +82,7 @@ public static class NativeConstants public const uint ECM_FIRST = 0x1500; public const uint EM_SETCUEBANNER = ECM_FIRST + 1; + public const int IDC_HAND = 32649; public const uint MA_ACTIVATE = 1; public const uint MA_ACTIVATEANDEAT = 2; public const uint MA_NOACTIVATE = 3; diff --git a/ShareX.HelpersLib/Native/NativeMethods.cs b/ShareX.HelpersLib/Native/NativeMethods.cs index 5723fc581..91065e23c 100644 --- a/ShareX.HelpersLib/Native/NativeMethods.cs +++ b/ShareX.HelpersLib/Native/NativeMethods.cs @@ -193,6 +193,9 @@ public static partial class NativeMethods [return: MarshalAs(UnmanagedType.Bool)] public static extern bool IsZoomed(IntPtr hWnd); + [DllImport("user32.dll")] + public static extern IntPtr LoadCursor(IntPtr hInstance, int iconId); + [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags); diff --git a/ShareX/Program.cs b/ShareX/Program.cs index 0204e3c79..9daeb1ffa 100644 --- a/ShareX/Program.cs +++ b/ShareX/Program.cs @@ -30,6 +30,7 @@ You should have received a copy of the GNU General Public License using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Reflection; using System.Text; using System.Threading; using System.Windows.Forms; @@ -226,14 +227,23 @@ public static string ScreenshotsFolder [STAThread] private static void Main(string[] args) { +#if !DEBUG // Allow Visual Studio to break on exceptions in Debug builds. Application.ThreadException += Application_ThreadException; AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; +#endif StartTimer = Stopwatch.StartNew(); // For be able to show startup time CLI = new CLIManager(args); CLI.ParseCommands(); + // Fix the hand cursor before we open any form. + try + { + FixHandCursor(); + } + catch (Exception) { } // If it fails, we'll just have to live with the old hand. + #if STEAM if (CheckUninstall()) return; // Steam will run ShareX with -Uninstall when uninstalling #endif @@ -580,5 +590,12 @@ private static void CleanTempFiles() } }).Start(); } + + private static void FixHandCursor() + { + // https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Cursors.cs,423 + typeof(Cursors).GetField("hand", BindingFlags.NonPublic | BindingFlags.Static) + ?.SetValue(null, new Cursor(NativeMethods.LoadCursor(IntPtr.Zero, NativeConstants.IDC_HAND))); + } } } \ No newline at end of file