none
SendInput() reagiert nicht in allen Anwendungen RRS feed

  • Frage

  • Hallo, ich lasse im Hintergrund eine Art Hotkey-Programm laufen und frage mit GetAsyncKeyState() ab ob eine bestimmte Taste gedrückt wurde und "simuliere" damit eine andere Taste, leider reagiert dies nicht in allen Anwendungen. Im folgenden Codebeispiel soll einfach der Tastendruck der Zifferntaste 8 ausgegeben werden.

    Im z.B. Windows Texteditor funktioniert es.

    BYTE send_key = 'VK_8';		
    			KEYBDINPUT kb={0};
    			INPUT  Input={0};
     			kb.wVk = send_key; 
    			Input.type = INPUT_KEYBOARD;
    			Input.ki = kb;
    			::SendInput(1,&Input,sizeof(Input));
    

    Z.B. habe ich es aktuell in einem Spiel getestet dort reagiert die Anwendung nur in dessen  Chatt-Channel (also dort wird auch die 8 tatsächlich gesendet), aber auf der "normalen" Spiel-Oberfläche reagiert das Spiel leider nicht  , wie wenn man z.B. dort die Taste 8 drückt. 

    Hat mir hier jemand einen Tipp woran das liegen könnte ?

    Montag, 7. Februar 2011 16:40

Antworten

  • So für alle die dieses Post event. auch lesen und mit SendInput() etwas an eine DirectX bzw. DirectInput  Anwendung, senden wollen, habe ich mal folgendes kopiert.

    Microsoft DirectX 9.0
    Interpreting Keyboard Data

    --------------------------------------------------------------------------------
    ...
    In one important respect, Microsoft® DirectInput® applications read the keyboard differently from the way Microsoft Windows® does. For DirectInput applications, keyboard data refers not to virtual keys but to the actual physical keys—that is, the scan codes. DIK_ENTER, for example, refers only to the ENTER key on the main keyboard, not to the ENTER key on the numerical keypad.

    ...

    --------------------------------------------------------------------------------

    © 2002 Microsoft Corporation. All rights reserved.

    So wie ich glaube es verstanden zu haben muß an wSCAN der SendInput() Methode der Länder- bzw. event. sogar Tastaturspezifischen Wert übergeben werden. Im folgenden Code ist für SendInput der Taste 8 der Dezimalwert 56 (oder Hex oder VK) an wVk übergeben und für wSCAN der Dezimalwert 9.(oder Hex oder ein mit.z.B. generierter VK z.B. dinput.h)

    Was mich noch interessieren würde, ob man über den Dezimalwert oder Hexwert von VK an den Dezimalwert oder Hexwert des Scancodes kommt, ohne diesen airgendwo vorher "händisch" für alle "Keys" zuzuweisen.

    KEYBDINPUT kb={0};
    
    INPUT Input={0};
    
    kb.wVk =56; 
    
    kb.wScan = 9;
    
    Input.type = INPUT_KEYBOARD;
    
    Input.ki = kb;
    
    ::SendInput(1,&Input,sizeof(Input));
    Dienstag, 8. Februar 2011 19:30

Alle Antworten

  • Du drückst die Taste nur... vielleicht solltest Du sie auch wieder loslassen!
    Siehe diverse Beispiele zu SendInput...


    Jochen Kalmbach (MVP VC++)
    Montag, 7. Februar 2011 16:50
  • Hallo Jochen, falls Du es so gemeint hast, das ändert auch nichts an der bisherigen Funktionalität, außerdem habe ich ja geschrieben das es in bestimmten Anwendungen ganz oder teilweise funktioniert. In meinen bisher getesteten Anwendung wird bei Drücken der Taste schon etwas ausgelöst nicht erst beim "loslassen".
    BYTE send_key = 'VK_8';		
    
    			KEYBDINPUT kb={0};
    			INPUT  Input={0};
     			kb.wVk   = send_key; 
    			kb.wScan  = 0;
    			kb.dwFlags = 0;
    			kb.time  = 0;
    			kb.dwExtraInfo = 0;
    			Input.type = INPUT_KEYBOARD;
    			Input.ki = kb;
    			::SendInput(1,&Input,sizeof(Input));
    	
     			kb.wVk   = send_key; 
    			kb.wScan  = 0;
    			kb.dwFlags = KEYEVENTF_KEYUP;
    			kb.time  = 0;
    			kb.dwExtraInfo = 0;
    			Input.type = INPUT_KEYBOARD;
    			Input.ki = kb;
    			::SendInput(1,&Input,sizeof(Input));
    
    Montag, 7. Februar 2011 18:38
  • > Hat mir hier jemand einen Tipp woran das liegen könnte ?

    Nur die aktive Anwednng und das aktive Fenster, das den Fokus hat bekommt die Tastatureingabe.

    Also nur einfach SendInput auszulösen bringt nicht viel, wenn nicht die richtige Anwendung, die die Tastatureingabe erhalten soll, den Fokus hat.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 7. Februar 2011 21:02
    Moderator
  • Wie ich ja bereits geschrieben habe, läuft natürlich die aktive Anwendung im Vordergrund und funktioniert dort auch teilweise, aber eben nicht so als ob ich von der Tastatur eine Taste drücke...

    Kann es sein das eine Anwendung so programmiert ist das diese "irgendwie direkt " auf die Tastatur zugreift bzw. abfragt und deshalb SendInput nicht greift  ?

    Edit: So nach nur 5 Stunden "googeln" :-) habe ich etwas gefunden wo jemand schreibt das die normalen VK bei Anwendungen die DirectInput -Anwenungen sind, nicht funktionieren sollen. Wenn ich das also richtig verstanden habe müsste ich zuerst einmal abfragen welchen Wert die Anwendung bei einem bestimmten Tastendruck als z.B. Hex-Wert sendet , damit ich den mit SendInput an wScan wieder senden kann ? Falls ja wie geht sowas ?

    Montag, 7. Februar 2011 21:49
  • 1. Eine Anwendnung "sendet" selbst nichts. Das was SendInput erzeugt ist generalisiert und verwendet die Eingabe Queue von Windows. Wie sollte auch sonst Tastatureingabe verarbeitet werden.
    2. SendInput ist die niedridgste Möglichkeit und die einzige (ohne einen Treiber zu bauen) um Tastatureingaben zu erzeugen.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Dienstag, 8. Februar 2011 06:38
    Moderator
  • So für alle die dieses Post event. auch lesen und mit SendInput() etwas an eine DirectX bzw. DirectInput  Anwendung, senden wollen, habe ich mal folgendes kopiert.

    Microsoft DirectX 9.0
    Interpreting Keyboard Data

    --------------------------------------------------------------------------------
    ...
    In one important respect, Microsoft® DirectInput® applications read the keyboard differently from the way Microsoft Windows® does. For DirectInput applications, keyboard data refers not to virtual keys but to the actual physical keys—that is, the scan codes. DIK_ENTER, for example, refers only to the ENTER key on the main keyboard, not to the ENTER key on the numerical keypad.

    ...

    --------------------------------------------------------------------------------

    © 2002 Microsoft Corporation. All rights reserved.

    So wie ich glaube es verstanden zu haben muß an wSCAN der SendInput() Methode der Länder- bzw. event. sogar Tastaturspezifischen Wert übergeben werden. Im folgenden Code ist für SendInput der Taste 8 der Dezimalwert 56 (oder Hex oder VK) an wVk übergeben und für wSCAN der Dezimalwert 9.(oder Hex oder ein mit.z.B. generierter VK z.B. dinput.h)

    Was mich noch interessieren würde, ob man über den Dezimalwert oder Hexwert von VK an den Dezimalwert oder Hexwert des Scancodes kommt, ohne diesen airgendwo vorher "händisch" für alle "Keys" zuzuweisen.

    KEYBDINPUT kb={0};
    
    INPUT Input={0};
    
    kb.wVk =56; 
    
    kb.wScan = 9;
    
    Input.type = INPUT_KEYBOARD;
    
    Input.ki = kb;
    
    ::SendInput(1,&Input,sizeof(Input));
    Dienstag, 8. Februar 2011 19:30