sendmessage/symulacja klawiatury

0

Cześć,

Otóż piszę sobie bota pod pewną grę i w sumie wszystko mam tylko została mi symulacja dwóch klawiszy(spacji , F1), próbowałem sendmessage i symulowanie klawiatury lecz niestety to nie działa tzn. działa do pewnego momentu do menu gry a kiedy zaloguje się już na postać oba w/w sposoby nie działają (wyjątkiem jest pisanie w okienku chat'a podczas gry).
Czy jest na to jakiś sposób?

Pozdrawiam

0

Jaka gra? Wiedząc to, może łatwiej będzie Ci pomóc.

0

Metin 2

0

heh =D ja kumplowi automatycznego rybaka zrobiłem do tego ( nie testowany bo kumpel przestał w to coś grać, ale klawisze chyba ciśnie dobrze ) =D
podejrzewam że ty też to próbujesz zrobić =D wanna code?

a może to reaguje na konkretne zdarzenie ? wciśnięcie czy puszczenie a może przetrzymanie ?

0

heh dokładnie, bot do łowienia rybek ;-)
Jak możesz to zarzuć kodem/podpowiedzią.

Pozdrawiam

0
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Spin, Menus, About, ComCtrls, ImgList, ActnList;

type
  TForm1 = class(TForm)
    TrayIcon1: TTrayIcon;
    Button1: TButton;
    Timer1: TTimer;
    SpinEdit1: TSpinEdit;
    Label1: TLabel;
    Button2: TButton;
    PopupMenu1: TPopupMenu;
    Oprogramiku1: TMenuItem;
    Przestawstoper1: TMenuItem;
    Wyjd1: TMenuItem;
    Pokazprogram1: TMenuItem;
    Start1: TMenuItem;
    SpinEdit2: TSpinEdit;
    Button3: TButton;
    Label2: TLabel;
    StatusBar1: TStatusBar;
    Pomiedzyakcjami1: TMenuItem;
    Pomiedzyspacjami1: TMenuItem;
    Timer2: TTimer;
    procedure Timer2Timer(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Pomiedzyspacjami1Click(Sender: TObject);
    procedure Pomiedzyakcjami1Click(Sender: TObject);
    procedure Pokazprogram1Click(Sender: TObject);
    procedure Start1Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure Oprogramiku1Click(Sender: TObject);
    procedure Wyjd1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin

  if Timer1.Enabled then
  begin
    Button1.Caption:='Start';
    Timer1.Enabled:=false;
  end
  else
  begin
    Button1.Caption:='Stop';
    Timer1.Enabled:=true;
  end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin

  try

    Timer1.Interval:=SpinEdit1.Value;

  except

    ShowMessage('Bledna wartosc :)');

  end;

  SpinEdit1.Value:=Timer1.Interval;

end;

procedure TForm1.Button3Click(Sender: TObject);
begin

  try

    Timer1.Tag:=SpinEdit2.Value;

  except

    ShowMessage('Bledna wartosc :)');

  end;

  SpinEdit2.Value:=Timer1.Tag;

end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin

  CanClose:=false;
  Form1.Hide();

end;

procedure TForm1.FormCreate(Sender: TObject);
begin

  SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);

end;

procedure TForm1.Oprogramiku1Click(Sender: TObject);
begin

  About.AboutBox.ShowModal();

end;

procedure TForm1.Pokazprogram1Click(Sender: TObject);
begin

  Form1.Show();

end;

procedure TForm1.Pomiedzyakcjami1Click(Sender: TObject);
var
  temp:string;
begin

  temp:=InputBox('Przestawianie stopera','Podaj nowy czas ( w milisekundach )','3500');

  try

    Timer1.Interval:=StrToInt(temp);

  except

    ShowMessage('Bledna wartosc');

  end;

  SpinEdit1.Value:=Timer1.Interval;

end;

procedure TForm1.Pomiedzyspacjami1Click(Sender: TObject);
var
  temp:string;
begin

  temp:=InputBox('Przestawianie stopera','Podaj nowy czas ( w milisekundach )','3500');

  try

    Timer1.Tag:=StrToInt(temp);

  except

    ShowMessage('Bledna wartosc');

  end;
  
  SpinEdit2.Value:=Timer1.Tag;

end;

procedure TForm1.Start1Click(Sender: TObject);
begin

  Button1.Click();
  PopupMenu1.Items.Items[1].Caption:=Button1.Caption;

end;

procedure TForm1.Timer1Timer(Sender: TObject);  
begin

  Windows.keybd_event(49,0,0,0);
  Windows.keybd_event(49,0,KEYEVENTF_KEYUP,0);
  sleep(100);

  Windows.keybd_event(VK_SPACE,0,0,0);
  Windows.keybd_event(VK_SPACE,0,KEYEVENTF_KEYUP,0);
  sleep(100);

  Timer2.Interval:=Timer1.Tag;
  Timer2.Enabled:=true;
  Timer1.Enabled:=false;

end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin

  if Timer2.Tag<>0 then
  begin
  
    Windows.keybd_event(VK_SPACE,0,0,0);
    Windows.keybd_event(VK_SPACE,0,KEYEVENTF_KEYUP,0);
    sleep(100);   

    Timer1.Enabled:=true;
    Timer2.Tag:=0;
    Timer2.Enabled:=false;
      
  end else begin

    Timer2.Tag:=1;  

  end;
         
end;

procedure TForm1.Wyjd1Click(Sender: TObject);
begin

  Application.Terminate();

end;

end.

dopasuj obie tylko interfejs do tego bo straciłem plik formy =)

0

Dzięki za kod ale niestety nie działa (reakcja jest tylko w menu logowania i chacie lecz podczas grania, gra nie reaguje) zauważyłem, że gra również nie reaguje na windowsowską klawiaturę ekranową (ten sam wynik co z symulacją klawiatury/sendmessage).
Może dll injection albo wysyłanie pakietów by coś dało?
Ma ktoś może jeszcze jakiś pomysł?

0

Jednak wysyłanie pakietów odpada bo pakiety za każdym razem wygląda inaczej :-/
Nie ma nikt żadnych pomysłów ? na pewno musi być jakieś rozwiązanie :-/

0

Było ciężko no ale znalazłem odpowiedź na swoje pytanie.
Jak by ktoś był zainteresowany to podaję rozwiązanie:

procedure SimulateKeyDown(MyKey: Cardinal);
var
  MyInput: tagINPUT;
 begin
  MyInput.Itype          := INPUT_KEYBOARD;
  MyInput.ki.wVk         := MyKey;
  MyInput.ki.wScan       := MapVirtualKey(MyKey, 0);

  if (MyKey = VK_UP)
  or (MyKey = VK_DOWN)
  or (MyKey = VK_LEFT)
  or (MyKey = VK_RIGHT)
  or (MyKey = VK_HOME)
  or (MyKey = VK_END)
  or (MyKey = VK_PRIOR)
  or (MyKey = VK_NEXT)
  or (MyKey = VK_INSERT)
  or (MyKey = VK_DELETE) then
    MyInput.ki.dwFlags   := KEYEVENTF_EXTENDEDKEY
  else
    MyInput.ki.dwFlags   := 0;
  MyInput.ki.time        := 0;
  MyInput.ki.dwExtraInfo := 0;

  SendInput(1, MyInput, SizeOf(MyInput));
 end;

procedure SimulateKeyUp(MyKey: Cardinal);
var
  MyInput: tagINPUT;
 begin
  MyInput.Itype          := INPUT_KEYBOARD;
  MyInput.ki.wVk         := MyKey;
  MyInput.ki.wScan       := MapVirtualKey(MyKey, 0);

  if (MyKey = VK_UP)
  or (MyKey = VK_DOWN)
  or (MyKey = VK_LEFT)
  or (MyKey = VK_RIGHT)
  or (MyKey = VK_HOME)
  or (MyKey = VK_END)
  or (MyKey = VK_PRIOR)
  or (MyKey = VK_NEXT)
  or (MyKey = VK_INSERT)
  or (MyKey = VK_DELETE) then
    MyInput.ki.dwFlags   := KEYEVENTF_KEYUP or KEYEVENTF_EXTENDEDKEY
  else
    MyInput.ki.dwFlags     := KEYEVENTF_KEYUP;

  MyInput.ki.time        := 0;
  MyInput.ki.dwExtraInfo := 0;

  SendInput(1, MyInput, SizeOf(MyInput));
 end;
0

Witam ponownie, przepraszam ze tak ciągle pisze post pod postem (chyba czas się zarejestrowac :))
do rzeczy, czy da radę jakoś połączyć w/w procedure simulatekeydown z funkcją sendmessage ?
bo:

SendMessage(uchwytDoOkna,SimulateKeyDown(VK_F1));

nie zadziała :-/

Pozdrawiam

0

Ja czasem korzystam z sndkey32.pas , spróbuj może pomoże; ;-)

0

próbowałem już tego sndkey32.pas i niestety bez efektu.

Pozdrawiam

0

a więc ten fish bot co jest na samiej gurze jest dobry czy nie bo ja już nic niewiem :-[ :-[ :-[ :-[

1 użytkowników online, w tym zalogowanych: 0, gości: 1