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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2010, 15:45   #1
darkarrow
Новичок
Джуниор
 
Регистрация: 29.06.2010
Сообщений: 3
Печаль

Есть следующая проблема: надо сэмулировать нажатия клавиш для автоматизации процесса, в моём случае - игрового
(игроки Ла2, ВоВ, РО, РФ, и прочих игрулек этого толка меня поймут)
Как правило встроенный в игру скриптовый язык поддерживает достаточно много функций, но функция зацикливания была нарочно оттуда убрана (нельзя макрос поставить в макрос, сделать GoTo вначало макроса и т.д.)
Также, нельзя просто зажать клавишу монетой (пластырем, варианты), потому что на выполнение скрипта необходимо время, а если будем зажимать - значит будем заставлять макрос выполнять заново снова и снова.
Для этого мною была написана следующая программа

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    clicker: TTimer;
    Label2: TLabel;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Label3: TLabel;
    Button3: TButton;

    procedure clickerTimer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
                 numberofbutton: integer;
                 x: integer;
implementation

{$R *.dfm}
             procedure SimulateKeyDown(Key : byte);
begin
    keybd_event(Key, 0, 0, 0);
end;

procedure SimulateKeyUp(Key : byte);
begin
    keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
end;

procedure SimulateKeystroke(Key : byte; extra : DWORD);
begin
    keybd_event(Key,extra,0,0);
    keybd_event(Key,extra,KEYEVENTF_KEYUP,0);
end;


procedure SendKeys(s : string);
var
    i : integer;
    w : word;
begin

    SimulateKeystroke(numberofbutton, 0);
    showmessage('pyr');
end;






procedure TForm1.clickerTimer(Sender: TObject);
var
zna4: integer;
begin
SimulateKeystroke(numberofbutton, 0);
    if x=0 then
    begin

    form1.Caption :='Clicker \';
    application.Title :='Clicker \';
    x:=1;
    end
    else
    begin

        form1.Caption :='Clicker /';
        application.Title :='Clicker /';
    x:=0;
    end;

    zna4 := random(2);
    if zna4=0 then
    begin
    clicker.Interval := clicker.Interval-random(5);
    end;
    if zna4=1 then
    begin
    clicker.Interval := clicker.Interval+random(5);
    end;


label3.caption:=IntToStr(clicker.Interval);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
numberofbutton:=118;
x:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
clicker.Enabled:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
clicker.Enabled:=false;
end;




procedure TForm1.Button3Click(Sender: TObject);
begin
    if edit1.Text <> '' then
    clicker.Interval := strtoint(edit1.Text)*1001;

    if edit1.Text <> '' then
    numberofbutton:=111+StrToInt(edit2.text);
end;

end.
программа работает безупречно в Windows, но, как только мы переходим в игру, выполняет от 2х до 20 циклов и перестаёт работать. Сначала я думал, что это встроенная защита от кликеров. Был добавлен кусок кода, который делает время более прихотливым (+- несколько долесекунд при каждом цикле)
Но проблема не исчезла. Ищу помощи от тех, кто понимает в чем проблема, или кто играет в La2 и может это потестировать лично

Да, забыл сказать - программа эмулирует нажатие клавиши F7
(по умолчанию)
Первое текстовое поле - задержка между кликаньем в секундах
Второе текстовое поле - либо ввод любой клавиши
(если у вас есть таблица, с учетом смещения +111)
либо просто от 1 до 10
(будет соотв кликать от F1 до F10)
Кнопка 1: включить таймер
Кнопка 2: выключить таймер
Кнопка 3: принять изменения
(относительно предыдущих, или дефолтных, указанных при иницилиазиции программы)

Последний раз редактировалось Stilet; 30.06.2010 в 09:08.
darkarrow вне форума Ответить с цитированием
Старый 01.07.2010, 20:00   #2
darkarrow
Новичок
Джуниор
 
Регистрация: 29.06.2010
Сообщений: 3
По умолчанию

Теме Ап, проблема пока не решилась.
darkarrow вне форума Ответить с цитированием
Старый 01.07.2010, 23:24   #3
ap008
 
Регистрация: 22.05.2008
Сообщений: 3
По умолчанию

Скорее всего действительно защита от кликеров. А пара миллисекунд туда-сюда - это не серьезно.

Последний раз редактировалось ap008; 01.07.2010 в 23:30.
ap008 вне форума Ответить с цитированием
Старый 02.07.2010, 08:23   #4
kakawkin
Форумчанин
 
Регистрация: 21.09.2009
Сообщений: 431
По умолчанию

какая вам защита от кликеров ???
Эта линейка на столько тупая сама по себе игра - что там надо жать кнопки как угорелый. Ага - дерешься в дуэли - и хоп, неможешь жать на кнопки так как сработала защита от кликеров :D :D :D :D :D :D :D :D :D

Если честно то код написан кривовато!!!
kakawkin вне форума Ответить с цитированием
Старый 02.07.2010, 12:08   #5
MyIE
Форумчанин
 
Аватар для MyIE
 
Регистрация: 02.01.2010
Сообщений: 127
По умолчанию

Во всех подобных играх стоит защита, которая определяет нажатие клавиши из вне.
Пробовал писать что-то подобное для игры StarCraft 2, так4ая вещь работала только в меню, при переходе в игру, все действия эмуляции нажатия клавиш игрой игнорировались.
0_o
MyIE вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эмуляция нажатия мультимедийных клавиш W0LF Общие вопросы Delphi 0 03.04.2010 22:01
Эмуляция нажатия клавиши helenfly Win Api 9 01.12.2009 12:09
Эмуляция нажатия нескольких клавиш -=Shad0www Общие вопросы Delphi 3 12.05.2008 08:13
Эмуляция нажатия клавиши...... Zoidberg Win Api 4 11.01.2007 18:44