Wysyłanie textu do gry (sendmessage?)

Odpowiedz Nowy wątek
2011-08-25 22:52
xaver
0

witam ! Znalazłem w internecie pewien kod który wysyła dane do notatnika, kod działa wszystko ok tylko wysyła on to w dziwny sposób kod wygląda tak:

var
  HC, Y : HWND;
begin
  HC := FindWindow('notepad', nil);
  Y := FindWindowEx(HC, 0, 'notepad.exe', 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;

kod zamiast wysłać pełen wyraz to wysyła on po kolei literki no i do tego WM_KEYDOWN, VK_RETURN w ogóle nie załącza dałby rade ktoś przerobić kod tak aby wysyłał cały text od razu i walnął enter ? Z góry dzięki

PS: jestem początkujący.

Pozostało 580 znaków

2011-08-25 23:24
0

A te znaki wysyłąsz do pola tekstowego w grze czy do okna całej gry? Bo ludzie są uparci i nie mogą sobie przyswoić, że aby w szczególności gra odebrała komunikat WM_CHAR to musi mieć zaimplementowaną jego obsługę, a często jej nie ma. Dlatego jedyne co moge doradzić to wysyłanie znaków w pętli, ale używając Keybd_Event, po wcześniejszym akytowaniu okna przez SetForegroundWindow(Uchwyr); nie wiem czy zadziała, ale można spróbować, bo pewniejsze to niż SendMessage, po którym program musi zareagować i odesłać dopowiedź bodajże, sprawdź na MSDNie czy nie lepiej użyć PostMessage. Jednak polecam Keyb_Event. A to przykład wywołania tej funkcji dla wciśnięcia i puszczenia entera:

  Keybd_Event(VK_RETURN, 0, 0, 0);
  Keybd_Event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);

A to dla znaków (jeżeli znaki są uzyskiwane z shiftem (VK_SHIFT) to należy go przed naciśnięciem znaku wcisnąć, a po wysłaniu i puszczeniu znaku zasymulować puszczenie Shifta.

var
  I : integer;
  text : string;
begin
  Text := 'Ogarnij podstawy, a nie bierzesz się za wysyłanie klawiszy i tego typu zabawy.';
  for I := 1 to Length(Text) do
  begin
    Keybd_Event(VkKeyScan(Text[I]), 0, 0, 0);
    Keybd_Event(VkKeyScan(Text[I]), 0, KEYEVENTF_KEYUP, 0);
  end;
end;

Możesz jeszcze skorzystać z funkcji SendImput (czasami działa ona dla gier pod DirectX jakl nie działa Keybd_Even):

procedure PressKey(Key : Cardinal; KeyUp : boolean);
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
    if KeyUp = False then
    begin
      Input.ki.dwFlags := 0;
    end
    else
    begin
      Input.ki.dwFlags := KEYEVENTF_KEYUP;
    end;
  end;
  Input.ki.time := 0;
  SendInput(1, Input, SizeOf(Input));
end;

A czasami i w ten sposób się tak nie da. Ale na pewno sposobem nie jest wysyłanie WM_CHAR poza standardowymi kontrolkami edycyjnymi, które ów komunikat obsługją.


edytowany 1x, ostatnio: olesio, 2011-08-25 23:24

Pozostało 580 znaków

2011-08-26 00:33
xaver
0

no tak zapomniałem dodać jeżeli gram w tą grę to nie muszę zaznaczać okna do wpisania czegoś tylko po prostu jest tam pole i cały czas piszę a efekt chciałem uzyskać taki że wyśle tekst i kliknie enter a te pierwszy kod co mi podałeś (Dzięki że w ogóle go podałeś) to działa tylko wtedy kiedy jestem w oknie gry a jeżeli poza grą to wpisuje tekst wszędzie a mi chodziło bardziej o to żebym nie musiał mieć zmaksymalizowanego okna tylko zminimalizowane i aby normalnie wysyłało wpisałem ten kod:

var
  HC, Y : HWND;
begin
  HC := FindWindow('notepad', nil);
  Y := FindWindowEx(HC, 0, 'notepad.exe', 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;

ponieważ nawet jeżeli jestem po za oknem gry to i tak się wysyła ;D i to chciałem uzyskać wysłać tekst np. siema i aby dało enter da radę ?

To się naucz programować do się dowiesz czy da radę! Boże, co my jesteśmy, kółko dobroczynne? - payl 2011-08-26 00:51

Pozostało 580 znaków

2011-08-26 01:14
0

Hehe payl przebijasz w ironicznych tekstach Miśkad czasami ;) A co do wysyłania znaków do nieaktywnego okna. To mogę się mylić. Ale na logikę funkcja Keyd_Event symuluje naciskanie klawiszy na klawiaturze, tak jak funkcja Mouse_Event klikanie myszką. Można dzięki niej klikać na aktywne okno, bo działa to jak udawanie użytkownika, czyli nie mozna kliknąć w nieaktywne okno. Tak samo jest najpewniej z klawiszami wciskanymi, To co masz aktywne przyjmie lub nie naciskane przez Ciebie klawisze. I tyle. Wyjątkiem są jak wspomniałem pola edycyjne obsługujące wiadomośc WM_CHAR, a takiej wiadomości na ogół nie obsługują inne komponenty, bo programiści nie dodają tego, bo i w sumie po co.


Nie no aż taki dobry to nie jestem :P . Ale uczę się od najlepszych ;) . - payl 2011-08-26 01:22

Pozostało 580 znaków

2011-08-26 01:22
xaver
0

chyba mnie nie zrozumiałeś, właśnie chodzi o to że naśladuje użytkownika ... a jak zminimalizuje okno gry i wejdę w notatnik i zacznę pisać to też wyślę to do gry ?:D mi chodzi o to żeby mi wysyłało do gry a ja sobie swobodnie będę mógł serfować po necie :D

No to sobie napisz! Takie trudne? No jak się nie umie to rzeczywiście... Trzeba się nauczyć. - payl 2011-08-26 02:09

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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