Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2010, 17:31   #1
SPQR10000
Пользователь
 
Регистрация: 23.09.2009
Сообщений: 48
По умолчанию ХотКеи

Привет,уважаемые!)
У меня вот проблема-я не знаю как написать хоткеи правильно!
В моей программе нужно,чтобы при нажатии например,R -программа сменит значение на другое!
Тоесть алгоритм таков:
программа каждые 10 мс сканит таймером на нажатие клавиш,и если нажать R или V то произойдет действие.
Можете помочь дописать хоткеи?
код прилагаю:
Код:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, StdCtrls, XPMan, ComCtrls,tlhelp32;

type
  TTrainer = class(TForm)
    logo: TImage;
    info: TLabel;
    T1: TTimer;
    XPMan: TXPManifest;
    procedure FormCreate(Sender: TObject);
    procedure T1Timer(Sender: TObject);
  private
THotKey : packed record
  hkPressed: boolean;
  hkKeyIndex: integer;
  public
    { Public declarations }
  end;

var
  Trainer: TTrainer;
sil,zvh,int,povr,krit,ar,zvh2,zasch,mag,zaschad,zaschogon,
zaschmolniya,zaschholod,mitril:boolean;
hProcess:thandle=0;
//hkKeyIndex:integer; // это индекс клавиши
//hkPressed:boolean; // это флаг нажатия
HotKeys:array [0..13] of THotKey;

implementation

{$R *.dfm}

function GetProcessIdByName(exename:string):dword;
var
Snap:dword;
ProcessEntry:processentry32;
begin
Snap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(Snap<>INVALID_HANDLE_VALUE) then begin
ProcessEntry.dwSize:=sizeof(ProcessEntry);
if(Process32First(Snap,ProcessEntry)) then begin
while(ProcessEntry.szExeFile<>exename) do begin
if not Process32Next(Snap,ProcessEntry) then begin
result:=0;
CloseHandle(Snap);
exit;
end;
end;
result:=ProcessEntry.th32ProcessID;
end;
end;
end;

procedure TTrainer.FormCreate(Sender: TObject);
var
ProcessId:dword;
begin
ProcessId:=GetProcessIdByName('demul.exe');
if(ProcessId=0) then begin
Showmessage('Сначала запустите эмулятор!');
ExitProcess(0);// тут ругаемся на то, что "нужно сначала запустить эмулятор" и выходим из программы
end;

hProcess:=OpenProcess(PROCESS_ALL_ACCESS, false, ProcessId);
if(hProcess=0) then begin
Showmessage('Не удалось открыть процесс!');
ExitProcess(0); // ругаемся что не удалось открыть процесс, и выходим из программы
HotKey[0].hkKeyIndex:=VK_NUMPAD0;
HotKey[1].hkKeyIndex:=VK_NUMPAD1;
HotKey[2].hkKeyIndex:=VK_NUMPAD2;
HotKey[3].hkKeyIndex:=VK_NUMPAD3;
HotKey[4].hkKeyIndex:=VK_NUMPAD4;
HotKey[5].hkKeyIndex:=VK_NUMPAD5;
HotKey[6].hkKeyIndex:=VK_NUMPAD6;
HotKey[7].hkKeyIndex:=VK_NUMPAD7;
HotKey[8].hkKeyIndex:=VK_NUMPAD8;
HotKey[9].hkKeyIndex:=VK_NUMPAD9;
HotKey[10].hkKeyIndex:=VK_F1;
HotKey[11].hkKeyIndex:=VK_F2;
HotKey[12].hkKeyIndex:=VK_F3;
HotKey[13].hkKeyIndex:=VK_F4;
t1.Enabled:=true;
end;
end;

function GetHotKeyStatus(hkIndex:integer):boolean;
begin
if(HotKeys(hkIndex).hkPressed=false) then begin
if(GetAsyncKeyState(HotKeys(hkIndex).hkKeyIndex)<>0) then begin
HotKeys(hkIndex).hkPressed:=true;
result:=true;
exit;
end;
end;
result:=false;
end;

procedure wint(addr,value:integer);
var
j:cardinal;
begin
WriteProcessMemory(hProcess, pointer(addr), @value, sizeof(value), j);
end;

procedure TTrainer.T2Timer(Sender: TObject);
begin
if(GetHotKeyStatus(0):=true) then sil:=not sil;
if(sil=true) then wint($123456789,1000);
if(GetHotKeyStatus(0):=true) then zvh:=not zvh;
if(zvh=true) then wint($123456789,1000);
if(GetHotKeyStatus(0):=true) then int:=not int;
if(int=true) then wint($123456789,1000);
if(GetHotKeyStatus(0):=true) then povr:=not povr;
if(povr=true) then wint($123456789,5000);
if(GetHotKeyStatus(0):=true) then krit:=not krit;
if(krit=true) then wint($123456789,999);
if(GetHotKeyStatus(0):=true) then ar:=not ar;
if(ar=true) then wint($123456789,3000);
if(GetHotKeyStatus(0):=true) then zvh2:=not zvh2;
if(zvh2=true) then wint($123456789,3000);
if(GetHotKeyStatus(0):=true) then zasch:=not zasch;
if(zasch=true) then wint($123456789,3000);
if(GetHotKeyStatus(0):=true) then mag:=not mag;
if(mag=true) then wint($123456789,3000);
if(GetHotKeyStatus(0):=true) then zaschad:=not zaschad;
if(zaschad=true) then wint($123456789,99);
if(GetHotKeyStatus(0):=true) then zaschogon:=not zaschogon;
if(zaschogon=true) then wint($123456789,99);
if(GetHotKeyStatus(0):=true) then zaschmolniya:=not zaschmolniya;
if(zaschmolniya=true) then wint($123456789,99);
if(GetHotKeyStatus(0):=true) then zaschholod:=not zaschholod;
if(zaschholod=true) then wint($123456789,99);
if(GetHotKeyStatus(0):=true) then mitril:=not mitril;
if(mitril=true) then wint($123456789,99999999);
end;
application.ProcessMessages;
end;
end;

end.
SPQR10000 вне форума Ответить с цитированием
Старый 25.12.2010, 23:22   #2
SPQR10000
Пользователь
 
Регистрация: 23.09.2009
Сообщений: 48
По умолчанию

может,есть какие-нибудь идеи?я читал темы про компонент и про регистрацию в самой проге.
Но мой выбор WinAPI,ну и также метод регистрации тоже сойдет.
Можете помочь с ним?
SPQR10000 вне форума Ответить с цитированием
Старый 26.12.2010, 07:02   #3
MaxNik2009
Форумчанин
 
Аватар для MaxNik2009
 
Регистрация: 17.09.2009
Сообщений: 294
По умолчанию

почитай про RegisterHotKey.
принимаю благодарности в письменном виде( весы слева)...
MaxNik2009 вне форума Ответить с цитированием
Старый 26.12.2010, 12:28   #4
SPQR10000
Пользователь
 
Регистрация: 23.09.2009
Сообщений: 48
По умолчанию

ага,хорошо!
SPQR10000 вне форума Ответить с цитированием
Старый 26.12.2010, 12:54   #5
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

А зачем использовать хоткеи, разве обычных событий OnKeypress и т.д. недостаточно?
x128 вне форума Ответить с цитированием
Старый 26.12.2010, 15:28   #6
SPQR10000
Пользователь
 
Регистрация: 23.09.2009
Сообщений: 48
По умолчанию

нет,так как при нажатии в игре на F1, F2,Num0 и т.д-трейнер должен добавлять митрил,статы и т.п-вот для чего мне нужны хоткеи!
SPQR10000 вне форума Ответить с цитированием
Старый 29.12.2010, 15:28   #7
SPQR10000
Пользователь
 
Регистрация: 23.09.2009
Сообщений: 48
По умолчанию

в общем,разобрался я в них,окромя одного:
у меня тут ошибка- нет объявления HotKeys.
Где мне их обьявить,подскажите пожалуйста!
P.S:Я пытался обьявить после privat declarations,но тогда куча ошибок вылазит((
SPQR10000 вне форума Ответить с цитированием
Старый 30.12.2010, 06:32   #8
MaxNik2009
Форумчанин
 
Аватар для MaxNik2009
 
Регистрация: 17.09.2009
Сообщений: 294
По умолчанию

вот тебе пример, разбирайся:
Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    procedure HotKey(var M: TWMHotKey); message wm_HotKey;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  idHK: word;

implementation

{$R *.dfm}


procedure TForm2.FormCreate(Sender: TObject);
begin
  { регистрация HotKey }
  idHK:= GlobalAddAtom('Num0');
  RegisterHotKey(handle, idHK, 0, VK_NUMPAD0);
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
  { Удаление HotKey }
  UnregisterHotKey(handle, idHK);
  DeleteAtom(idHK);
end;

procedure TForm2.HotKey(var M: TWMHotKey);
begin
  if M.HotKey = idHK then  // если нажата наша горячая кнопка
    ShowMessage('нажата кнопка num0');
  inherited;
end;

end.
принимаю благодарности в письменном виде( весы слева)...
MaxNik2009 вне форума Ответить с цитированием
Старый 30.12.2010, 10:10   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Можете помочь дописать хоткеи?
Достали хоткей? Надоел WinAPI? Только сегодня и только для вас. Встречайте, старая новинка сезона, такого вы больше нигде не увидите - ActionManager. Он станет вашим лучшим помошником в реализации горячих клавиш. Имеет функцию поддержки температуры клавиш. Ваши клавиши никогда не остынут, и будут вечно давать тепло не хуже советских батарей. Спешите, акция - Киньте на форму один ActionManager, и получите в придачу буклетик с описанием в папке \Demos\ActionBands\.
Поспешите, акция длится всего лишь всю жизнь, а ведь это так мало
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц