Browse Source

Fix SetWindowsHookEx failed when build in single exe mode.

Justin 2 years ago
parent
commit
93fd0c50a4
1 changed files with 12 additions and 11 deletions
  1. 12 11
      fis/Win/WindowDragingHelper.cs

+ 12 - 11
fis/Win/WindowDragingHelper.cs

@@ -734,14 +734,13 @@ namespace fis.Win
             HTHELP = 21
         }
 
-        [DllImport("kernel32.dll")]
-        private static extern IntPtr GetModuleHandle(
-           string lpModuleName
-           );
+
+        [DllImport("kernel32", SetLastError = true)]
+        private static extern IntPtr LoadLibrary(string lpFileName);
 
         private delegate int HookProc(int nCode, int wParam, IntPtr lParam);
 
-        [DllImport("user32.dll")]
+        [DllImport("user32.dll", SetLastError=true)]
         private static extern IntPtr SetWindowsHookEx(
            int idHook,
            HookProc lpfn,
@@ -757,16 +756,16 @@ namespace fis.Win
            IntPtr lParam
            );
 
-        [DllImport("user32.dll")]
+        [DllImport("user32.dll", CharSet = CharSet.Auto)]
         private static extern bool UnhookWindowsHookEx(IntPtr hHook);
 
         [DllImport("user32.dll", CharSet = CharSet.Auto)]
         private static extern bool GetCursorPos(out POINT pt);
 
-        [DllImport("user32.dll")]
+        [DllImport("user32.dll", CharSet = CharSet.Auto)]
         private static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);
 
-        [DllImport("user32.dll")]
+        [DllImport("user32.dll", CharSet = CharSet.Auto)]
         private static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
 
         private static readonly Dictionary<string, IntPtr> _windowHandles = new Dictionary<string, IntPtr>();
@@ -793,7 +792,8 @@ namespace fis.Win
         public static void StartMouseMonitor()
         {
             _hookProc = OnMouseHookProc;
-            _mouseHookHandle = SetWindowsHookEx((int)HookType.WH_MOUSE_LL, _hookProc, Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]), 0);
+            var hModule = LoadLibrary("user32.dll");
+            _mouseHookHandle = SetWindowsHookEx((int)HookType.WH_MOUSE_LL, _hookProc, hModule, 0); //Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]), 0);
             if (_mouseHookHandle == IntPtr.Zero)
             {
                 var errorCode = Marshal.GetLastWin32Error();
@@ -846,8 +846,9 @@ namespace fis.Win
         //Stop drag the window.
         public static void EndWindowDrag(string windowName)
         {
-            if(_windowHandles.TryGetValue(windowName, out var windowHandle)){
-                if(windowHandle == _dragingWindowHandle)
+            if (_windowHandles.TryGetValue(windowName, out var windowHandle))
+            {
+                if (windowHandle == _dragingWindowHandle)
                 {
                     _dragingWindowHandle = IntPtr.Zero;
                 }