SendKey если while(true)
Подскажите пожалуйста,как можно сделать эмуляцию нажатия клавиши раз в Х секунд пока условие верно?
if (e == Keys.RControlKey)
{
if (!IsAfk)
{
IsAfk = true;
Update();
}
else
{
IsAfk = false;
Update();
}
}
private void Update()
{
while (IsAfk)
{
SendKeys.Send("W");
System.Threading.Thread.Sleep(3000);
if (!IsAfk)
{
break;
}
}
}
Вот что-то такое у меня.Клавиша W отправляется,но не могу остановить.Подскажите пожалуйста как это реализовать?На С# сижу 3й день,пытаюсь освоить)
P.S пытаюсь получить что-то формата: Я нажимаю на RCtrl у меня начинает выполняться цикл с нажатием кнопки W раз в 3 секунды.Снова нажимаю на RCtrl и если цикл был запущен,его должно остановить.Если не был запущен,то запускаем.
Ответы (1 шт):
Ваш код синхронный. Пока выполняется цикл, ничто другое выполняться не может. Попробуйте запустить его в отдельной задаче.
using System.Threading;
using System.Threading.Tasks;
if (e == Keys.RControlKey)
{
if (!IsAfk)
{
IsAfk = true;
Task.Run(() => Update());
}
else
{
IsAfk = false;
}
}
Задача не остановится мгновенно, а только через 3 секнуды, и есть вероятность повторного запуска, если часто нажимать Ctrl, поэтому я добавил дополнительную защиту в виде переменной isRunning.
private bool isRunning;
private void Update()
{
if (isRunning) return;
isRunning = true;
while (IsAfk)
{
SendKeys.Send("W");
Thread.Sleep(3000);
if (!IsAfk)
{
break;
}
}
isRunning = false;
}
Обратите нимание, что после нажатия Crtl, если вы не успеете его очень быстро отпустить, то первое нажатие W сработает как комбинация горячих клавиш Ctrl+W.
Если подойти к делу серьезно, то такое лучше реализовать с помощью async/await и CancellationToken, но это сделает пример очень далеким от вашего кода, поэтому я написал более простой и понятный пример, способный решить вашу задачу.