![]() |
|
#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
|
|||
|
|||
![]() Цитата:
|