Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.03.2013, 07:31
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Banny Hop для любой игры

Привет всем! Хочу написать bunny hop для любой игры.
bunny hop - (Кроличьи прыжки) в народе её попросту называют распрыжкой.
Нажал на пробел - прыгаешь бесконечно, отпустил пробел - перестал прыгать.

И так, я кинул на форму таймер, в таймере написал следущее:
Код:
begin
  tmr1.Enabled:=False;
keybd_event(VK_SPACE,0,0,0);
keybd_event(VK_SPACE,0,KEYEVENTF_KEYUP,0);
end;
Кинул еще 2 кнопки на форму, для проверки работоспособности программы... В button1 написал:
Код:
begin
tmr1.Enabled:=True;
end;
в button2:
Код:
begin
tmr1.Enabled:=False;
end;
Проверил - всё работает. Но есть одно НО, и я хотел бы что бы вы мне в этом помогли.
Для работы программы, нужно сделать так, что бы она работала в свернутом виде, либо пониз всех окон. Например играя в кс, окно кс будет поверх программы... И программа перестанет работать! Как сделать что бы она работала всегда? Это был первый вопрос.

Вопрос второй:
Как мне сделать так, что бы программа начала свою работу на определённую кнопку ? например на кнопку мышки, или допустим левый альт?
Получается при нажатии alt надо что бы она начинала свою работу, а при отжатии клавиши, выключалась(действие программы).

P.S. Я новичок....
Буду очень благодарен за помощь! Заранее спасибо!
Ответить с цитированием
  #2  
Старый 22.03.2013, 18:31
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
Радость

В общем у меня есть программа, по нажатию например на А, нажимается пробел. То-есть имитируется нажатие пробела (вроде правильно написал )
Но она работает только когда окно программы активно. А мне надо, что бы она могла работать даже в свернутом виде. Можно это реализовать ?

Вот полный код программы
Код:
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  
Старый 22.03.2013, 19:38
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Gareth
...имитируется нажатие пробела...
Код:
...
 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  
Старый 23.03.2013, 11:35
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Код:
...
 keybd_event(VK_SPACE,0,KEYEVENTF_EXTENDEDKEY,0);
 keybd_event(VK_SPACE,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
...
Таймер отрабатывает один раз, так и должно?
Это работает там, где есть фокус в данный момент времени. Не вырубайте таймер на время и убедитесь в этом.
Хм, нет, должен постоянно нажиматься пробел! Ну по крайней мере я на это рассчитывал ))
Ответить с цитированием
  #5  
Старый 23.03.2013, 13:17
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Gareth
...должен постоянно нажиматься пробел...
Нужны только клики, вкл и выкл
Код:
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  
Старый 23.03.2013, 13:28
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Клики лишние, достаточно KeyDown и KeyUp
Код:
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.Button1KeyUp(Sender: TObject; var Key: Word; 
 Shift: TShiftState); 
begin
if Key = 65 then
begin
tmr1.Enabled:= False; 
mmo1.Lines.Add('off'); 
end;   
end; 
Спасибо, я сглупил то что поставил в процедуре таймера enable:=false.
Сейчас убрал, включил программу, нажал кнопку, не отпуская её кликнул по браузеру, и он начал скроллится вниз. Попытался прокрутить вверх страничку - не получается, так как таймер всё еще работает. Получается что нужно опять зайти в программу и отжать там кнопку.

Как мне заставить программу работать в свернутом виде? Что бы она реагировала на нажатие кнопок на клавиатуре в свернутом виде?
Ответить с цитированием
  #7  
Старый 23.03.2013, 13:40
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Gareth
...Что бы она реагировала на нажатие кнопок на клавиатуре в свернутом виде?
Это сложнее немного, или через "горячие" клавиши - при запуске регистрируем
Код:
RegisterHotKey(Wnd, 0, MOD_WIN, Ord('А'));
в WindowProc их ловить, а при выходе наоборот
Код:
UnregisterHotKey(Wnd, 0);
или надо перехват на клаву вешать, что ещё сложнее, поскольку потребуется сторонняя библиотека с хуками.

Последний раз редактировалось Alegun, 23.03.2013 в 13:43.
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Gareth (23.03.2013)
  #8  
Старый 23.03.2013, 14:05
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Нашёл попроще способ
Код:
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  
Старый 23.03.2013, 18:24
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
З.Ы. А вот что с "горячей" клавишей "а" получилось
Либо я дурак, либо лыжи не едут ))))
Попробовал последний код, программа работает, но не останавливается! при повторном нажатии на горячую кнопку А не реагирует.
Я так понимаю этот способ без кнопок на форме..

Я уже вообще запутался))) Давай так.. Каким образом можно горячую клавишу привязать к кнопке ? То-есть пусть всё таки будут кнопки на форме)) на нажатие работает таймер, на отжатие не работает.
на первой кнопке таймер тру, а на второй фолс.
По нажатию на А, нажмется button1 и приведет в действие таймер, по отжатию А, нажмется button2, который вырубит таймер.
Я ведь новичок, мне так будет более понятно))
И спасибо за представленную выше работу!!!
Ответить с цитированием
  #10  
Старый 23.03.2013, 20:31
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Gareth
...Я уже вообще запутался...
Аналогично Система такая - если жать кнопку на форме, фокус будет у неё до отпускания. Соответстенно, фокуса у принимающей проги не будет и посылка нажатия до неё не дойдёт, даже с помощью (Get)SetForegroundWindow (нужна задержка). В первом варианте отслеживается жим или отжим кнопок на клаве, правда, всех сразу, т.е. только сами события. Но если проверять с помощью GetKeyState() какая кнопка нажата, можно и это определить. Потом проще, если "а" нажата, таймер (наверное даже и таймер так не нужен, если сейчас происходит KeyDown, то вызывается первая keybd_event, а по KeyUp вторая и всё :-) Потерялся смысл, проще на пробел руками давить.
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Gareth (23.03.2013)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:45.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025