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ą.