Перейти к содержанию
Опубликовано
comment_2611

Пишу антиотдачу на С++ в VS22. Программа имитирует движение мыши вниз. Хочу сделать чтобы она включалась и выключалась на одну кнопку, например в игре нажал ALT она заработала, нажал еще раз - остановилась. Пока что только получилось сделать чтобы на CTRL останавливать ее. 

 

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
MessageBox::Show("ok");

int x, y, a, sleep;
x = 0;
y = 0;
a = System::Convert::ToInt32(textBox1->Text); // 25
sleep = System::Convert::ToInt32(textBox2->Text); // 50

/*if (GetAsyncKeyState(VK_MENU) & 0x12)
{
start = !start;
}*/

while (true) {
// смещаем ось У на определенное кол-во пикселей зависящее от отдачи
while (GetAsyncKeyState(VK_LBUTTON)) {

y = y + a;
mouse_event(MOUSEEVENTF_MOVE, x, y, NULL, NULL);
y = 0;
Sleep(sleep);

}

y = 0;
x = 0;
Sleep(100);
if (GetAsyncKeyState(VK_CONTROL)) {
break;
}

}



}

 

Рекомендуемые сообщения

Опубликовано
comment_2612

Попробуй так:

int x, y, a, sleep;
x = 0;
y = 0;
a = System::Convert::ToInt32(textBox1->Text); // 25
sleep = System::Convert::ToInt32(textBox2->Text); // 50
bool start = 0;




while (true) {
// смещаем ось У на определенное кол-во пикселей зависящее от отдачи
if (start) {
while (GetAsyncKeyState(VK_LBUTTON)) {


y = y + a;
mouse_event(MOUSEEVENTF_MOVE, x, y, NULL, NULL);
y = 0;
Sleep(sleep);


}
}


if (GetAsyncKeyState(VK_LMENU) & 1)
{
if (start)start = 0;
else
start = 1;
}


y = 0;
x = 0;
Sleep(100);
if (GetAsyncKeyState(VK_CONTROL)) {
break;
}


}
if (GetAsyncKeyState(VK_LMENU) & 1)
{
if (start)start = 0;
else
start = 1;
}
Опубликовано
  • Автор
comment_2613

 

Попробуй так:

int x, y, a, sleep;
x = 0;
y = 0;
a = System::Convert::ToInt32(textBox1->Text); // 25
sleep = System::Convert::ToInt32(textBox2->Text); // 50
bool start = 0;




while (true) {
// смещаем ось У на определенное кол-во пикселей зависящее от отдачи
if (start) {
while (GetAsyncKeyState(VK_LBUTTON)) {


y = y + a;
mouse_event(MOUSEEVENTF_MOVE, x, y, NULL, NULL);
y = 0;
Sleep(sleep);


}
}


if (GetAsyncKeyState(VK_LMENU) & 1)
{
if (start)start = 0;
else
start = 1;
}


y = 0;
x = 0;
Sleep(100);
if (GetAsyncKeyState(VK_CONTROL)) {
break;
}


}
if (GetAsyncKeyState(VK_LMENU) & 1)
{
if (start)start = 0;
else
start = 1;
}

 

да так только когда ее остановишь на CTRL, то уже не запуститься на ALT, придется еще раз нажимать кнопку start 

Опубликовано
  • Автор
comment_2614

Может я код не туда пишу, я его написал в событие кнопки, тип чтоб работать начинал при нажатии на кнопку Start. Просто я не особо понимаю, только учусь еще) 

Опубликовано
  • Автор
comment_2615

По идее можно добавить на форму событие KeyPress, но в описании написано что она будет работать когда форма активна это не подходит

Опубликовано
comment_2616

Ну на левый алт он должен отключаться и включаться а контрл совсем отключать.

Я так понимаю ты делаешь в виндовс форм. Ты можешь добавить таймер заместо цикла while и в таймере прописать эти функции

Тогда проще будет сделать 2 кнопки которые будут запускать таймер и останавливать 

Опубликовано
  • Автор
comment_2617

Ну на левый алт он должен отключаться и включаться а контрл совсем отключать.

Я так понимаю ты делаешь в виндовс форм. Ты можешь добавить таймер заместо цикла while и в таймере прописать эти функции

Тогда проще будет сделать 2 кнопки которые будут запускать таймер и останавливать 

Ну на левый алт он должен отключаться и включаться а контрл совсем отключать. - да именно это и пытаюсь

Про таймер спасибо сейчас почитаю про него.

а пока что у меня получилось это сделать но у меня форма зависает из-за цикла я так понимаю

int x, y, a, sleep;
		x = 0;
		y = 0;
		a = System::Convert::ToInt32(textBox1->Text); // 25
		sleep = System::Convert::ToInt32(textBox2->Text); // 50
		bool start = false;

		while (true) {
			if (GetAsyncKeyState(VK_LMENU) & 1)
			{
				start = !start;
			}
			while (start) {
				// смещаем ось У на определенное кол-во пикселей зависящее от отдачи
				while (GetAsyncKeyState(VK_LBUTTON)) {


					y = y + a;
					mouse_event(MOUSEEVENTF_MOVE, x, y, NULL, NULL);
					y = 0;
					Sleep(sleep);


				}
				y = 0;
				x = 0;
				Sleep(100);
				if (GetAsyncKeyState(VK_CONTROL)) {
					start = false;
					break;
				}

			}
		}	
Опубликовано
  • Автор
comment_2619

Форма виснет из-за цикла. У тебя 3 цикла в 1. Лучше 1 цикл и в нем функции. 

Понял спасибо, буду пробовать) 

Опубликовано
  • Автор
comment_2620

Еще один глупый вопрос)

Я написал код в таймере 

private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) {
		int x, y, a, sleep;
		x = 0;
		y = 0;
		a = System::Convert::ToInt32(textBox1->Text); // 25
		sleep = System::Convert::ToInt32(textBox2->Text); // 50
		bool start = false;
			if (GetAsyncKeyState(VK_LMENU) & 1)
			{
				start = !start;
			}
			while (start) {
				// смещаем ось У на определенное кол-во пикселей зависящее от отдачи
				while (GetAsyncKeyState(VK_LBUTTON)) {


					y = y + a;
					mouse_event(MOUSEEVENTF_MOVE, x, y, NULL, NULL);
					y = 0;
					Sleep(sleep);


				}
				y = 0;
				x = 0;
				Sleep(100);
				if (GetAsyncKeyState(VK_LMENU) & 1)
				{
					start = !start;
				}

			}
	}

он работает если я в программе сам присваиваю значение для переменных а и sleep, а если я пытаюсь получить значение из textBox то программа вылетает. Как можно сделать чтобы я сначала ввел значения, нажал на кнопку, а потом запустился таймер?

Опубликовано
  • Автор
comment_2621

Все разобрался, всего то надо было поменять свойство таймера) 

timer1->Enabled = !(timer1->Enabled);
		if (timer1->Enabled == true)
			button1->Text = "Stop";
		else
			button1->Text = "Start";

Тему можно закрывать, спасибо за помощь)

Опубликовано
comment_2622

Еще один глупый вопрос)

Я написал код в таймере 

private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) {
		int x, y, a, sleep;
		x = 0;
		y = 0;
		a = System::Convert::ToInt32(textBox1->Text); // 25
		sleep = System::Convert::ToInt32(textBox2->Text); // 50
		bool start = false;
			if (GetAsyncKeyState(VK_LMENU) & 1)
			{
				start = !start;
			}
			while (start) {
				// смещаем ось У на определенное кол-во пикселей зависящее от отдачи
				while (GetAsyncKeyState(VK_LBUTTON)) {


					y = y + a;
					mouse_event(MOUSEEVENTF_MOVE, x, y, NULL, NULL);
					y = 0;
					Sleep(sleep);


				}
				y = 0;
				x = 0;
				Sleep(100);
				if (GetAsyncKeyState(VK_LMENU) & 1)
				{
					start = !start;
				}

			}
	}

он работает если я в программе сам присваиваю значение для переменных а и sleep, а если я пытаюсь получить значение из textBox то программа вылетает. Как можно сделать чтобы я сначала ввел значения, нажал на кнопку, а потом запустился таймер?

Что то я запутался_) Добавь на кнопку

 timer1->Enabled = 1;
Опубликовано
comment_2623
a = System::Convert::ToInt32(textBox1->Text); // 25
        sleep = System::Convert::ToInt32(textBox2->Text); // 50

Перед конвертацией сделай проверку что текст бокс не пустой. А то вылетит если будет пустой чекбокс

Опубликовано
  • Автор
comment_2624
a = System::Convert::ToInt32(textBox1->Text); // 25
        sleep = System::Convert::ToInt32(textBox2->Text); // 50

Перед конвертацией сделай проверку что текст бокс не пустой. А то вылетит если будет пустой чекбокс

 

Сейчас как раз этим занимаюсь, еще хочу когда таймер активен заблокировать поля ввода 

Гость
Эта тема закрыта для публикации ответов.