using RichCreator.Utility; using RichCreator.Utility.Captures; using RichCreator.Utility.CV; using RichCreator.Utility.InputControl; using RichCreator.Utility.Structs; using RichCreator.Utility.Utilitys; using Emgu.CV; using Emgu.CV.Structure; using RichCreator.Models; using RichCreator.ViewModels; using System; using System.IO; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using ZTImage.Configuration; using ZTImage.Log; namespace RichCreator { /// /// MainWindow.xaml 的交互逻辑 /// public partial class MainWindow : Window { private ConfigViewModel viewModel; public MainWindow() { InitializeComponent(); G.Instance.EnableWriter(this.writeDebug, this.writeInfo, this.writeRemainTime, this.CancelConfirm,this.stopTaskUI); viewModel = new ConfigViewModel(); this.DataContext = viewModel; } private JobMonitor monitor; private bool isRunning = false; #region events /// /// 开始运行 /// /// /// private void Run_Click(object sender, RoutedEventArgs e) { Int32 taskIndex = this.taskName.SelectedIndex; if (isRunning) { monitor.Stop(); stopTaskUI(); return; } G.Instance.DebugWriter("开始运行,2秒后开始控制,请不要移动鼠标!~"); RunningButton.IsEnabled = false; Task.Run(() => { Thread.Sleep(2000); if (!TestHardware()) { if (!TestHardware()) { G.Instance.DebugWriter("检测硬件未通过"); stopTaskUI(); return; } } G.Instance.DebugWriter("硬件检测通过"); this.monitor = new JobMonitor(taskIndex); monitor.Start(); startTaskUI(); }); } /// /// 清空日志 /// /// /// private void ClearLog_Click(object sender, RoutedEventArgs e) { this.LogTB.Text = string.Empty; } /// /// 点击检测按钮 /// /// /// private void BtnTestDo_Click(object sender, RoutedEventArgs e) { if (this.RemainTimeTB.Text.Trim() == "032j") { testTempVar = true; } else { testTempVar = false; } manualre.Set(); } /// /// 取消重试 /// /// /// private void CancelTry_Click(object sender, RoutedEventArgs e) { cancelReTry = true; } /// /// GPD路径浏览 /// /// /// private void BrowserGPDPath_Click(object sender, RoutedEventArgs e) { string exePath = string.Empty; Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog(); ofd.DefaultExt = ".exe"; ofd.Filter = "tgp_daemon|*.exe"; ofd.Multiselect = false; if (ofd.ShowDialog() == true) { exePath = ofd.FileName; } else { return; } if (File.Exists(exePath)) { this.viewModel.TGPDaemonPath = exePath; return; } } /// /// 保存配置 /// /// /// private void ConfigSave_Click(object sender, RoutedEventArgs e) { this.viewModel.SaveConfig(); MessageBox.Show("配置更新成功"); } #endregion private ZTPoint GetRolePosition() { System.Drawing.Bitmap bitmap = ScreenCapture.Instance.CaptureScreen(); //原图 Image image = new Image(bitmap); //色彩hsv Image hsvImage = new Image(image.Width, image.Height); CvInvoke.CvtColor(image, hsvImage, Emgu.CV.CvEnum.ColorConversion.Rgb2Hsv); hsvImage = hsvImage.GetSubRect(new System.Drawing.Rectangle(0, 0, 1280, 720)); return DnfCVHelper.FindRole(hsvImage, new ZTRectangle(0, 0, 1280, 720)); } #region 测试硬件 //测试硬件的中间变量 private bool testTempVar = false; private AutoResetEvent manualre = new AutoResetEvent(false); /// /// 测试硬件是否正常工作 /// /// private bool TestHardware() { testTempVar = false; ZTPoint btnPosition = ZTPoint.Empty; ZTPoint txtPosition = ZTPoint.Empty; using (ManualResetEvent mre = new ManualResetEvent(false)) { //等待读取位置成功 this.Dispatcher.BeginInvoke((Action)(() => { this.RemainTimeTB.Text = string.Empty; btnPosition = GetElementClickPosition(this.btnTestDo); txtPosition = GetElementClickPosition(this.RemainTimeTB); mre.Set(); })); if (!mre.WaitOne(1000)) { return false; } } //输入文字 G.Instance.InputControl.MoveToAndClick(txtPosition); G.Instance.InputControl.InputString("032j"); //点检测 G.Instance.InputControl.MoveToAndClick(btnPosition); bool rtt = manualre.WaitOne(8000); if (!rtt) { return false; } if (testTempVar) { return true; } return false; } /// /// 获取控件位置 /// /// /// private ZTPoint GetElementClickPosition(Control element) { Point t = element.PointToScreen(new Point(0, 0)); ZTPoint t1 = new ZTPoint((Int32)(t.X + element.ActualWidth / 2), (Int32)(t.Y + element.ActualHeight / 2)); return t1; } #endregion #region 显示 /// /// 输出调试信息 /// /// private void writeDebug(string msg) { this.Dispatcher.BeginInvoke((Action)(() => { string content = DateTime.Now.ToString("dd日HH:mm:ss") + "->" + msg; this.debugMessage.Text = content; })); Trace.Debug(msg); } /// /// 输出关键信息 /// /// private void writeInfo(string msg) { this.Dispatcher.BeginInvoke((Action)(() => { if (string.IsNullOrEmpty(msg)) { this.LogTB.Text = string.Empty; return; } string content = DateTime.Now.ToString("dd日HH:mm:ss") + "->" + msg + "\r\n"; this.LogTB.AppendText(content); this.LogTB.ScrollToEnd(); })); Trace.Info(msg); } bool cancelReTry = false; /// /// 弹出提示,并带有倒计时 /// /// /// private bool CancelConfirm(Int64 remainMillSecond) { bool retry = true; ManualResetEvent mre = new ManualResetEvent(false); //启用取消按钮 this.Dispatcher.BeginInvoke((Action)(() => { cancelReTry = false; btnCancelTry.IsEnabled = true; mre.Set(); })); mre.WaitOne(); mre.Reset(); //计时,并判断是否取消 for (int remainSecond = (Int32)remainMillSecond / 1000; remainSecond >= 0; remainSecond--) { this.Dispatcher.BeginInvoke((Action)(() => { btnCancelTry.Content = "取消重试(" + remainSecond + ")"; mre.Set(); })); mre.WaitOne(); mre.Reset(); if (cancelReTry) { //取消重试 retry = false; break; } Thread.Sleep(1000); } //禁用取消按钮 this.Dispatcher.BeginInvoke((Action)(() => { cancelReTry = false; btnCancelTry.IsEnabled = false; btnCancelTry.Content = "取消重试"; mre.Set(); })); mre.WaitOne(); mre.Reset(); mre.Close(); return retry; } /// /// 输出剩余时间 /// /// private void writeRemainTime(Int64 remaintime) { //更新倒计时 string rt = "--:--"; if (remaintime >= 0) { Int64 min = remaintime / 60; Int64 sec = remaintime % 60; rt = min.ToString().PadLeft(2, '0') + ":" + sec.ToString().PadLeft(2, '0'); } this.Dispatcher.BeginInvoke((Action)(() => { this.RemainTimeTB.Text = rt; })); } /// /// 开始任务UI设置 /// private void startTaskUI() { //文字设成停止运行 this.Dispatcher.BeginInvoke((Action)(() => { RunningButton.Content = "停止"; RunningButton.IsEnabled = true; isRunning = true; })); } /// /// 停止任务 /// private void stopTaskUI() { //文字设成停止运行 this.Dispatcher.BeginInvoke((Action)(() => { RunningButton.Content = "开始"; RunningButton.IsEnabled = true; isRunning = false; })); } #endregion } }