Форум работает в тестовом режиме. Все данные были перенесены со старого сайта 2018 года. Некоторая информация может быть недоступна, например вложения или хайды. Просьба сообщать о данных случаях через функционал "Жалоба", прямо под постом, где отсуствуют данные из хайда или проблемы с вложением.
Могут быть проблемы в "выкидыванием" с форума (слетевшей авторизацией). Нужно собрать статистику таких случаев.
Есть Тема, куда можете сообщить о проблемах с сайтом либо просто передать привет.

Hotkey binding.

Рег
3 Фев 2016
Сообщения
136
Реакции
0
function GetAsyncKeyState(vKey: integer): integer; stdcall; external 'user32.dll';
begin
while true do begin

begin
while GetAsyncKeyState(код клавиши в Delphi)=0 do Delay(100);
//то, что будет делать при нажатии на клавишу
end;
delay(100);
end;
end.
http://delphi-box.ru/kodi-klavish-delphi.html
 
в строку после do что я прописываю? useskill.id? или название скила
 
Пример:
Код:
var
  msg:string;

function GetAsyncKeyState(vKey: integer): integer; stdcall; external 'user32.dll';
function GetKeyState(nVirtKey: integer): byte; stdcall; external 'user32.dll';

function KeyDown(K : byte) : boolean;
begin
  Result := (K = 128) or (K = 129)
end;
function SHIFT : boolean;
begin
  Result := KeyDown(GetKeyState($10));
end;
function CTRL : boolean;
begin
  Result := KeyDown(GetKeyState($11));
end;
function ALT : boolean;
begin
  Result := KeyDown(GetKeyState($12));
end;

function _Key:string;
begin
  result:='';
  if shift then result:=('with shift');
  if alt then result:=('with alt');
  if ctrl then result:=('with ctrl');
end;

procedure CheckPressKey_Q;
begin
  while true do begin
    while GetAsyncKeyState(ord('Q'))=0 do Delay(100);
    msg:='Pressed Q '+_Key;
    print(msg);
    Engine.SetTarget(User);
    while GetAsyncKeyState(ord('Q'))<>0 do Delay(100);
  end;
end;
procedure CheckPressKey_W;
begin
  while true do begin
    while GetAsyncKeyState(ord('W'))=0 do Delay(100);
    msg:='Pressed W '+_key;
    print(msg);
    Engine.UseSkill(423);
    while GetAsyncKeyState(ord('W'))<>0 do Delay(100);
  end;
end;
procedure CheckPressKey_E;
begin
  while true do begin
    while GetAsyncKeyState(ord('E'))=0 do Delay(100);
    msg:='Pressed E '+_key;
    print(msg);
    Engine.SetTarget(User);
    Engine.UseSkill(1323);
    while GetAsyncKeyState(ord('E'))<>0 do Delay(100);
  end;
end;
procedure CheckPressKey_R;
begin
  while true do begin
    while GetAsyncKeyState(ord('R'))=0 do Delay(100);
    msg:='Pressed R '+_key;
    print(msg);
    Engine.UseSkill(94);
    while GetAsyncKeyState(ord('R'))<>0 do Delay(100);
  end;
end;
begin
  //нити с обработчиками клавиш Q-W-E-R
  //реагируют на комбинации с альт\ктрл\шифт
  Script.NewThread(@CheckPressKey_Q);
  Script.NewThread(@CheckPressKey_W);
  Script.NewThread(@CheckPressKey_E);
  Script.NewThread(@CheckPressKey_R);
end.
 
почему не проверять нажатия через waitaction? в разы меньше кода.
 
Понятия не имею, как через WaitAction отслеживать комбинации клавиш.
 
@SoundShocking, Все работает как надо, только не могу понять куда надо прописать, чтобы работали через шифт\альт, 'Pressed W '+_key; здесь менял, нечего не получалось
 
Ну я там немного запутанно, конечно, сваял.
Попробуй использовать примерно так:

procedure CheckPressKey_Q;
begin
while true do begin
while (GetAsyncKeyState(ord('Q'))=0)or(Not Alt) do Delay(100);//если не нажата клавиша Q или Alt - выполняем "пустой" цикл.
msg:='Press Q '+_Key;
print(msg);
Engine.SetTarget(User);
while GetAsyncKeyState(ord('Q'))<>0 do Delay(100);
end;
end;

Это для комбинации Alt+Q. По аналогии -

procedure CheckPressKey_Q;
begin
while true do begin
while (GetAsyncKeyState(ord('Q'))=0)or(Not Shift) do Delay(100);//если не нажата клавиша Q или Shift - выполняем "пустой" цикл.
msg:='Pressed Q +shift';
print(msg);
while GetAsyncKeyState(ord('Q'))<>0 do Delay(100);
end;
end;

Для Shift+Q.
 
@BreadfanLock, Все работает, огромное спасибо.

@BreadfanLock, Чтобы чар одевал пуху, или юзал макрос по бинду, какую команду надо прописать?
 
Ну макрос ты просто так не заюзаешь. Для этого надо его (макрос) вытащить на панель ярлыков, дабы ему соответствовала какая-либо клавиша, и уже ее "нажимать" скриптом.
А пуху - просто (случай, при котором в сумке нет пух с одинаковыми названиями):
Код:
function GetAsyncKeyState(vKey: integer): integer; stdcall; external 'user32.dll';
function GetKeyState(nVirtKey: integer): byte; stdcall; external 'user32.dll';

function KeyDown(K : byte) : boolean;
begin
 Result := (K = 128) or (K = 129)
end;
function SHIFT : boolean;
begin
 Result := KeyDown(GetKeyState($10));
end;
function CTRL : boolean;
begin
 Result := KeyDown(GetKeyState($11));
end;
function ALT : boolean;
begin
 Result := KeyDown(GetKeyState($12));
end;

procedure CheckPressKey_Q;
begin
 while true do begin
  while (GetAsyncKeyState(ord('Q'))=0)or(Not Alt) do Delay(100);
  Engine.UseItem('Пылающая Пила');
  while GetAsyncKeyState(ord('Q'))<>0 do Delay(100);
 end;
end;
procedure CheckPressKey_W;
begin
 while true do begin
  while (GetAsyncKeyState(ord('W'))=0)or(Not Alt) do Delay(100);
  Engine.UseItem('Молот Берестира - PvP');
  while GetAsyncKeyState(ord('W'))<>0 do Delay(100);
 end;
end;

begin
 Script.NewThread(@CheckPressKey_Q);
 Script.NewThread(@CheckPressKey_W);
end.
 
BreadfanLock написал(а):
Все получается, но когда я забиндил разные команды и на W и Alt+W, оно не всегда сразу делает комнаду альт+W, можно ли как-то исправить?
и еще как добавить другие клавиши кроме этих четырех?




procedure CheckPressKey_W;
begin


while true do begin
while GetAsyncKeyState(ord('W'))=0 do Delay(100);
msg:='Pressed W '+_key;
print(msg);
Engine.UseSkill(176);
while GetAsyncKeyState(ord('W'))<>0 do Delay(100);

while (GetAsyncKeyState(ord('W'))=0)or(Not Alt) do Delay(100);
msg:='Press W '+_Key;
print(msg);
Engine.UseItem(8119);
while GetAsyncKeyState(ord('W'))<>0 do Delay(100);

end;
end;
 
1. Это получается в связи с тем, что при проверке на нажатость Q (исхожу из кода скрипта, а не его описания) - не проверяется нажатие доп. клавиш - альт\ктрл\шифт.
Для разделения нужно модифицировать код процедуры как-то так:

Код:
procedure CheckPressKey_Q;
begin
  while true do begin
    while GetAsyncKeyState(ord('Q'))=0 do Delay(100);
    if (Alt)and(Not Ctrl)and(Not Shift) then Engine.UseSkill(94)
    if (Not Alt)and(Not Ctrl)and(Not Shift) then Engine.UseSkill(420);
    while GetAsyncKeyState(ord('Q'))<>0 do Delay(100);
  end;
end;
ЗЫ: строки с
Код:
    msg:='Pressed W '+_key;
    print(msg);
тебе не нужны, они просто логировали нажатие.

2. Добавить....да по аналогии и добавляй.
Код:
procedure MyProcName;
begin
 while true do begin
  while (GetAsyncKeyState(ord('...'))=0)..тут доп параметры если необходимо... do Delay(100);//цикл - проверяющий нажата ли нужная клавиша\комбинация, если нет, то выполняется пустой цикл.
  .....Тут функция\процедура, выполняющаяся при нажатии комбинации...
  while GetAsyncKeyState(ord(...таже клавиша что и в первой проверке...))<>0 do Delay(100);//а этот цикл необходим для того, чтобы избежать повторного ошибочного вызова при длительном удерживании вызывающей комбинации. Если этого не требуется - можно строку убрать.
 end;
end;

ну и конечно в основном теле скрипта (это блок обычно в самом конце, ограничен begin end.) - создать нить для процедуры
  Script.NewThread(@MyProcName);
ЗЗЫ: GetAsyncKeyState(ord('Q'), GetAsyncKeyState(81), GetAsyncKeyState($51) - параметр функции одинаков во всех трех случаях, но первый вариант просто нагляднее.
 
@BreadfanLock, Спасибо, со всем разобрался, с начало не получалось добавить новую букву, так как не прописывал нить процедуры, теперь все ок.
 
Доброе время суток...
var
msg:string;

function GetAsyncKeyState(vKey: integer): integer; stdcall; external 'user32.dll';
function GetKeyState(nVirtKey: integer): byte; stdcall; external 'user32.dll';

function KeyDown(K : byte) : boolean;
begin
Result := (K = 128) or (K = 129)
end;
function SHIFT : boolean;
begin
Result := KeyDown(GetKeyState($10));
end;
function CTRL : boolean;
begin
Result := KeyDown(GetKeyState($11));
end;
function ALT : boolean;
begin
Result := KeyDown(GetKeyState($12));
end;

function _Key:string;
begin
result:='';
if shift then result:=('with shift');
if alt then result:=('with alt');
if ctrl then result:=('with ctrl');
end;

procedure CheckPressKey_Q;
begin
while true do begin
while GetAsyncKeyState(ord('Q'))=0 do Delay(100);
msg:='Pressed Q '+_Key;
print(msg);
Engine.UseItem(14142);
Engine.UseSkill(3169);
while GetAsyncKeyState(ord('Q'))<>0 do Delay(100);
end;
end;
procedure CheckPressKey_W;
begin
while true do begin
while GetAsyncKeyState(ord('W'))=0 do Delay(100);
msg:='Pressed W '+_key;
print(msg);
Engine.UseItem(14125);
Engine.UseSkill(3170);
while GetAsyncKeyState(ord('W'))<>0 do Delay(200);
end;
end;
procedure CheckPressKey_E;
begin
while true do begin
while GetAsyncKeyState(ord('E'))=0 do Delay(100);
msg:='Pressed E '+_key;
print(msg);
Engine.UseItem(15856);
Engine.UseSkill(3171);
while GetAsyncKeyState(ord('E'))<>0 do Delay(100);
end;
end;
procedure CheckPressKey_R;
begin
while true do begin
while GetAsyncKeyState(ord('R'))=0 do Delay(100);
msg:='Pressed R '+_key;
print(msg);
Engine.UseSkill(3204);
while GetAsyncKeyState(ord('R'))<>0 do Delay(100);
end;
end;
begin
//нити с обработчиками клавиш Q-W-E-R
//реагируют на комбинации с альт\ктрл\шифт
Script.NewThread(@CheckPressKey_Q);
Script.NewThread(@CheckPressKey_W);
Script.NewThread(@CheckPressKey_E);
Script.NewThread(@CheckPressKey_R);
end.
добавил ид пухи и нюк из пухи)
вот вопрос в том что не успевает скил откатиться )
нужен интервал между кастом и надеванием... как это сделать?
 
Назад
Сверху