Emulatory GBA i project64, i wirtualna klawiatura

0

Witam wszystkich. Mam takie pytanie: co mam zrobić żeby program odebrał znak tak jak te wysłane z klawiatury? Bo jak dałem w programie

keybd_event(VK_LEFT, 0, KEYEVENTF_KEYUP, 0);

albo SendMessage(hOkno, WM_CHAR, Word('z'), 0);

 czy kiedy sprawdzałem windowsową klawiaturę ekranową nic się nie stało, ale jak na klawiaturze wciskam klawisz to program go odbiera i mi stworek chodzi w emulatorze. Nie działały moje sposoby w żadnym emulatorze który próbowałem (emulator GameBoy'a GameBoy Advance i project64 czyli emulator Nintendo 64). Więc jak napisać program żeby emulator odebrał wszystko tak, jakby było wpisane z klawiatury i czemu te moje programiki nie chciały działać??
0

Jak już chcesz mieć wciśnięty klawisz w lewo to rób tak jak poniżej, bo Ty symulujesz "puszczenie klawisza" tylko:

  Keybd_Event(VK_LEFT, 0, 0, 0);
  Keybd_Event(VK_LEFT, 0, KEYEVENTF_KEYUP, 0);

Warunek jest taki, że musisz mieć focus na okno, które ma odebrać klawisze. Pomóc może też hook na klawiaturę.
Przeanalizuj sobie źródło tego prostego programu, który napisałem dla swojej klawiatury Manhattan po to aby móc
nie tylko w Internet Explorer ale również poza nim używać osobnych klawiszy strzałek na tejże klawiaturze i aby po
ich wciśnięciu uzyskiwać taki sam efekt jak w IE czyli strzalka dolna to Alt+Lewo, zaś strzałka górna to Alt+Prawo.
http://www.przeklej.pl/plik/mnk-rar-001b9g0dpbq4

0

Ale gapa ze mnie wkleiłem złą linijkę, ale w notatniku wszystko mi działało jak należy tak samo w firefoxie (nie testowałem tego drugiego kawałka kodu nigdzie inndziej niż w GBA). A klawisze i w ciskam i puszczam

    keybd_event(VK_LEFT, 0, KEYEVENTF_KEYUP, 0);  
    keybd_event(VK_LEFT, 0, KEYEVENTF_KEYUP, 0);
        hOkno:=FindWindow(nil, PChar('VisualBoyAdvance'));
        SendMessage(hOkno, WM_CHAR, Word('z'), 0);

Wszystko myślę że jest dobrze, ale jakoś mi te emulatory nie wykrywają żadnego wciśniętego klawisza.

0

Nadal widzę, że tylko puszczasz, zrob jak Tobie pisałem, pokombinuj z SetForegroundWindow(hOkno), a jak i
to nie pomoże to popróbuj jakoś z hookiem na klawisze, na przykład że F1 wywoła Tobie jakieś tam sekwencje
naciskania klawiszy. Jeżeli chcesz żeby dany klawisz coś wykonał, a nie naciśnał się po wykonaniu kodu, to w
procedurze obslugi Hooka daj na końcu obslugiwanego kodu Result := 1; A ja nic więcej nie wykombinuje ;/

0

Trochę minie nie było, ale tara już przez jakiś czas będę. Ostatni post pisałem w pośpiechu i znowu przez pomyłkę jakoś wstawiłem dwa razy jedną linijkę, to powinno wyglądać tak

    keybd_event(VK_LEFT, 0, KEYEVENTF_KEYUP, 0);
    keybd_event(VK_RIGHT, 0, 0, 0);

jak widać przyciski są i puszczane i wciskane, i to działa mi w notatniku, nawet na podstawie tego kodu zrobiłem sobie działający program który mnie loguje do WolfTeama (taka gra), nie chce mi to działać tylko w tych ww. emulatorach. Sprawdziłem dzisiaj ten kawałek kodu

        hOkno:=FindWindow(nil, PChar('VisualBoyAdvance'));
        SendMessage(hOkno, WM_CHAR, Word('z'), 0);

i to w nim mam jakiś błąd bo nie chce działać nigdzie, gdziekolwiek nie testowałem (w notatniku w firefoxie, na pulpicie), więc będę musiał się dowiedzieć jak to powinno być poprawnie, ale sadze że to i tak nie będzie działać, skoro to

keybd_event(VK_RIGHT, 0, 0, 0);

nie działa w ww. emulatorach.

0

Sprawdziłem i faktycznie zarówno emulator Amigi WinUAE jak i starym VisualBoyAdvance 1.7.2 Keybd_Event nie zdają rezultatu.
To samo kod ze strony http://www.delphipages.com/forum/archive/index.php/t-71018.html I pokombinuje jeszcze z globalnym
hookiem na klawiaturę, ale póki co nie wychodzi mi coś podmienianie klawisza na jakiś inny. Natomiast co do wysylania komikatu
WM_CHAR, to należy go wysłac do "dziecka" - kontrolki, którego "rodzicem" jest okno główne, a na taki komunikat, jak właśnie
WM_CHAR, zareagują tylko kontrolki typu TEdit lub TMemo albo stworzone ich odpowiedniki w WinAPI - jak właśnie w Notatniku.

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