![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Привет всем! Хочу написать bunny hop для любой игры.
bunny hop - (Кроличьи прыжки) в народе её попросту называют распрыжкой. Нажал на пробел - прыгаешь бесконечно, отпустил пробел - перестал прыгать. И так, я кинул на форму таймер, в таймере написал следущее: Код:
begin tmr1.Enabled:=False; keybd_event(VK_SPACE,0,0,0); keybd_event(VK_SPACE,0,KEYEVENTF_KEYUP,0); end; Код:
begin tmr1.Enabled:=True; end; Код:
begin tmr1.Enabled:=False; end; Для работы программы, нужно сделать так, что бы она работала в свернутом виде, либо пониз всех окон. Например играя в кс, окно кс будет поверх программы... И программа перестанет работать! Как сделать что бы она работала всегда? Это был первый вопрос. Вопрос второй: Как мне сделать так, что бы программа начала свою работу на определённую кнопку ? например на кнопку мышки, или допустим левый альт? Получается при нажатии alt надо что бы она начинала свою работу, а при отжатии клавиши, выключалась(действие программы). P.S. Я новичок.... Буду очень благодарен за помощь! Заранее спасибо! |
|
#2
|
|||
|
|||
|
В общем у меня есть программа, по нажатию например на А, нажимается пробел. То-есть имитируется нажатие пробела (вроде правильно написал
)Но она работает только когда окно программы активно. А мне надо, что бы она могла работать даже в свернутом виде. Можно это реализовать ? Вот полный код программы Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
tmr1: TTimer;
Button1: TButton;
Button2: TButton;
mmo1: TMemo;
procedure tmr1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Button1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.tmr1Timer(Sender: TObject);
begin
tmr1.Enabled:=False;
keybd_event(VK_SPACE,0,0,0);
keybd_event(VK_SPACE,0,KEYEVENTF_KEYUP,0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
tmr1.Enabled:=True;
mmo1.Lines.Add('on');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
tmr1.Enabled:=False;
mmo1.Lines.Add('off');
end;
procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 65 then
Form1.Button1.Click;
end;
procedure TForm1.Button1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 65 then
Form1.Button2.Click;
end;
end.Если держать программу поверх браузера, и включить таймер (который повторяет нажатие пробела) и резко нажать на браузер, то можно заметить как страница браузера прокручивается! Это говорит о том, что программа действительно работает. ))))) Помогите ребята. Последний раз редактировалось Gareth, 23.03.2013 в 17:33. |
|
#3
|
||||
|
||||
|
Цитата:
Код:
... keybd_event(VK_SPACE,0,KEYEVENTF_EXTENDEDKEY,0); keybd_event(VK_SPACE,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0); ... Это работает там, где есть фокус в данный момент времени. Не вырубайте таймер на время и убедитесь в этом. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Gareth (23.03.2013)
| ||
|
#4
|
|||
|
|||
|
Цитата:
|
|
#5
|
||||
|
||||
|
Цитата:
Код:
procedure TForm1.tmr1Timer(Sender: TObject);
begin
keybd_event(VK_SPACE,0,KEYEVENTF_EXTENDEDKEY,0);// Жмём
keybd_event(VK_SPACE,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0); //Отпускаем
end;
procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 65 then
begin
tmr1.Enabled:= True;
mmo1.Lines.Add('on');
end;
end;
procedure TForm1.Button2KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 65 then
begin
tmr1.Enabled:= False;
mmo1.Lines.Add('off');
end;
end; Последний раз редактировалось Alegun, 23.03.2013 в 13:23. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Gareth (23.03.2013)
| ||
|
#6
|
|||
|
|||
|
Цитата:
Сейчас убрал, включил программу, нажал кнопку, не отпуская её кликнул по браузеру, и он начал скроллится вниз. Попытался прокрутить вверх страничку - не получается, так как таймер всё еще работает. Получается что нужно опять зайти в программу и отжать там кнопку. Как мне заставить программу работать в свернутом виде? Что бы она реагировала на нажатие кнопок на клавиатуре в свернутом виде? |
|
#7
|
||||
|
||||
|
Цитата:
Код:
RegisterHotKey(Wnd, 0, MOD_WIN, Ord('А'));Код:
UnregisterHotKey(Wnd, 0); Последний раз редактировалось Alegun, 23.03.2013 в 13:43. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Gareth (23.03.2013)
| ||
|
#8
|
||||
|
||||
|
Нашёл попроще способ
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
kbHook: HHOOK;
function kbProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
begin
Result := CallNextHookEx(kbHook, nCode, WParam, LParam);
if WParam = WM_KEYDOWN {WM_KEYUP} then // можно определить лишь нажата\ отжата :-)
// Вот здесь всё и происходит, проверил, работает и в "свёрнутом" виде
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
kbHook := SetWindowsHookEx(13, @kbProc, HInstance, 0);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnhookWindowsHookEx(kbHook);
end;
end.Добавлено позже З.Ы. А вот что с "горячей" клавишей "а" получилось Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
tmr1: TTimer;
mmo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure tmr1Timer(Sender: TObject);
private
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.tmr1Timer(Sender: TObject);
begin
keybd_event(VK_SPACE,0,KEYEVENTF_EXTENDEDKEY,0);
keybd_event(VK_SPACE,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
if tmr1.Enabled then
begin
tmr1.Enabled:= false;
mmo1.Lines.Add('off');
end else
begin
tmr1.Enabled:= true;
mmo1.Lines.Add('on');
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotKey(Form1.Handle, 65, 0, 65);
tmr1.Enabled:=false;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(Form1.Handle, 65);
end;
end.Последний раз редактировалось Alegun, 23.03.2013 в 17:00. Причина: Дополнение |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Gareth (23.03.2013)
| ||
|
#9
|
|||
|
|||
|
Цитата:
Попробовал последний код, программа работает, но не останавливается! при повторном нажатии на горячую кнопку А не реагирует. Я так понимаю этот способ без кнопок на форме.. Я уже вообще запутался))) Давай так.. Каким образом можно горячую клавишу привязать к кнопке ? То-есть пусть всё таки будут кнопки на форме)) на нажатие работает таймер, на отжатие не работает. на первой кнопке таймер тру, а на второй фолс. По нажатию на А, нажмется button1 и приведет в действие таймер, по отжатию А, нажмется button2, который вырубит таймер. Я ведь новичок, мне так будет более понятно)) И спасибо за представленную выше работу!!! ![]() |
|
#10
|
||||
|
||||
|
Цитата:
Система такая - если жать кнопку на форме, фокус будет у неё до отпускания. Соответстенно, фокуса у принимающей проги не будет и посылка нажатия до неё не дойдёт, даже с помощью (Get)SetForegroundWindow (нужна задержка). В первом варианте отслеживается жим или отжим кнопок на клаве, правда, всех сразу, т.е. только сами события. Но если проверять с помощью GetKeyState() какая кнопка нажата, можно и это определить. Потом проще, если "а" нажата, таймер (наверное даже и таймер так не нужен, если сейчас происходит KeyDown, то вызывается первая keybd_event, а по KeyUp вторая и всё :-) Потерялся смысл, проще на пробел руками давить. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Gareth (23.03.2013)
| ||