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

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

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

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

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

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

Вечером гляну

Вместо
Код:
function read_value(Addres:cardinal;ByteType:integer;
var
GetValue:int64):boolean;
Напиши нормально
Код:
function read_value (Addres:cardinal;ByteType:integer;var GetValue:int64):boolean;
И поймешь в чем дело.
Delphi начинает после этого varнемножко глючить и не на ту строку указывать. Я с таким первый раз сталкиваюсь. Прикольный баг.

Последний раз редактировалось Stilet; 29.09.2010 в 07:39.
Sibedir вне форума Ответить с цитированием
Старый 29.09.2010, 07:27   #62
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Изменил код, вот что получилось:
Код:
unit Unit1;

interface

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

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

var
  Form1: TForm1;
  NadoLechitsa: Boolean;
  HotKey: Byte;
  hpMax, hpKritichMin, GetZdorovye, hpNormal: Integer;
  WindowName              :Integer; //--- Имя окна
  Buf                     :PChar; //--- Буфер памяти
  HandleWindow            :Integer; //--- Доп. окно
  WindowTitle             :String= 'www.awplanet.com'; //--- Название окна игры

implementation

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 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 TForm1.Button1Click(Sender: TObject);
begin
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 < hpKritichMin)
  or (NadoLechitsa and (HitPoints < hpNormal));
  if NadoLechitsa
  then PostKeyEx32(HotKey, [ssAlt], False);

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

procedure TForm1.Timer2Timer(Sender: TObject);
var
res: int64;
begin
  res:=0;
  read_value($49DBFC,1, res);
  hpMax:=(res);
  hpKritichMin:= Round (hpMax * 0.2);
  hpNormal:= Round (hpMax * 0.8);
  NadoLechitsa:= False;
  HotKey:= Ord ('1');
end;

end.
В итоге, происходит нажатие только Alt+1, а Alt+2... Alt+N не идёт, в чём проблема?

Последний раз редактировалось xRamzeSx; 29.09.2010 в 08:36.
xRamzeSx вне форума Ответить с цитированием
Старый 29.09.2010, 12:09   #63
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Вечером гляну

А вообще тут к гадалке ходить не надо. У вас 2 таймера. Зачем нужен Timer2? Он у вас каждые N миллисекунд делает
Код:
  HotKey:= Ord ('1');
Это должна быть кнопка. И еще в конце обработчика добавить
Код:
  Timer1.Enabled := True;
Затарился йадом, нажал кнопку и пошел на войну. Пока воевал, йад кончился, таймер, соответственно, выключился.

Последний раз редактировалось Sibedir; 29.09.2010 в 12:15.
Sibedir вне форума Ответить с цитированием
Старый 29.09.2010, 12:58   #64
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Посмотрите пожалуйста. Если сможете, добавьте на форму 4 кнопки.
1 - Начало кликера с Alt+1 по Alt+6. (Последовательная эмуляция нажатия клавиш)
2 - Остановка эмуляции - т.е отключение таймера или т.п.
3 - Запуск автоматического "съедания" еды. (Т.е так же, 1 слот использовал, и сразу 2 слот, а не зависать на 1 слоте кармана, как сейчас выходит)
4 - Остановка автоматического "съедания" еды...
xRamzeSx вне форума Ответить с цитированием
Старый 29.09.2010, 15:08   #65
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

1 - Начало кликера с Alt+1 по Alt+6. (Последовательная эмуляция нажатия клавиш)
и
3 - Запуск автоматического "съедания" еды. (Т.е так же, 1 слот использовал, и сразу 2 слот, а не зависать на 1 слоте кармана, как сейчас выходит)
это тоже самое

2 - Остановка эмуляции - т.е отключение таймера или т.п.
и
4 - Остановка автоматического "съедания" еды...
это тоже самое

Кнопки должно быть всего ДВЕ:
1. Следить за здоровьем
2. Не следить за здоровьем

А эмуляция нажатия клавиш не имеет програмного начала и конца - этим занимается таймер.

как-то так
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  res: int64;
begin
  res:=0;
  read_value($49DBFC,1, res);
  hpMax:=(res);
  hpKritichMin:= Round (hpMax * 0.2);
  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 < hpKritichMin)
  or (NadoLechitsa and (HitPoints < hpNormal));
  if NadoLechitsa
  then PostKeyEx32(HotKey, [ssAlt], False);

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

Последний раз редактировалось Stilet; 30.09.2010 в 13:18.
Sibedir вне форума Ответить с цитированием
Старый 29.09.2010, 15:21   #66
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Вставил код, проверил, в игре, происходит эмуляция 1, 4, 6 или 1, 6 (Как будто перескакивет), почему так?
xRamzeSx вне форума Ответить с цитированием
Старый 29.09.2010, 17:10   #67
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Наверное маленький интервал. Программа не успевает обработать события.
Вообще, если можно, нужно произвести проверку наличия в рюкзаке в указанном слоте необходимого предмета, и использовать его. А уж после переходить на другой слот.
Типа того
Код:
Если надо лечится, тогда
|  N := 0;
|  Если в первом слоте аптечка тогда
|  |  N := 1
|  иначе
|  |  Если во первом слоте аптечка тогда
|  |  |  N := 2
|  |  иначе
|  |  | ..................
|  |  | ..................
|  |  end;
|  end;
|  Если N = 0 тогда
|  |  "Дело дрянь"
|  иначе
|  |  Делаем Alt+N
|  end;
end;
Добавлено ------------------------------------------------------
xRamzeSx, вы молодец, видно что пытаетесь в меру своих знаний и возможностей решить проблему сами. Но чувствуется нехватка опыта проработки логики работы программы (ее архитектуры, если хотите). В этом очень помогают блок-схемы. Им, на мой взгляд, в универах уделяют слишком мало внимания. Язык программирования сам по себе вторичен. Главное - это грамотное составление алгоритма. Часто спрашивают: А как на делфи сделать то-то и то-то. Так и подбивает ответить: Да точно так же как на Си или Бейсике. Как сделать на делфи - вкорни не верный вопрос. Прежде всего нужно понять, как решить задачу вообще. Построить алгоритм решения. А уж после, поэтапно, реализовывать алгоритм на языке, который знаешь. И может, кстати, так получиться, что разные части алгоритма целесообразней реализовывать с помощью разных средств разработки (порой простой Word выступает в качестве предпроцессора) не такой уж он и простой.
Вот вам парочка программ. Не могу сказать, что я сам ими пользуюсь постоянно, но пару раз выручали. В вашем случае и простого листка бумаги может хватить, но толи еще будет
Вложения
Тип файла: zip Блок-схемы.zip (990.9 Кб, 7 просмотров)

Последний раз редактировалось Sibedir; 29.09.2010 в 17:29.
Sibedir вне форума Ответить с цитированием
Старый 29.09.2010, 17:24   #68
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

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

Это все условно и гипотетически. Я же не знаю в каком адресе и что нужно искать, чтобы узнать о состоянии слота.
Sibedir вне форума Ответить с цитированием
Старый 30.09.2010, 10:54   #70
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Не эти ли Вы адреса имеете ввиду?
Слот Alt+1: $0049DE9С
Слот Alt+2: $0049DEA0
Слот Alt+3: $0049DEA4
Слот Alt+4: $0049DEA8
Слот Alt+5: $0049DEAC
Слот Alt+6: $0049DEB0


Я использовал эти адреса, чтобы делать иллюзию объекта, по функции write_value
4294967295 - этот набор цифр делает клетку слота пустой (незнаю, может пригодится?).
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