Parcourir la source

撤回上次更改,监听失效是因为Service的原因。

felix il y a 1 an
Parent
commit
da06400165

+ 18 - 0
Vinno.FIS.Sonopost.Common/ProcessHelper.cs

@@ -147,5 +147,23 @@ namespace Vinno.FIS.Sonopost.Common
         {
             return Process.GetProcessesByName(processName).Any(x => x.ProcessName == processName);
         }
+
+        /// <summary>
+        /// 根据进程名得到唯一的进程Id
+        /// </summary>
+        /// <param name="processName"></param>
+        /// <returns></returns>
+        public static int GetProcessIdByName(string processName)
+        {
+            var existProcesses = Process.GetProcessesByName(processName).Where(x => x.ProcessName == processName);
+            if (existProcesses.Count() == 1)
+            {
+                return existProcesses.FirstOrDefault().Id;
+            }
+            else
+            {
+                return 0;
+            }
+        }
     }
 }

+ 21 - 4
Vinno.FIS.Sonopost/Managers/KeyBoardListenManager.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Diagnostics;
 using System.Runtime.InteropServices;
 using System.Windows.Input;
 using Vinno.FIS.Sonopost.Common;
@@ -24,15 +25,22 @@ namespace Vinno.FIS.Sonopost.Managers
         // 键盘处理委托实例
         private LowLevelKeyboardProc _keyboardProc;
 
-        [DllImport("user32.dll", SetLastError = true)]
+        // 导入SetWindowsHookEx函数
+        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
         private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
 
-        [DllImport("user32.dll", SetLastError = true)]
+        // 导入UnhookWindowsHookEx函数
+        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
+        [return: MarshalAs(UnmanagedType.Bool)]
         private static extern bool UnhookWindowsHookEx(IntPtr hhk);
 
-        [DllImport("user32.dll", SetLastError = true)]
+        // 导入CallNextHookEx函数
+        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
         private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
 
+        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
+        private static extern IntPtr GetModuleHandle(string lpModuleName);
+
         // 声明KeyboardProc委托类型
         private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
 
@@ -47,7 +55,7 @@ namespace Vinno.FIS.Sonopost.Managers
         public KeyBoardListenManager()
         {
             _keyboardProc = KeyboardHookCallback;
-            _keyboardHookID = SetWindowsHookEx(WH_KEYBOARD_LL, _keyboardProc, IntPtr.Zero, 0);
+            _keyboardHookID = SetKeyboardHook(_keyboardProc);
         }
 
         public void StartKeyBoardListen()
@@ -70,6 +78,15 @@ namespace Vinno.FIS.Sonopost.Managers
             }
         }
 
+        private IntPtr SetKeyboardHook(LowLevelKeyboardProc proc)
+        {
+            using (Process curProcess = Process.GetCurrentProcess())
+            using (ProcessModule curModule = curProcess.MainModule)
+            {
+                return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
+            }
+        }
+
         public void StopKeyBoardListen()
         {
             if (!_isStarted)