Program okienkowy powinien reagować bez problemów, różnie może być natomiast z grami na przykład pod DirectX. Polecam spróbować poniższy kod. Ponieważ funkcja keybd_event
jest przestarzała i powinno się korzystać z SendInput
. Sam miałem problemy z symulacją klawiszy, szczegółnie "Controlów". Ważne jest w tym przypadku ustawienie flagi KEYEVENTF_EXTENDEDKEY
. Dla "Alta" raczej ich nie potrzeba, ale ustawienie nie zaszkodzi.
procedure KeyDownUp(KeyToSend : Byte; KeyDown : boolean);
const
DownUp_Flags_Arr : array[boolean] of DWORD = (0, KEYEVENTF_KEYUP);
Extended_Flags_Arr : array[boolean] of DWORD = (0, KEYEVENTF_EXTENDEDKEY);
var
Input : TagINPUT;
KeyExtended : boolean;
begin
Input.Itype := INPUT_KEYBOARD;
Input.ki.wVK := KeyToSend;
Input.ki.wScan := MapVirtualKey(KeyToSend, 0);
KeyExtended := KeyToSend in
[VK_CONTROL, VK_LCONTROL, VK_RCONTROL,
VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT,
VK_HOME, VK_END, VK_PRIOR, VK_NEXT,
VK_INSERT, VK_DELETE, VK_MENU];
Input.ki.dwFlags := DownUp_Flags_Arr[not KeyDown] or Extended_Flags_Arr[KeyExtended];
Input.ki.time := 0;
SendInput(1, Input, SizeOf(Input));
end;
Przykładowy kod działa ok. Pod Total Commanderem szybkie wyszukiwanie mam pod Altem i wszedłem w folder gdzie są pliki z literą "t" na początku nazwy. I wszystko działa ok. Popróbuj. Powinno działać.
SetForegroundWindow(FindWIndow('TTOTAL_CMD', nil));
Sleep(100);
KeyDownUp(VK_LMENU, True);
KeyDownUp(Ord('T'), True);
KeyDownUp(Ord('T'), False);
KeyDownUp(VK_LMENU, False);
Oczywiście okno docelowego programu, musi być na pierwszym planie.