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 mache

    DrueckTaste(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
    😃


Anmelden zum Antworten