.net6 WPF DD 驱动级按键
namespace Jx3KeyPress { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { /// <summary> /// 驱动安装命令文件 /// </summary> const string CmdFileName = "install.cmd"; /// <summary> /// 驱动路径 /// </summary> const string DriverDirectory = "Driver"; /// <summary> /// 配置文件 /// </summary> const string ConfigPath = "Config.json"; /// <summary> /// 配置实体 /// </summary> private JsonConfig Config = new(); /// <summary> /// 开关 /// </summary> private bool state = false; #region "HotKey 热键" /// <summary> /// 鼠标点击 /// </summary> /// <param name="i"></param> /// <returns></returns> [DllImport("DDHID64.dll")] static extern int DD_btn(int i); /// <summary> /// 键盘 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> [DllImport("DDHID64.dll")] static extern int DD_key(int x, int y); /// <summary> /// 转码 /// </summary> /// <param name="x"></param> /// <returns></returns> [DllImport("DDHID64.dll")] static extern int DD_todc(int x); /// <summary> /// 注册热键 /// </summary> /// <param name="hWnd"></param> /// <param name="id"></param> /// <param name="modkey"></param> /// <param name="vk"></param> /// <returns></returns> [DllImport("user32.dll")] static extern bool RegisterHotKey(IntPtr hWnd, int id, ModifierKeys modkey, int vk); /// <summary> /// 删除热键 /// </summary> /// <param name="hWnd"></param> /// <param name="id"></param> /// <returns></returns> [DllImport("user32.dll")] static extern bool UnregisterHotKey(IntPtr hWnd, int id); /// <summary> /// 按键方法 /// </summary> /// <param name="key"></param> void SendKey(int key ,int interval) { var code = DD_todc(key); DD_key(code, 1); DD_key(code, 2); Thread.Sleep(interval); } /// <summary> /// 注册热键方法 /// </summary> void RegHotkey() { var Handle = new WindowInteropHelper(this).Handle; HwndSource.FromHwnd(Handle).AddHook((IntPtr h, int m, IntPtr wParam, IntPtr lParam, ref bool handled) => { if (m == 0x0312) { handled = true; CallBack(); } return IntPtr.Zero; }); RegisterHotKey(Handle, 100, 0, Config.Hotkeys.ToInt()); } /// <summary> /// 删除热键方法 /// </summary> void UnRegHotkey() { try { UnregisterHotKey(new WindowInteropHelper(this).Handle, 100); } catch { } } #endregion /// <summary> /// /// </summary> public MainWindow() { InitializeComponent(); ResizeMode = ResizeMode.CanMinimize; try { //读取配置文件 Config = JsonSerializer.Deserialize<JsonConfig>(File.ReadAllText(ConfigPath))!; } catch { MessageBox.Show("配置文件加载失败!"); } if (File.Exists(Config.Background)) { WindowImageBrush.ImageSource = new BitmapImage(new Uri(Config.Background, UriKind.RelativeOrAbsolute)); } else { Background = Brushes.White; } //设置标题 Title = Config.Title; //设置说明 Descrtption.Text = Config.Description; //热键初始值 hotKey.Text = Config.Hotkeys.ToString(); //初始间隔时间 Interval.Text = Config.Interval.ToString(); //按键列表初始 listView_LineOfBusiness.ItemsSource = Config.List.Select(x => x.ToString()); //宽度 Width = Config.Width; //高度 Height = Config.Height; //内容位置 Body.Margin = new Thickness(Config.Left, Config.Top, 0, 0); //驱动加载失败就安装驱动 if (DD_btn(0) != 1) { using (var process = new Process()) { process.StartInfo.FileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DriverDirectory, CmdFileName); process.StartInfo.WorkingDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DriverDirectory); process.StartInfo.CreateNoWindow = true; process.Start(); process.WaitForExit(); //再次加载驱动 if (DD_btn(0) != 1) MessageBox.Show("驱动加载失败!请右键以管理员身份运行."); } } } /// <summary> /// 从写初始话方法 /// </summary> /// <param name="e"></param> protected override void OnSourceInitialized(EventArgs e) { //注册热键 RegHotkey(); Task.Run(async () => { while (true) { if (!state) continue; try { Config.List.ForEach(x => SendKey(x.ToInt(), 10)); await Task.Delay(Config.Interval); } catch(Exception ex) { MessageBox.Show(ex.Message); } } }); } /// <summary> /// 回调开关 /// </summary> /// <returns></returns> private bool CallBack() => state = !(IsEnabled = state); /// <summary> /// 删除按键 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void listView_LineOfBusiness_MouseDoubleClick(object sender, MouseButtonEventArgs e) { var lv = (ListView)sender; if (lv.SelectedItems.Count == 0) return; var m = Enum.Parse<Key>(lv.SelectedValue + ""); Config.List.Remove(m); listView_LineOfBusiness.ItemsSource = Config.List.Select(x => x.ToString()); } /// <summary> /// 卸载驱动 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void UnInstallDriver_Click(object sender, RoutedEventArgs e) { new[] { "cd Driver", "64 remove \"HID\\DDHID1906*\"", "64 remove \"DDHID1906\\HID_DEVICE\"" }.RunCmd((s, e) => { }); } private void TextBox_GotFocus(object sender, RoutedEventArgs e) { KeyValue.Text = "..."; KeyValue.KeyUp += TextBox_KeyUp; } private void hotKey_GotFocus(object sender, RoutedEventArgs e) { hotKey.Text = "..."; UnRegHotkey(); hotKey.KeyUp += hotKey_KeyUp; } private void hotKey_KeyUp(object sender, KeyEventArgs e) { if (Config.List.Contains(e.Key)) { MessageBox.Show("不能和按键列表中的键相同!"); return; } hotKey.KeyUp -= hotKey_KeyUp; hotKey.Text = e.Key.ToString(); Config.Hotkeys = e.Key; save.Focus(); RegHotkey(); } private void TextBox_KeyUp(object sender, KeyEventArgs e) { KeyValue.KeyUp -= TextBox_KeyUp; KeyValue.Text = e.Key.ToString(); AddKey.Focus(); } /// <summary> /// 添加按键 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void AddKey_Click(object sender, RoutedEventArgs e) { try { var key = Enum.Parse<Key>(KeyValue.Text); if (Config.Hotkeys == key) { MessageBox.Show("不能和热键相同!"); return; } if (!Config.List.Contains(key)) { Config.List.Add(key); listView_LineOfBusiness.ItemsSource = Config.List.Select(x => x.ToString()); } else { MessageBox.Show("请不要重复添加"); } } catch { } } /// <summary> /// 保存配置 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void save_Click(object sender, RoutedEventArgs e) { try { File.WriteAllText(ConfigPath, JsonSerializer.Serialize(Config)); MessageBox.Show("保存成功!"); } catch { MessageBox.Show("保存失败!"); } } private void Interval_TextChanged(object sender, TextChangedEventArgs e) { if (string.IsNullOrEmpty(Interval.Text)) return; try { var interval = Convert.ToInt32(Interval.Text); Config.Interval = interval <= 0 ? 1 : interval; } catch { MessageBox.Show("请输入数字!"); } } } }
分类:
C# .net core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!