private void CombineButton_Click(object sender, EventArgs e) { if (this.asyncWaiting) { return; // there was already a thread waiting for hotkey } while (GetAsyncKeyState((Keys)Settings.Default.Hotkey) != 0) { // MessageBox.Show("Key detection failed, or you were already holding hotkey. Try again."); Thread.Sleep(200); } this.combineButton.Text = "Press " + SettingsHandler.HotkeyText + " on A1"; // hotkey this.asyncWaiting = true; do { Application.DoEvents(); Thread.Sleep(10); // [HR] Cancel before starting or if form is closing if (GetAsyncKeyState(Keys.Escape) != 0 || !CombinePerformer.Enabled) { this.combineButton.Text = "Combine"; this.asyncWaiting = false; return; } }while (GetAsyncKeyState((Keys)Settings.Default.Hotkey) == 0 || Control.ModifierKeys != Keys.None); // User pressed hotkey this.asyncWaiting = false; CombinePerformer.SleepTime = (int)this.delayNumeric.Value; this.stopwatch.Reset(); this.stopwatch.Start(); this.combineProgressBar.Maximum = CombinePerformer.Instructions.Count; // Don't combine if recipe is a simple g1 if (this.stepNumeric.Value > 0) { CombinePerformer.PerformCombine((int)this.stepNumeric.Value); } // Combine finished this.combineProgressBar.Value = this.combineProgressBar.Minimum; this.GuessEta(); this.combineButton.Text = "Combine"; if (Settings.Default.AutoCombine) { this.combineButton.PerformClick(); // guess it's finished, click the "combine" again } }