跳到主要内容

github/tai

公开

Tai · Windows 软件与网站使用时长统计。上游 Planshit/Tai 的源码镜像,非灵栈原创;MIT 许可。来源:https://github.com/Planshit/Tai 。本次为手动同步,暂不提供安装包。

浏览文件

InputServicer.cs

56 行 · 1.7 KB历史下载
1using Core.Librarys;
2using System;
3using System.Collections.Generic;
4using System.Diagnostics;
5using System.Linq;
6using System.Runtime.InteropServices;
7using System.Text;
8using System.Threading.Tasks;
9using System.Windows.Forms;
10
11namespace UI.Servicers
12{
13 public class InputServicer : IInputServicer
14 {
15 public event InputEventHandler OnKeyDownInput;
16 public event InputEventHandler OnKeyUpInput;
17
18 private Win32API.LowLevelKeyboardProc keyboardProc;
19 private static IntPtr hookKeyboardID = IntPtr.Zero;
20 private IntPtr keyboardHook;
21 public InputServicer()
22 {
23 keyboardProc = HookCallback;
24 }
25 public void Start()
26 {
27 // 设置键盘钩子
28 keyboardHook = Win32API.SetKeyboardHook(keyboardProc);
29 }
30
31 private IntPtr HookCallback(
32 int nCode, IntPtr wParam, IntPtr lParam)
33 {
34 if (nCode >= 0)
35 {
36 Win32API.KeyboardHookStruct MyKeyboardHookStruct = (Win32API.KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32API.KeyboardHookStruct));
37
38 Keys key = (Keys)MyKeyboardHookStruct.vkCode;
39
40 // 键盘按下
41 if (wParam == (IntPtr)Win32API.WM_KEYDOWN)
42 {
43 OnKeyDownInput?.Invoke(this, key);
44 }
45
46 // 键盘抬起
47 if ((wParam == (IntPtr)Win32API.WM_KEYUP || wParam == (IntPtr)Win32API.WM_SYSKEYUP))
48 {
49 OnKeyUpInput?.Invoke(this, key);
50 }
51 }
52 return Win32API.CallNextHookEx(hookKeyboardID, nCode, wParam, lParam);
53
54 }
55 }
56}