Tastendruck Simulation geht nicht plz HLP
-
...
[ Dieser Beitrag wurde am 16.01.2003 um 13:28 Uhr von SpliFFa editiert. ]
-
Hab forlgenden code
void DrueckTaste(int vKey) { KEYBDINPUT ki={0}; ki.wVk = vKey; ki.wScan = MapVirtualKeyEx(vKey, 0, GetKeyboardLayout(0)); INPUT ipEvent; ipEvent.type = INPUT_KEYBOARD; ipEvent.ki = ki; SendInput(1,&ipEvent,sizeof(INPUT)); } void TasteLoslassen(int vKey) { KEYBDINPUT ki={0}; ki.wVk = vKey; ki.wScan = MapVirtualKeyEx(vKey, 0, GetKeyboardLayout(0)); INPUT ipEvent; ipEvent.type = INPUT_KEYBOARD; ipEvent.ki = ki; ipEvent.ki.dwFlags = KEYEVENTF_KEYUP; SendInput(1,&ipEvent,sizeof(INPUT)); }
wenn ich nun
DrueckTaste(VK_LBUTTON); //TasteLoslassen(VK_LBUTTON);
mache gehts aber die taste wird NICHT wieder losgelassen (fehlt ja auch die andre func.
Aber sobald ich es so macheDrueckTaste(VK_LBUTTON); TasteLoslassen(VK_LBUTTON);
passiert garnix ....
Bitte ein paar TIPS
habe auch folgendes probiert
void test() { KEYBDINPUT ki_up, ki_down; ki_up.wVk = VK_LBUTTON; ki_up.wScan = 0; ki_up.dwFlags = KEYEVENTF_KEYUP; ki_up.dwExtraInfo = 0; ki_up.time = 0; ki_down.wVk = VK_LBUTTON; ki_down.wScan = 0; ki_down.dwFlags = 0; ki_down.dwExtraInfo = 0; ki_down.time = 0; INPUT ipt_up, ipt_down; ipt_up.type = INPUT_KEYBOARD; ipt_up.ki = ki_up; ipt_down.type = INPUT_KEYBOARD; ipt_down.ki = ki_down; SendInput(1, &ipt_down, sizeof(ipt_down)); SendInput(1, &ipt_up, sizeof(ipt_up)); }
klappt aber auch ned
seiden ich kommentier
SendInput(1, &ipt_up, sizeof(ipt_up));
aus dann gehst aber die taste wird ned losgelassen...
auch mit dem Beispielen von Vegenza [url] http://www.webtools.gu1.info/wbboard/thread.php?threadid=57&boardid=6&styleid=2 [/url]
klappts ned ....
mano
....
[ Dieser Beitrag wurde am 16.01.2003 um 13:49 Uhr von SpliFFa editiert. ]
-
verstehe noch nicht viel von winapi, aber das habe ich in einem tutorial gefunden. vielleicht hilfts dir ja
2.1 Tastatur- und Mauseingaben In diesem Kapitel will ich zeigen, wie man Tastatur- und Mauseingaben auswertet. Hier kann man ein recht einfaches Beispiel für Messages unter Windows sehen. Wenn eine Taste gedrückt wird postet Windows dem aktiven Fenster die Nachricht WM_KEYDOWN der wParam enthalt den Keycode(virual-key code). Diese virtuellen Keycodes sind in der WINUSER.H definiert. Ich will einfach mal die wichtigsten aufzählen: Dezimal Name Taste 01 VK_LBUTTON Linke Maustaste 02 VK_RBUTTON Rechte Maustaste 04 VK_MBUTTON Mittlere Maustaste 03 VK_CANCEL Strg =+ Untrbr 08 VK_BACK Rücktaste 09 VK_TAB Tab 0D VK_RETURN Enter 10 VK_SHIFT Umschalttaste(links und rechts) 11 VK_LBUTTON Strg(links und rechts 12 VK_MENU ALT(links und rechts) 13 VK_PAUSE Pause 14 VK_CAPITAL Feststelltaste 1B VK_ESCAPE Esc 20 VK_SPACE Leertaste 21 VK_PRIOR Bild auf 22 VK_NEXT Bild ab 23 VK_END Ende 24 VK_HOME Pos 1 25 VK_LEFT Linkspfeil 26 VK_UP Pfeil aufwärts 27 VK_RIGHT Rechtspfeil 28 VK_DOWN Pfeil abwärts 46 VK_INSERT Einfg 47 VK_DELETE Entf So hier will ich mal ein einfaches Beispiel geben: Wir möchten unser Programm gerne beenden, wenn Esc gedrückt wird: LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch (iMsg) { case WM_KEYDOWN : switch(wParam) { case VK_ESCAPE: SendMessage(hwnd,WM_DESTROY,0,0); break; } return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } Ich habe nur WndProc des Beispiels aufgeschrieben. Ich denke die WinMain ist so Elementar. Die müsst ihr vorwärts und Rückwärts aufsagen können. D.h. ihr könnt sie ja noch mal nachschlagen (Kapitel 1.2) Aber jetzt zu dem Beispiel: Ihr seht hier ja eigentlich nichts besonderes neues nur eine neue Message WM_KEYDOWN und wenn der wParam VK_ESACPE ist dann schicken wir an unser eigenes Fenster die Message WM_DESTROY.(um es zu beenden). Es gibt ebenfalls eine Message WM_KEYUP: Sie hat die selben Parameter wie WM_KEYDOWN und dann gepostet, wenn eine Taste losgelassen wurde. Nun können wir aber noch keine "normalen" Tasten einlesen. Dafür gibt es eine zweite Message: WM_CHAR. Diese Message übergibt als wParam ein Zeichen(TCHAR). Hier können wir einfach den wParam mit einem beliebigen Zeichen vergleichen: if(wParam=='a'){...} Es werden auch Tabulatoren etc. mit übergeben: if(wParam=='\t'){...} D.h. es werden ganz alle Zeichen als ANSI bzw. UNICODE übergeben Ich zeig euch einfach nochmal ein Beispiel: LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch (iMsg) { case WM_CHAR : switch(wParam) { case '\r': //Wenn Enter gedrückt wird SendMessage(hwnd,WM_DESTROY,0,0); //wird unser Programm beendet break; case '\b': // Rücktaste .... break; case 'a': // klein a .... break; case 'A': // groß A .... break; } return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } So das wars schon jetzt könnt ihr Tastatureingaben einlesen. Kommen wir zur Maus. Die Maus ist von ihren Eingaben nicht weiter Spektakulär: Wir haben zunächst die schonmal erwähnte Message WM_MOUSEMOVE. Sie wird gepostet, wenn sich die Mause über unser Fenster bewegt. Die x-Koordinate ist im HIWORD(lParam) versteckt und die y-Koordinate im LOWORD(lParam). Es ist wichtig zu erwähnen, dass diese Koordinaten keine absoluten Koordinaten sind sondern die Koordinaten im Fenster(d.h. da wo der weiße Bereich links oben beginnt ist der Punkt (0|0).) Der wParam ist ein Keyflag und kann folgende Werte annehmen: Wert Beschreibung MK_CONTROL Die Strg-Taste ist gedrückt. MK_LBUTTON Die linke Maustaste ist gedrückt. MK_MBUTTON Die mittlere Maustaste ist gedrückt. MK_RBUTTON Die rechte Maustaste ist gedrückt. MK_SHIFT Die Shift-Taste ist gedrückt. Nun gibt es noch die Messages WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK. Diese Messages werden gepostet, wenn die linke Maustaste gedrückt bzw. losgelassen bzw. Doppelgeklickt hat. (Die selben Messages gibt es auch für die rechte und mittlere Maustaste: man muss nur das L durch ein R bzw. durch ein M ersetzen) Die Parameter sind die selben, wie bei WM_MOUSEMOVE. Ich glaube zum Abschluss nochmal ein Beispiel: LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { char co[10]; switch (iMsg) { case WM_RBUTTONDOWN : //Wenn die rechte case WM_LBUTTONDOWN : //oder die linke Maustaste gedrückt wird itoa( LOWORD(lParam), co, 10 ); //wird die X-Koordinate in einen String kopiert MessageBox(0,"Die X-Koordinate der Mouse:",co,0);//und ausgegeben itoa( HIWORD(lParam), co, 10 ); //Das selbe mit der Y-Koordinate MessageBox(0,"Die Y-Koordinate der Mouse:",co,0); return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } So und jetzt könnt ihr auch Mauseingaben verarbeiten.
-
Gib mal bei DrueckTaste auch bei Flags was an, kann sein, dass das KEYEVENTF_KEYDOWN heisst...
cya
-
Vorallem bringt es nichts wenn du die Taste drückst und nahezu im gleichen Moment wieder loslässt. Probier mal ein Sleep(10)
cu para