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("请输入数字!"); } } } }