public async Task Execute(IJobExecutionContext context)
        {
            JobDataMap dataMap   = context.JobDetail.JobDataMap;
            List <int> targetkey = dataMap.Get("param") as List <int>;

            try
            {
                Task task = Task.Run(() =>
                {
                    KeyboardInputs.PressKeyMulti(targetkey);
                });

                try
                {
                    Task.WaitAll(task, Task.Delay(1000));
                }
                catch (AggregateException exception)
                {
                    exception.Handle(ex =>
                    {
                        return(true);
                    });
                    return;
                }

                await Task.Delay(100);
            }
            catch
            {
            }
        }
        public async Task Execute(IJobExecutionContext context)
        {
            JobDataMap      dataMap = context.JobDetail.JobDataMap;
            SequenceKeyData model   = dataMap.Get("param") as SequenceKeyData;

            while (GlobalVars.isworking)
            {
                Thread.Sleep(10);
            }
            try
            {
                GlobalVars.isworking = true;
                Task task = Task.Run(() =>
                {
                    if (model.iscombomode)
                    {
                        Debug.WriteLine($"-----연속 키 입력 시작: 동시입력 모드 ----- {context.JobDetail.Key}");
                        for (int i = 0; i < model.sendkeys.Count; i++)
                        {
                            if (model.isholding)
                            {
                                if (model.sendkeys[i] != 0)
                                {
                                    KeyboardInputs.PressKeyMulti(model.holdkey, model.sendkeys[i]);
                                    Debug.WriteLine($"연속 키 입력: 동시입력 모드 동시입력 {(VirtualKeyCode)model.holdkey}, {(VirtualKeyCode)model.sendkeys[i]}");
                                    Thread.Sleep(model.interval);
                                }
                            }
                            else
                            {
                                if (model.sendkeys[i] != 0)
                                {
                                    KeyboardInputs.PressKey(model.sendkeys[i]);
                                    Debug.WriteLine($"연속 키 입력: 동시입력 모드 단독입력 {(VirtualKeyCode)model.sendkeys[i]}");
                                    Thread.Sleep(model.interval);
                                }
                            }

                            if (model.unholdafter.Contains(i))
                            {
                                model.isholding = false;
                            }
                            else if (model.reholdafter.Contains(i))
                            {
                                model.isholding = true;
                            }
                        }
                        Debug.WriteLine($"-----연속 키 입력 종료: 동시입력 모드----- {context.JobDetail.Key}");
                    }
                    else
                    {
                        Debug.WriteLine($"-----연속 키 입력 시작: 단독입력 모드----- {context.JobDetail.Key}");
                        for (int i = 0; i < model.sendkeys.Count; i++)
                        {
                            if (model.sendkeys[i] != 0)
                            {
                                KeyboardInputs.PressKey(model.sendkeys[i]);
                                Debug.WriteLine($"연속 키 입력: 단독입력 모드 단독입력 {(VirtualKeyCode)model.sendkeys[i]}");
                                Thread.Sleep(model.interval);
                            }
                        }
                        Debug.WriteLine($"-----연속 키 입력 종료: 단독입력 모드----- {context.JobDetail.Key}");
                    }

                    model.isholding = true;
                });

                try
                {
                    Task.WaitAll(task);
                }
                catch (AggregateException exception)
                {
                    exception.Handle(ex =>
                    {
                        return(true);
                    });
                    return;
                }

                await Task.Delay(100);
            }
            finally
            {
                GlobalVars.isworking = false;
            }
        }
        public static void SetQuartzJobs()
        {
            GlobalVars.scheduler.Clear();
            using (StreamReader sr = new StreamReader("settings/data.json"))
            {
                string json = sr.ReadToEnd();
                GlobalVars.mainSchedule = JsonConvert.DeserializeObject <ScheduleModel>(json, settings);
            }

            if (currentSetting.parsemode == "string")
            {
                foreach (var x in GlobalVars.mainSchedule.presskey)
                {
                    try
                    {
                        PressKey newjob = new PressKey();
                        int      param  = KeyboardInputs.VKStringtoInt(x.sendkey);
                        GlobalVars.scheduler.AddJobRow(x.cronexpression, newjob, param);
                    }
                    catch
                    {
                        continue;
                    }
                }
            }
            else
            {
                foreach (var x in GlobalVars.mainSchedule.presskey)
                {
                    try
                    {
                        PressKey newjob = new PressKey();
                        GlobalVars.scheduler.AddJobRow(x.cronexpression, newjob, int.Parse(x.sendkey));
                    }
                    catch
                    {
                        continue;
                    }
                }
            }

            if (currentSetting.parsemode == "string")
            {
                foreach (var x in mainSchedule.presskeymulti)
                {
                    try
                    {
                        PressKeyMulti newjob = new PressKeyMulti();
                        List <int>    param  = x.sendkeys.ConvertAll(KeyboardInputs.VKStringtoInt);
                        GlobalVars.scheduler.AddJobRow(x.cronexpression, newjob, param);
                    }
                    catch
                    {
                        continue;
                    }
                }
            }
            else
            {
                foreach (var x in mainSchedule.presskeymulti)
                {
                    try
                    {
                        PressKeyMulti newjob = new PressKeyMulti();
                        GlobalVars.scheduler.AddJobRow(x.cronexpression, newjob, x.sendkeys.ConvertAll(int.Parse));
                    }
                    catch
                    {
                        continue;
                    }
                }
            }

            if (currentSetting.parsemode == "string")
            {
                foreach (var x in mainSchedule.sequencekey)
                {
                    SequenceKeyData param = new SequenceKeyData();
                    if (x.holdkey != string.Empty)
                    {
                        param.holdkey     = KeyboardInputs.VKStringtoInt(x.holdkey);
                        param.iscombomode = true;
                    }
                    else
                    {
                        param.iscombomode = false;
                        param.holdkey     = 0;
                    }
                    param.interval    = TimeSpan.FromSeconds(x.interval);
                    param.unholdafter = x.unholdafter;
                    param.reholdafter = x.reholdafter;
                    param.sendkeys    = x.sendkeys.ConvertAll(KeyboardInputs.VKStringtoInt);
                    param.sendkeys.Insert(0, 0);
                    param.isholding = true;
                    GlobalVars.scheduler.AddJobRow(x.cronexpression, new SequenceKey(), param);
                }
            }
            else
            {
                foreach (var x in mainSchedule.sequencekey)
                {
                    SequenceKeyData param = new SequenceKeyData();
                    if (x.holdkey != string.Empty)
                    {
                        param.holdkey     = int.Parse(x.holdkey);
                        param.iscombomode = true;
                    }
                    else
                    {
                        param.iscombomode = false;
                        param.holdkey     = 0;
                    }
                    param.interval    = TimeSpan.FromSeconds(x.interval);
                    param.unholdafter = x.unholdafter;
                    param.reholdafter = x.reholdafter;
                    param.sendkeys    = x.sendkeys.ConvertAll(int.Parse);
                    param.sendkeys.Insert(0, 0);
                    param.isholding = true;
                    GlobalVars.scheduler.AddJobRow(x.cronexpression, new SequenceKey(), param);
                }
            }
            App.Logger.Info(GlobalVars.scheduler.GetAllGroupList());
        }