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