IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

[Interop][C#]SendInput à partir de TextBox


Sujet :

C++/CLI

  1. #1
    Membre éclairé Avatar de DonkeyMaster
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 95
    Par défaut [Interop][C#]SendInput à partir de TextBox
    Bonjour,
    J'ai une application Windows Forms avec un bouton "SendKeys" et un champ de texte.

    Voici ce que j'essaie de faire :
    Je lance mon application.
    Je crée un processus "notepad" et j'en garde le Handle.
    J'entre du texte dans le champ de texte.
    J'appuie sur mon bouton.
    Le texte entré s'affiche sur Notepad.


    Je n'ai pas de problèmes pour lancer et référencer Notepad.
    J'ai un problème pour envoyer du texte vers Notepad.
    Quand j'ai utilisé Form.SendKeys, j'ai pu envoyer des touches la première fois, mais les fois suivantes où j'ai cliqué sur le bouton, rien ne se passe sur Notepad.
    Alors, j'ai écarté la méthode Form.SendKeys. De toutes façons, je ne veux pas dépendre de Windows.Forms si je crée d'autres applications.

    Alors, j'utilise SendInput pour envoyer des évènements clavier à Notepad. Cette méthode marche bien, mais je n'arrive pas à convertir les caractères dans mon champ de texte. Par exemple, si je tape le caractère 'a' dans mon champ de texte, Notepad reçoit NumPad1.

    Voici des extraits du code que j'ai utilisé :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public const int INPUT_MOUSE = 0;
    public const int INPUT_KEYBOARD = 1;
    public const int INPUT_HARDWARE = 2;
     
    [DllImport( "user32.dll" )]
    public static extern bool SetForegroundWindow (IntPtr hWnd);
     
     [DllImport( "user32.dll" )]
    public static extern IntPtr GetForegroundWindow ();
     
    [DllImport( "user32.dll" )]
    public static extern IntPtr GetMessageExtraInfo ();

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
        [StructLayout( LayoutKind.Explicit )]
        public struct INPUT
        {
            [FieldOffset( 0 )]
            public int type;
            [FieldOffset( 4 )]
            public MOUSEINPUT mi;
            [FieldOffset( 4 )]
            public KEYBDINPUT ki;
            [FieldOffset( 4 )]
            public HARDWAREINPUT hi;
        }
     
        [StructLayout( LayoutKind.Sequential )]
        public struct MOUSEINPUT
        {
            public int dx;
            public int dy;
            public uint mouseData;
            public uint dwFlags;
            public uint time;
            public IntPtr dwExtraInfo;
        }
     
        [StructLayout( LayoutKind.Sequential )]
        public struct KEYBDINPUT
        {
            public ushort wVk;
            public ushort wScan;
            public uint dwFlags;
            public uint time;
            public IntPtr dwExtraInfo;
        }
     
        [StructLayout( LayoutKind.Sequential )]
        public struct HARDWAREINPUT
        {
            public uint uMsg;
            public ushort wParamL;
            public ushort wParamH;
        }

    Ce code envoie bien le caractère 'W'
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    INPUT input = new INPUT();
    input.type = Puppr.INPUT_KEYBOARD;
    input.ki = new KEYBDINPUT();
    input.ki.dwExtraInfo = GetMessageExtraInfo();
    input.ki.dwFlags = 0;
    input.ki.time = 0;
    input.ki.wScan = 0;
    input.ki.wVk = (ushort) System.Windows.Forms.Keys.W;
     
    SendInput( 1, ref input, Marshal.SizeOf( input ) );

    Mais ce code n'envoie pas les caractères dans TextBox. Par exemple, si le texte dans le champ de texte est "abc", notepad reçoit "123".
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach ( char ch in textBox1.Text ) {
        input.ki.wVk = (ushort) ch;
        SendInput( 1, ref input, Marshal.SizeOf( input ) );
    }

    Je voudrais savoir comment convertir le texte dans un TextBox en ushort pour SendInput.

  2. #2
    Membre éclairé Avatar de DonkeyMaster
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 95
    Par défaut
    La fonction VkKeyScan est ce que je cherche.
    J'ai écrit un extrait de code sur pinvoke.net

  3. #3
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    dans la faq vc, il y a une démo de SendInput http://cpp.developpez.com/faq/vc/?pa...mulateKeyBoard

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Controle Chart à partir de textbox et datagridview
    Par josker dans le forum Windows Forms
    Réponses: 0
    Dernier message: 14/09/2011, 20h48
  2. Créer un PDF à partir de TextBox en VB.NET
    Par floriaan60 dans le forum Windows Forms
    Réponses: 10
    Dernier message: 19/06/2008, 10h35
  3. Ajouter valeur dans mon dataset a partir de textbox
    Par lulu3111 dans le forum C++/CLI
    Réponses: 1
    Dernier message: 18/04/2007, 17h12
  4. Remplir une dataset à partir du textbox
    Par andres007 dans le forum Accès aux données
    Réponses: 4
    Dernier message: 26/02/2007, 22h53
  5. [VB.NET] Pb sur update à partir champs Textbox
    Par patdez dans le forum ASP.NET
    Réponses: 5
    Dernier message: 28/06/2006, 09h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo