|
@@ -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)
|