![]() |
|
|
#1
|
|||
|
|||
|
Здравствуйте!
Мне надо послать в окно другой программы многократную имитацию нажатия и отжатия кнопки SPACE (пробел). Мне это дело надо пустить именно в потоке. Но не знаю как... С потоками имею дело в первые. Прочитал про них статейку, узнал как добавлять мастером и вручную. Предпочел вручную.. Не буду отходить от темы). Обычно я делал тот же трюк с пробелом , что описал выше, через таймер. А как мне это сделать в потоке? Написать в потоке цикл While ? Дело в том, что я делаю программку, ну, если можно назвать, вспомогательной для игры cs 1.6)) Сделал Анти-отдачу, тихий бег и тд.. И всё это у меня держится на таймерах... По этому задумался о потоках... ![]() Последний раз редактировалось Gareth, 23.04.2015 в 14:28. |
|
#2
|
||||
|
||||
|
не нужны здесь потоки
|
|
#3
|
|||
|
|||
|
Цитата:
И всё таки подскажите, как это реализовать.. Я попробовал так: Код:
flag:Boolean; cs:HWND; Код:
procedure TMyThread.Execute;
begin
while flag=True do
begin
if GetForegroundWindow=cs then
begin
SendMessage(cs,WM_KEYDOWN ,VK_SPACE, MakeLong(0, MapVirtualKey(VK_SPACE, 0)));
sleep(10);
SendMessage(cs,WM_KEYUP ,VK_SPACE, MakeLong(0, MapVirtualKey(VK_SPACE, 0)));
Sleep(1);
end;
end;
end;С этим кодом не могу в игре двигаться, тупо прыгает и всё, даже если отключить, он отключается через несколько секунд. Скажите хотя бы почему так. Хоть для себя узнаю что-то новое.. Я бы сделал в программе через таймер всё... Но там и так уже 5 таймеров работают... И к тому же если посылать в окно игры нажатие пробела в таймере, то откровенно говоря коряво работает, должен постоянно прыгать, то-есть, как только коснулся земли, должен сразу прыгнуть. Таймер не спровляется, он не может дать столько нажатий в секунду, сколько надо.. Поток в этом деле может помочь ? Только что попробовал увеличить sleep(...) работа стала как и в таймере, можно двигаться и тд, но прыгает плохо... Последний раз редактировалось Gareth, 23.04.2015 в 15:43. |
|
#4
|
||||
|
||||
|
именно не нужны
|
|
#5
|
|||
|
|||
|
Цитата:
Если в курсе, ответьте пожалуйста на такой вопрос: Есть игровая мышь x7, в ней можно делать макросы. Я сделал макрос, в макросе код: Код:
кнопка прыжка задержка 10 мс Всё работает идеально. Почему таймер в Delphi не способен сделать тоже самое, даже при меньших задержках ? |
|
#6
|
||||
|
||||
|
сделай в Delphi как в мышке, то бишь в цикле
|
|
#7
|
|||
|
|||
|
Цитата:
Код:
flag:boolean;
cs:HWND;
........
procedure TForm1.FormCreate(Sender: TObject);
begin
cs:=FindWindow(nil, 'Counter-Strike');
while flag=True do
begin
if GetAsyncKeyState(VK_MBUTTON)<>0 then
begin
SendMessage(cs,WM_KEYDOWN ,VK_SPACE, MakeLong(0, MapVirtualKey(VK_SPACE, 0)));
Sleep(1);
SendMessage(cs,WM_KEYUP ,VK_SPACE, MakeLong(0, MapVirtualKey(VK_SPACE, 0)));
Sleep(1);
end;
end;
end;Всё ровно в игре чувствуется задержка. С макросом, если в игре бежать вперед, нажать кнопку макроса и отпустить бег вперед, то он прыгает еще долго вперед, по инерции... Всё что я не пробовал в Delphi, не может повторить такого.. То-есть он так же пригает по инерции дальше, но гораздо меньше времени. Если с макросом по инерции прыгает сикунд 10-15, то с Delphi прогой около 3-5 секунд. Или я что-то не правильное сделал в цикле? Может Getasynckeystate каким-то образом влияет на быстроту выполнения? Может не правильно эмулирую space? Пробовал еще через keybd_event();, но в игре не прыгает, но если открыть консоль, то в консоле бегут порбелы в строке. Значит посылка в окно кс осуществляется, но почему не прыгает!? Еще пробовал увеличить приоритет программы - Высокий, до лампочки. Короче я запутался окончательно)) Помогите, дайте какую-нибудь идею, как можно с минимальными задержками имитировать нажатие пробела? Последний раз редактировалось Gareth, 24.04.2015 в 12:48. |
|
#8
|
||||
|
||||
|
Код:
SendMessage(Handle, WM_KEYDOWN, VK_SPACE, 0); Sleep(10); SendMessage(Handle, WM_KEYUP, VK_SPACE, 0); |
|
#9
|
|||
|
|||
|
Цитата:
|