Praca programu w tle z grą

0

Witam.
Piszę program w delphi symulujący naciśnięcie jakiegoś klawisza poprzez procedurę op:= ord('S') ;

keybd_event(op,0,0,0);
keybd_event(op,0,KEYEVENTF_KEYUP,0); 

gdzie w miejscu S wpisuje się jaka ma byś za symulowana literka. Gdy załączę nowy notatnik to nie ma problemu-literka sama się wpisuje. W przeglądarce również się wpisuje. Gdy uruchomię grę i wpisuję imię to również lecz gdy już nacisnę start i gra się załączy to już jest klapa. Dana literka już się nie pisze(powinna zmieniać bieg). Jest jakaś możliwość zrobienia tego aby ta literka pisała się właśnie podczas grania? Nie wie czy trzeba uchwycić grę czy jakoś zrobić pracę w tle..?
Bardzo proszę o szybką pomoc.
Mariusz

0
var
  HC, Y : HWND;
begin
  HC := FindWindow('Tytuł okna', nil);
  Y := FindWindowEx(HC, 0, 'tytuł', nil);
  SendMessage(Y, WM_CHAR, Ord('B'), 0);
  SendMessage(Y, WM_CHAR, Ord('a'), 0);
  SendMessage(Y, WM_CHAR, Ord('h'), 0);
  SendMessage(Y, WM_KEYDOWN, VK_RETURN,0);
end; 

oto kod sam musisz dojsc do nazwy okna gry
SendMessage(Y, WM_CHAR, Ord('h'), 0);oznacza jaka literka literki wpisujesz tu gdzie "h"

0

Mimo, że dużo o tym czytałem jakoś nie umiem pojąć jak mam to zrobić...

0

Może spróbuj takim kodem. Wysyłanie znaków jak podal poprzednik, zadziałać może dla kontrolek ale
takich jak pola edycyjne. Poniższy kod kiedyś tutaj na forum uprościł do jeden procedury kAzek, może
jak poszukasz to znajdziesz. Ja dodam, że Keybd_Event nie działalo, na przyklad w emulatorze Amigi
pod Windows WinUAE, a poniższy kod, już poza klawiszem prawym Ctrl działał, jak należy i reagował.

procedure SymulujKeyDown(Key : Cardinal);
var
  Input : TagINPUT;
begin
  Input.Itype := INPUT_KEYBOARD;
  Input.ki.wVK := Key;
  Input.ki.wScan := MapVirtualKey(Key, 0);
  if Key in [VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_HOME,
    VK_END, VK_PRIOR, VK_NEXT, VK_INSERT, VK_DELETE] then
  begin
    Input.ki.dwFlags := KEYEVENTF_EXTENDEDKEY;
  end
  else
  begin
    Input.ki.dwFlags := 0;
  end;
  Input.ki.time := 0;
  SendInput(1, Input, SizeOf(Input));
end;

procedure SymulujKeyUp(Key : Cardinal);
var
  Input : TagINPUT;
begin
  Input.Itype := INPUT_KEYBOARD;
  Input.ki.wVK := Key;
  Input.ki.wScan := MapVirtualKey(Key, 0);
  if Key in [VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_HOME,
    VK_END, VK_PRIOR, VK_NEXT, VK_INSERT, VK_DELETE] then
  begin
    Input.ki.dwFlags := KEYEVENTF_KEYUP or KEYEVENTF_EXTENDEDKEY;
  end
  else
  begin
    Input.ki.dwFlags := KEYEVENTF_KEYUP;
  end;
  Input.ki.time := 0;
  SendInput(1, Input, SizeOf(Input));
end;
0

Z procedurą SendMessage(Y, WM_CHAR, Ord('h'), 0); jest to samo co z tą co ja podałem-tam gdzie się wpisuje imię działą ale w grze już nie (chyba, że wyśle komunikat zamknięcia okna to działa).
Zaraz zobaczę tą drugą.
Udało mi się to zrobić z procedurami:

Procedure SymulujKeyDown(Key: Cardinal);
  Var
  Input: tagINPUT;
 Begin
  Input.Itype:=INPUT_KEYBOARD;
  Input.ki.wVK:=Key;
  Input.ki.wScan:=MapVirtualKey(Key, 0);

  If Key in [VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_HOME,
             VK_END, VK_PRIOR, VK_NEXT, VK_INSERT, VK_DELETE]
    then Input.ki.dwFlags:=KEYEVENTF_EXTENDEDKEY
    else Input.ki.dwFlags:=0;
  Input.ki.time:=0;
  SendInput(1, Input, SizeOf(Input));
 end;

Procedure SymulujKeyUp(Key: Cardinal);
  Var
  Input: tagINPUT;
 Begin
   Input.Itype:=INPUT_KEYBOARD;
   Input.ki.wVK:=Key;
   Input.ki.wScan:=MapVirtualKey(Key, 0);

   If Key in [VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_HOME,
              VK_END, VK_PRIOR, VK_NEXT, VK_INSERT, VK_DELETE]
     then Input.ki.dwFlags:=KEYEVENTF_KEYUP or KEYEVENTF_EXTENDEDKEY
     else Input.ki.dwFlags:=KEYEVENTF_KEYUP;
   Input.ki.time:=0;
   SendInput(1, Input, SizeOf(Input));
 end;

A dany klawisz symuluję tak:

SymulujKeyDown(VkKeyScan('s'));
 Sleep(30);
 SymulujKeyUp(VkKeyScan('X'));
 Sleep(30); 

Gdzie X to mój klawisz.

Ta jedna procedura jakoś nie chciała mi działać więc użyłem dwóch.
Bardzo dziękuję wam za pomoc.

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