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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2010, 05:40   #81
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
При использовании этой функции в окне вообще ничего не происходит.
Если бы недавно не плюсовал, то щас бы заминусовал. Потому что
Код:
function GetZdorovye: Integer;
var
res: int64;
begin
  res:=0;
  read_value($49DBFC,1, res);
  Result := res;
end;
Обращай внимание на то, что тебе компилятор пишет
Безымянный.jpg
Цитата:
Сообщение от http://www.google.ru/language_tools?hl=ru
Ахтунг: Возвращаемое значение функции 'GetZdorovye' может быть не определено
В твоем случае оно точно не определено.

Последний раз редактировалось Sibedir; 05.10.2010 в 05:48.
Sibedir вне форума Ответить с цитированием
Старый 05.10.2010, 06:59   #82
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Всё равно ничего не происходит.

Код:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  NadoLechitsa: Boolean;
  HotKey: Byte;
  hpMax, hpMin, hpNormal: Integer;

  WindowName              :Integer;
  Buf                     :PChar;
  HandleWindow            :Integer;
  WindowTitle             :String= 'www.awplanet.com';

implementation

function Find(s: string): hWnd;
var
  Wnd: hWnd;
  buff: array[0..127] of Char;
begin
  Find := 0;
  Wnd := GetWindow(application.Handle, gw_HWndFirst);
  while Wnd <> 0 do
  begin
    if (Wnd <> application.Handle) and
    IsWindowVisible(Wnd) and
    (GetWindow(Wnd, gw_Owner) = 0) and
    (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) then
    begin
      GetWindowText(Wnd, buff, sizeof(buff));
      if pos(s, StrPas(buff)) > 0 then
      begin
        Find := Wnd;
        Break;
      end;
    end;
    Wnd := GetWindow(Wnd, gw_hWndNext);
  end;
end;

function read_value (Addres:cardinal;ByteType:integer;var GetValue:int64):boolean;
var
  PID,PH:cardinal;
  rw:cardinal;
  exec:boolean;
  H:HWND;
begin
try
  h:=find(windowtitle);
  exec:=true;
  if h=0 then
    exec:=false;
  getwindowthreadprocessid(h,PID);
  PH:=openprocess(process_all_access,false,PID);
  if PH=0 then
    exec:=false;
  if readprocessmemory(PH,ptr(Addres),@GetValue,ByteType,rw)=false then
    exec:=false;
  closehandle(PH);
  result:=exec;
  finally
end;
end;

procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
 type
   TShiftKeyInfo = record
     shift: Byte;
     vkey: Byte;
   end;
   byteset = set of 0..7;
 const
   shiftkeys: array [1..3] of TShiftKeyInfo =
     ((shift: Ord(ssCtrl); vkey: VK_CONTROL),
     (shift: Ord(ssShift); vkey: VK_SHIFT),
     (shift: Ord(ssAlt); vkey: VK_MENU));
 var
   flag: DWORD;
   bShift: ByteSet absolute shift;
   i: Integer;
 begin
   for i := 1 to 3 do
   begin
     if shiftkeys[i].shift in bShift then
       keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0);
   end; { For }
   if specialkey then
     flag := KEYEVENTF_EXTENDEDKEY
   else
     flag := 0;

   keybd_event(key, MapvirtualKey(key, 0), flag, 0);
   flag := flag or KEYEVENTF_KEYUP;
   keybd_event(key, MapvirtualKey(key, 0), flag, 0);

   for i := 3 downto 1 do
   begin
     if shiftkeys[i].shift in bShift then
       keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0),
         KEYEVENTF_KEYUP, 0);
   end; { For }
 end; { PostKeyEx32 }

{$R *.dfm}

function GetZdorovye: Integer;
var
res: int64;
begin
  res:=0;
  read_value($49DBFC,4, res);
  Result:=res;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  res: int64;
begin
  res:=0;
  read_value($49DBFC,4, res);
  hpMax:=(res);
  hpMin:= Round (hpMax * 0.4);
  hpNormal:= Round (hpMax * 0.8);
  NadoLechitsa:= False;
  HotKey:= Ord ('1');
  Timer1.Enabled:=True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:=False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  HitPoints: Integer;
begin
  HitPoints:= GetZdorovye;

  NadoLechitsa:= (HitPoints < hpMin)
  or (NadoLechitsa and (HitPoints < hpNormal));
  if NadoLechitsa
  then PostKeyEx32(HotKey, [ssAlt], False);

  Inc (HotKey);
  if HotKey = Ord ('7')
  then Timer1.Enabled:= False;
end;

end.
Тут всё правильно?
xRamzeSx вне форума Ответить с цитированием
Старый 05.10.2010, 11:13   #83
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Тут всё правильно?
Вроде да. Одно замечание. Я так понял, $49DBFC - это адрес текщего состояния здоровья. Тогда почему hpMax считыватся из того-же адреса что и GetZdorovye. GetZdorovye должно возвращать текущее здоровье, а в hpMax должно храниться его максимальное значение. Соответственно адреса, из которых они считываются, должны быть разными. Если найти адрес, в котором хранится максимальное здоровье, не представляется возможным, то можно и так оставить. Только чуток подправить:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  res: int64;
begin
  hpMax:=GetZdorovye;
  hpMin:= Round (hpMax * 0.4);
  hpNormal:= Round (hpMax * 0.8);
  NadoLechitsa:= False;
  HotKey:= Ord ('1');
  Timer1.Enabled:=True;
end;
Цитата:
Всё равно ничего не происходит.
Три возможные причины:
1. По адресу $49DBFC хранится именно максимальное здоровье, а не его текущее состояние.
Устронение - Найти адрес с текущим состоянием здоровья.
2. На момент активации таймера персонаж уже получил повреждения.
Устронение - Перед активацией таймера восстановить здоровье до максимума.
3. Возможно персонаж не получил достаточно большого повреждения, необходимого для вызова горячих клавишь (GetZdorovye > hpMax*0.4).
Устронение - Активируйте таймер, стопорните пассажира с охр...но большим уровнем и скажите ему, что он kAzёл.
Sibedir вне форума Ответить с цитированием
Старый 05.10.2010, 11:20   #84
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Жизнь текущая: $0049DD9C
Жизнь полная: $0049DBFC

Видимо я ранее ошибся, сейчас попробую код подправить...
xRamzeSx вне форума Ответить с цитированием
Старый 05.10.2010, 11:21   #85
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

А-а-а, ну тогда просто
Код:
function GetZdorovye: Integer;
var
res: int64;
begin
  res:=0;
  read_value($0049DD9C,4, res);
  Result:=res;
end;
И больше ни чего менять не надо
Sibedir вне форума Ответить с цитированием
Старый 05.10.2010, 11:23   #86
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Но при этом в кнопе данный код, так?
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  res: int64;
begin
  res:=0;
  read_value($49DBFC,4, res);
  hpMax:=GetZdorovye;
  hpMin:= Round (hpMax * 0.4);
  hpNormal:= Round (hpMax * 0.8);
  NadoLechitsa:= False;
  HotKey:= Ord ('1');
  Timer1.Enabled:=True;
end;
Или этот?
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  hpMax:=GetZdorovye;
  hpMin:= Round (hpMax * 0.4);
  hpNormal:= Round (hpMax * 0.8);
  NadoLechitsa:= False;
  HotKey:= Ord ('1');
  Timer1.Enabled:=True;
end;
xRamzeSx вне форума Ответить с цитированием
Старый 05.10.2010, 11:32   #87
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Странно, но ничего не происходит. Не могли бы Вы проверить?
xRamzeSx вне форума Ответить с цитированием
Старый 05.10.2010, 11:35   #88
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Но при этом в кнопе данный код, так?
1 вариант (по старому)

Ща гляну, пока еще идет затянувшийся обед
Sibedir вне форума Ответить с цитированием
Старый 05.10.2010, 11:56   #89
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

А, ну конечно
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  HitPoints: Integer;
begin
  HitPoints:= GetZdorovye;
  NadoLechitsa:= (HitPoints < hpMin) or (NadoLechitsa and (HitPoints < hpNormal));
  if NadoLechitsa then begin
    PostKeyEx32(HotKey, [ssAlt], False);
    Inc (HotKey);
  end;
  if HotKey = Ord ('7') then Timer1.Enabled := False;
end;
Горячие клавиши сработали как надо, вовремя, о чем свидетельствует характерный звук в игре. Но почему-то окорочек не скушался.
Sibedir вне форума Ответить с цитированием
Старый 05.10.2010, 12:02   #90
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Хм... Что-то у меня ничего не выходит, или я не так пользуюсь...
Оставил персонажу 32 хп, нажимаю кнопку и переключаюсь в окно, но при этом ни звука, ни действия...

Добавлено

А что если попробовать сделать так...
Написать функцию, которая будет проверять состояние слота в кармане. Т.е Нажимаем кнопку, программа считывает значение здоровья перс-а из указанного адреса, если оно мненьше указанного, например HpMin:=30; тогда происходят процедуры "клавишника" - PostKeyEx32(HotKey, [ssAlt], False);
При этом, программа всё время проверяет кол-во текущего здоровья из данного адреса. При этом, если здоровье больше указанного, например HpNormal:=70;, тогда процедуры останавливаются...
Только одна проблемка, как это перевести в код...

Последний раз редактировалось xRamzeSx; 05.10.2010 в 12:16.
xRamzeSx вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Горячие клавиши dmitriegorovih Общие вопросы Delphi 2 10.09.2010 14:58
Горячие клавиши. Lazio Помощь студентам 2 08.09.2010 02:20
Горячие клавиши в Delphi Maddy Помощь студентам 7 23.04.2010 17:43
Горячие клавиши Altera Общие вопросы Delphi 5 13.09.2008 21:27