Texteingabe in Textfeldern von anderen Anwendungen & Sonderzeichen(neu)


  • Mod

    Lies die MSDN:
    http://msdn2.microsoft.com/en-us/library/ms645540.aspx

    Speziell der letzte Abschnitt:
    VK_PACKET (E7)
    Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP

    Siehe auch Doku zu SendInput!



  • Also kann mit der Funktion SendInput die Sonderzeichen über das ki,welches ebenfalls eine Struktur ist, der Struktur an die Funktion keybd_event() senden, wenn ich VK_PACKET als Key angebe??

    typedef struct tagINPUT { 
      DWORD type; 
      union {MOUSEINPUT mi; 
                KEYBDINPUT ki;
                HARDWAREINPUT hi;
               };
      }INPUT, *PINPUT;
    

    Irgendwie verwirrt mich das mitlerweile mit den ganzen Virtual Keys und so! ^^
    Gibt es keinen leicheren Weg oder so??
    Ich möchte doch nur ebenfalls Sonderzeichen eintippen...


  • Mod

    Vergiss keybd_event, verwende SendInput.

    Es geht nicht einfacher. Anders kommen die Daten nicht an.



  • Aber die Struktur ki verlangt doch ebenfalls ein Virtual-Key Code, oder?
    Also kann ich mit der Funktion SendInput ebenfalls keine Sonderzeichen übermitteln oder?

    UINT SendInput(UINT nInputs,
        [b]LPINPUT pInputs,[/b]
        int cbSize
    );
    
    typedef struct [b]tagINPUT[/b] { 
      DWORD type; 
      union {MOUSEINPUT mi; 
                [b]KEYBDINPUT ki;[/b]
                HARDWAREINPUT hi;
               };
    }INPUT, *PINPUT;
    
    typedef struct [b]tagKEYBDINPUT[/b] {
        WORD wVk;
        WORD wScan;
        DWORD dwFlags;
        DWORD time;
        ULONG_PTR dwExtraInfo;
    } KEYBDINPUT, *PKEYBDINPUT;
    


  • Ist das Fenster ein normales Edit Control? Wenn ja, wieso machst du das nicht mit WM_SETTEXT? 😕



  • Lies dir doch mal die Doku zu dieser Struktur durch:

    wVk
    Specifies a virtual-key code. The code must be a value in the range 1 to 254. The Winuser.h header file provides macro definitions (VK_*) for each value. If the dwFlags member specifies KEYEVENTF_UNICODE, wVk must be 0.
    wScan
    Specifies a hardware scan code for the key. If dwFlags specifies KEYEVENTF_UNICODE, wScan specifies a Unicode character which is to be sent to the foreground application.

    Oder auf deutsch:
    Du setzt wVK auf 0, dwFlags auf KEYEVENTF_UNICODE (bzw. KEYEVENTF_UNICODE|KEYEVENTF_KEYUP) und wScan auf das zu übergebende Sonderzeichen.



  • Also müsste es so klappen??

    tagINPUT* inputt = new tagINPUT;
    tagKEYBDINPUT* keybinput = new tagKEYBDINPUT;
    
    inputt->type=INPUT_KEYBOARD;
    inputt->ki=*keybinput;
    
    keybinput->wVk=0;
    keybinput->dwFlags=KEYEVENTF_UNICODE|KEYEVENTF_KEYUP;
    
    keybinput->wScan='A';
    SendInput(1,inputt,sizeof(inputt));
    


  • Also ich komme mit meinem Code, nicht weiter!
    Könnte mir bitte jemand weiter helfen?


  • Mod

    TheCaleb schrieb:

    Also ich komme mit meinem Code, nicht weiter!
    Könnte mir bitte jemand weiter helfen?

    Kristallkugel habe ich hier an meinem Arberitsplatz keine.
    Was geht denn nicht?



  • Also ich versuche mit SendInput eine Tastatureingabe zu simulieren.
    Sprich, ich möchte gerne in einem anderen Programm einen Text eingeben lassen, wenn ich das jeweilige Eigabefeld makiert habe und das sollte möglichst auch mit Sonderzeichen gehen, sonst würde ich ja die Funktion keybd_event verwenden.

    Doch, wie muss ich das genau machen?
    Bis jetzt habe ich Objekte oder wie man das nennen soll von den Strukturen erzeugt und die einzelnen Variabeln, von denen mit den jeweiligen Daten gefüllt, wie du unten sehen kannst.
    Doch was mache ich falsch bzw was muss ich noch machen um mit SendInput zu arbeiten, so wie ich es mir erwünscht habe?

    tagINPUT* inputt = new tagINPUT;
    tagKEYBDINPUT* keybinput = new tagKEYBDINPUT;
    
    inputt->type=INPUT_KEYBOARD;
    inputt->ki=*keybinput;
    
    keybinput->wVk=0;
    keybinput->dwFlags=KEYEVENTF_UNICODE|KEYEVENTF_KEYUP;
    
    keybinput->wScan='A';
    SendInput(1,inputt,sizeof(inputt));
    

  • Mod

    TheCaleb schrieb:

    tagINPUT* inputt = new tagINPUT;
    tagKEYBDINPUT* keybinput = new tagKEYBDINPUT;
    
    inputt->type=INPUT_KEYBOARD;
    inputt->ki=*keybinput;
    
    keybinput->wVk=0;
    keybinput->dwFlags=KEYEVENTF_UNICODE|KEYEVENTF_KEYUP;
    
    keybinput->wScan='A';
    SendInput(1,inputt,sizeof(inputt));
    

    Ich würde Dir erstmal empfeheln die Grundstrukturen von C++ zu lernen.
    INPUT ist eine Struktur, die eine union enthält.
    Du musst nicht alles mit new anlegen. Und schon gar nicht die innere Struktur?

    Hast Du mal in die MSDN gesehn?
    Hast Du mal in die FAQ gesehen? 👎

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-165868-and-highlight-is-sendinput.html



  • Danke, ich habe es nun geschafft!! 🙂



  • Ich wandel ein AnsiString wo nur ein ä drin steht mit ParamsEncode von Indy um, sodass es in UniCode (%E4) steht.

    Wie bekomme ich es hin, %E4 aus einem AnsiString in 0xE4 umzuwandeln, sodass ich es wScan übergeben kann??


  • Mod

    Indem man den Text parsed und an dieser Stelle z.B. strtol mit Basis 16 verwendet.



  • Vielen Dank für den Tipp!!


Anmelden zum Antworten