dana funkcja w procesie/grze

0

Witam. Mam takie pytanie czy jest możliwe napisanie programu w delphi który w danym procesie klika spacje co np. 10 s ?. Chodzi mi o to żeby to działało tylko np. na grze (gra.exe) a nie gdy piszemy na gadu gadu. Czyli zeby to dzialalo sobie w tle nawet bo zminimalizowaniu aplikacji.. Prosze o pomoc

Jakaś pomoc wskazówka jak to zrobic?

0

Wywoływanie:

 C := PChar(' '); //Podanie znaku do klikania, czyli spacja
 Push(C);

Kod:

type
  TKomunikatLista = class(TList)
  public
    destructor Destroy; override;
  end;
var
        KomIlosc : Word ;
            Hook : Integer;
       Komunikat : TEventMsg;
  KomunikatLista : TKomunikatLista ;
destructor TKomunikatLista.Destroy;
var
  I: Word;
begin
   for I := 0 to Count - 1 do
    Dispose(PEventMsg(Items[i]));
  inherited Destroy;
end;
procedure ZrobKomunikat(Klawisz: byte; Komun: Cardinal);
var
  Kom: PEventMsg;
begin
  New(Kom);
  with Kom^ do
    begin
      message := Komun;
      paramL := Klawisz;
      paramH := MapVirtualKey(Klawisz, 0);
      time := GetTickCount;
      hwnd := 0;
    end;
  KomunikatLista.Add(Kom);
end;
function Play(Code: integer; wParam, lParam: Longint): Longint; stdcall;
begin
  case Code of
    hc_Skip:
      begin
        inc(KomIlosc);
        if KomunikatLista.Count<=KomIlosc  then
          begin
            UnhookWindowsHookEx(Hook);
            KomunikatLista.Free;
          end
      else
        Komunikat := TEventMsg(KomunikatLista.Items[KomIlosc]^);
      Result := 0;
      end;
    hc_GetNext:
      begin
        PEventMsg(lParam)^ := Komunikat;
        Result := 0
      end;
        else
          Result := CallNextHookEx(Hook, Code, wParam, lParam);
  end;
end;
procedure Push(s:string);
var
 X: Integer;
begin
 KomunikatLista := TKomunikatLista.Create;
   for X := 1 to Length(S) do
     begin
       ZrobKomunikat(vkKeyScan(s[x]), wm_KeyDown);
       ZrobKomunikat(vkKeyScan(s[x]), wm_KeyUp);
       KomIlosc := 0;
     end;
 Komunikat := TEventMsg(KomunikatLista.Items[0]^);
 Hook := SetWindowsHookEx(wh_JournalPlayback, Play, hInstance, 0);
end;

Jak coś to tu masz projekt.

0

A to nie bedzie przypadkiem klikalo klawisza caly czas ? Bo np. piszac na gg nie chcialbym zeby mi klikalo spacje a na gra.exe bym chcial zeby klikalo. Ale nie widze tu funkcji np. podania procesu

P.S Nie chodzi mi o klikanie spacji jako przerwy, chodzi mi o klikanie spacji jako klawisza co 10 s. na danej grze.

0

I oczywiście szukałeś żmudne godziny, a nie czekaj: w ogóle nie szukałeś !
http://www.elektroda.pl/rtvforum/topic1773349.html

0

Napisalem juz sobie wlasny programik w sndkey32... Niby wszystko hula ale mam 2 problemy.
A mianowicie:

  1. Wspierane klawisze (taka dluga lista itd. ALE SZUKAM I SPACJI NIE WIDZE : ( )
  2. Problem w tym ze ta aplikacja nie moze byc zminimalizowana : ( A o to mi chodzilo zeby mogla byc na pasku zminimalizowana..

Da sie zalatwic w jakikolwiek sposob te problemy ?

0

rozwiazanie jest takie:
siedzisz i kombinujesz 20h/dobe przez tydzien, wspierajac sie tym co znajdziesz w internecie.
chyba ze nie chce Ci sie uczyc to napisz do dzialu praca i tam, za kase ktos Ci to napisze.
to o co pytasz bylo miliony razy poruszane na forum a miliardy razy w google w jezyku angielskim. wystarczy wysilic szare komorki i poszukac a potem znow pomyslec i przerobic wg wlasnych potrzeb ;/

0

Wzorowałem się róznymi poradnikami.. Ale nadal nie wiem jak zalatwic problem zeby program mogl byc zminimalizowany : (

0

Masz rację .. Szukając samemu nauczyłbym się czegoś ale stradziłbym tydzień . A tak powiecie mi tylko jak zrobić to żeby mogłobyć zminimalizowane i nauczę się tracąc godzine.

A więc mam to zrobione w sposób

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if AppActivate(Pchar(Edit1.text)) then
keybd_event(VK_SPACE,0,0,0);
keybd_event(VK_SPACE,0,KEYEVENTF_KEYUP,0);
end;

Wtedy klika spacje w Okienku ale ono musi być aktywne : ( Czy da się to załatwić w sposób taki ze jezeli jest wlaczony "Bez tytułu - Notatnik" To tam sobie wrzuca spacje co jakiś czas ?

0

Można próbować wysyłać odpowiednie komunikaty tylko do okna gry, bo jak rozumiem to ono ma być zminimalizowane. Jednak gry pod DirectX mogą nie obsłużyć takich komunikatow jak WM_CHAR.

0

Jednakże napotkałem taki problem nie wiem czemu nie chce to działać próbowałem wielu sposobów, żaden nie działa

procedure TForm1.Timer1Timer(Sender: TObject);
var
hW : HWND;
begin
hW := FindWindow(nil, 'Bez tytułu - Notatnik');
SendMessage(hW,WM_CHAR,ord(13),0);
end;
end.
0

Bo wysyłasz komunikat do okna, które nie obsluguje tego komunikatu. Należy wysłać komunikat do kontrolki edycyjnej, na przykład tak...

var
  NotepadH, EditH : HWND;
begin
  NotepadH := FindWindow('Notepad',nil);
  EditH := FindWindowEx(NotepadH, 0, 'Edit', nil);
  SendMessage(EditH, WM_CHAR, Ord('a'), 0);
end;

Poza tym wystarczyło wpisac w google delphi sendkeys to notepad i miałbyś pod pierwszym linkiem przykład. A że temat zaczyna dotyczyć banalnych podstaw - przenoszę.

0

To jeszcze ostatnie takie pytanie.. Jak zrobic cos takiego zeby z pola wyszukiwalo aplikacji chodzi mi o to :

NotepadH := FindWindow(Edit1.text,nil);

Tylko ze wtedy wywala error.

0

To czytaj komunikat błędu i staraj się poprawić kod tak aby więcej błędu nie było. Funkcja FindWindow, jak i większośc systemowych z modułu Windows, które wymagają podania tekstu jako parametr oczekują go w formacie PChar, a nie string, czyli powinno być na przykład tak...

  NotepadH := FindWindow(PChar(Edit1.Text), nil);
0

Mam jeszcze takiep ytanie czy byla by taka sama mozliwosc tylko ze poprzez nazwe procesu a nie okna ?

0

Jak uzyskać uchwyt na podstawie podanej nazwy procesu exe masz pokazane w moim gotowcu na: Uchwyt na podstawie nazwy pliku exe programu

0

Dziękuję bardzo wam za pomoc.. Napotkałem wiele problemów ale staram się wszystkie rozwiązywać sam. Naprowadziliście mnie na początek i mi to bardzo ułatwiło : ) dzieki!

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