.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("请输入数字!");
            }
        }
    }
}
复制代码

 

posted @   87de海雷  阅读(114)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示