Uspeo sam :))
Bilo je potrebno samo (cuj, "samo" :)) ukljuciti KEYEVENTF_EXTENDEDKEY flag kod keybd_event procedure, obzirom da se scan code tastera/strelice "dole" sastoji od dva bajta - e0 50 :) (e0 je dodatni bajt koje je potrebno "preskociti", upravo postavljanjem KEYEVENTF_EXTENDEDKEY flega).
Sa ovom ispravkom, pritisak na kursorsku strelicu "dole" izgleda ovako:
Dodatno deklarisemo i definisemo KEYEVENTF_EXTENDEDKEY flag (KEYEVENTF_KEYUP nam je ostao od malopre):
Code:
const int KEYEVENTF_EXTENDEDKEY = 0x1;
const int KEYEVENTF_KEYUP = 0x2;
Postupak za simuliranje izgleda ovako:
Code:
keybd_event(0x28, MapVirtualKey(0x28, 0), KEYEVENTF_EXTENDEDKEY, 0);
Thread.Sleep(30);
keybd_event(0x28, MapVirtualKey(0x28, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
Ovde primecujemo jos dve stvari - prvo da smo izbacili promenljivu TheKey koju smo prethodno deklarisali kao char jer char (karakter) oznaka tastera "DOWN" ne postoji, a zatim da smo izbacili i VkKeyScan(TheKey) funkciju iz istog razloga - nemamo TheKey karakter, pa ne mozemo ni naci virtual key code "ni iz cega", vec key code tastera "DOWN" (cija je vrednost 0x28) prinosimo kao direktan parametar u proceduri keybd_event.
I jos jedna napomena/objasnjenje za ovo
Thread.Sleep(30) - potrebno je na trenutak zaustaviti thread kako bi aplikacija uspela da procita pritisak tastera (dovoljna pauza je vec od 20 milisekundi, za manje vrednosti je pitanje) pre no sto posaljemo signal da je taster otpusten. Ako je pauza manja od 20 milisekundi ili je uopste nema, citav dogadjaj simulacije pritiska tastera ce vrlo verovatno proci neopazeno jer se desio previse brzo. U primeru koristimo pauzu od 30 milisekundi, za svaki slucaj :)
Na kraju bih samo podsetio kako smo deklarisali prototip procedure
keybd_event:
Code:
static extern void keybd_event(short bVk, uint bScan, uint dwFlags, int dwExtraInfo);
... gde su parametri sledeci:
bVk // "Virtual Keycode" vrednost tastera, npr. VK_RETURN, VK_TAB…
bScan // "Scan Code" vrednost tastera, npr. 0xb8 za taster "Left Alt" (levi "Alt" taster)
dwFlags // fleg koji se postavlja za trenutno stanje tastera, npr. KEYEVENTF_KEYUP (taster podignut)
dwExtraInfo // dodatna 32-bit-na informacija o stanju tastera
Koga zanima vise o ovome (npr. ove dodatne informacije poslednjeg parametra) moze pogledati link -
http://www.codeproject.com/KB/system/keyboard.aspx?display=Print, a za tabelu "scan code"-ova pogledajte npr. ovaj link -
http://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html .
PoZz svima, i srecni Vam praznici!
BugA :)
[Ovu poruku je menjao ((BugA)) dana 28.12.2008. u 16:15 GMT+1]