Problem z emulacja klawiatury.

0

Witam
Mam dosyc dziwny problem ktorego nie moge sie pozbyc.
Chce zemulowac kombinacje klawiszy Alt+T w pewnym programie ktorego nie chce podawac nazwy.
Alt+T wklepany z klawiatury dziala idealnie ale emulacja nic!!
do tej pory emulowalem wszystko oprocz wlasnie tej kombinacji
oczywiscie w innych programach Alt+T emuluje sie ten klawisz wysmienicie (w wordzie, numpadzie itp)

kod ktory uzywam:

keybd_event(VK_lmenu, 0, 0, 0);
keybd_event(ord('T'), 0, 0, 0);
keybd_event(ord('T'), 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_lmenu, 0, KEYEVENTF_KEYUP, 0);

no a wcisniencie fizyczne klawiatury alt+t powtarzam dziala OK, czy jest jakis inny sposob na emulacje tego klawisza? bo juz sobie włosy wyrywam z głowy. Dzieki za pomoc

/Mienio

1

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.

0

Działa cudownie. Dziekuje za pomoc !
i przytulam =ó--(.)--ó=

Pozdrawiam
/Mienio

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