Panowie! Lepszej odpowiedzi nie mogłem się spodziewać. Bardzo dziękuje i zabieram się do pracy. Wrócę z kolejnym problemem lub prośbą o wiedzę.
/edit
Tak zastanawiałem się nad tą tablicą struktury INPUT i mam kilka pytań.
1. W moim kodzie, dla "
podniesienia" klawisza użyłem następującej instrukcji:
aaa.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; //podniesienie klawisza
Czy "flaga" KEYEVENTF_SCANCODE jest tutaj do czegoś potrzebna, czy wystarczy samo KEYEVENTF_KEYUP. W sumie program działa jednakowo i tak ...i tak. hmmm
2. Tablica "INPUT-ów" musiałaby zawierać 2x tyle pól ile jest liter w stringu przygotowywanym do wysłania. Każda literka zajmie 2 pola w tablicy (jedno dla wduszenia klawisza, a drugie dla zwolnienia klawisza). Przykładowy kod:
INPUT aaa[4] = {0};
// wduszenie klawisza 'A' - 0x1E
aaa[0].type = INPUT_KEYBOARD;
aaa[0].ki.dwFlags = 0;
aaa[0].ki.time = 0;
aaa[0].ki.dwExtraInfo = 0;
aaa[0].ki.wScan = 0x1E;
aaa[0].ki.dwFlags = KEYEVENTF_SCANCODE;
// zwolnienie klawisza 'A' - 0x1E
aaa[1] = aaa[0];
aaa[1].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; //tutaj wstawiam te dwie flagi bo nie mam pewności jak to naprawdę powinno być.
// wduszenie klawisza 'B' - 0x30
aaa[2] = aaa[0];
aaa[2].ki.wScan = 0x30;
aaa[2].ki.dwFlags = KEYEVENTF_SCANCODE;
// zwolnienie klawisza 'B' - 0x30
aaa[3] = aaa[0];
aaa[3].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
SendInput(4,in,sizeof(INPUT));
Tak myślę, że jeśli zdefiniowałbym tą tablicę struktur poza tą feralną funkcją, w feralnym timerze, to zyskałbym trochę czasu w [ms]. Ponieważ wewnątrz funkcji odwoływałbym się do tych pól wskaźnikiem. To byłoby chyba szybsze niż wypełnianie tego wszystkiego wewnątrz funkcji. Jest tylko jeden problem...
Gdy robię to na piechotę, bez tablicy INPUT-ów, to między wduszeniem a zwolnieniem kolejnych klawiszy mogę umieścić Sleep(); Tutaj nie widzę takiej możliwości. Jest
aaa[?].ki.time. Na MSDN piszą, że to "time stamp" ale szukam informacji i nigdzie nie mogę znaleźć czy to faktycznie jest opóźnienie w [ms], czy po prostu czas pozostawiony do dyspozycji dla tego zdarzenia. Jak to rozumieć? Czy ktoś z Was testował jak to naprawdę jest?
3. Ostatnie pytanie: jak często używać funkcji Application->ProcessMessages(); ? Czy przed wywołaniem funkcji SendInput();? Czy pomiędzy wduszeniem a zwolnieniem przycisku? Czy po każdym wywołaniu funkcji SendInput(); nie zależnie czy chodzi o wduszenie, czy zwolnienie klawisza?
Jak odnieść się z Application->ProcessMessages(); do przykładu z tablicą INPUT-ów? gdzie to wcisnąć w kodzie?