Num Pad Virtuel : SendInput ?? [Résolu]

Bubuss 147 Messages postés samedi 7 juin 2003Date d'inscription 8 décembre 2007 Dernière intervention - 16 mars 2007 à 16:22 - Dernière réponse : Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention
- 13 août 2010 à 13:09
Salut tt lmonde,
Je suis en train de chercher à faire un num pad virtuel à la manière du clavier virtuel de windows pour que ma fenetre ou mon programme actif (tel que le bloc note par exemple) reçoive l'evenement clavier du chiffre que je souhaite
Je me suis renseigné sur la fonction SendInput() et j'ai téléchargé quelques exemples de code mais je ne saisi pas du tout comment cette méthode s'implémente.. 

Auriez vous un exemple en C# de l'utilisation de cette fonction pour appeler un evenement clavier ?
Merci
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 17 mars 2007 à 05:29
3
Merci
Salut, pourtant on a donné pas mal d'exemples de SendInput dans le forum. Regardes aussi la classe managée SendKeys.

[ StructLayout( LayoutKind.Sequential ) ]
internal struct KEYBDINPUT
{
    public uint type;
    public ushort vk;
    public ushort scan;
    public uint flags;
    public uint time;
    public UIntPtr extraInfo;
    private uint padding0;
    private uint padding1;
}


[ System.Security.SuppressUnmanagedCodeSecurity ]
internal static class Win32
{
    public const int INPUT_KEYBOARD = 1;
    public const int KEYEVENTF_KEYUP = 0x0002;


    public static readonly int SIZEOF_INPUT = Marshal.SizeOf( typeof(  KEYBDINPUT ) );


    [ DllImport( "user32.dll", SetLastError = true ) ]
    public static extern uint SendInput( uint num, [ In ] KEYBDINPUT[ ] inputs, int size );


    [ DllImport( "user32.dll" ) ]
    public static extern IntPtr GetMessageExtraInfo( );
}


public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent( );


        TextBox tb = new TextBox( );
        tb.Multiline = true;
        tb.Dock = DockStyle.Fill;
        tb.Parent = this;


        Button b = new Button( );
        b.Text = "A";
        b.Dock = DockStyle.Bottom;
        b.Parent = this;
        b.Click += delegate
        {
            tb.Focus( ); // Pour l'exemple seulement.


            KEYBDINPUT[ ] inputs = new KEYBDINPUT[ 2 ];
            inputs[ 0 ].type = Win32.INPUT_KEYBOARD;
            inputs[ 0 ].vk = ( ushort )Keys.A;
            inputs[ 0 ].flags = 0; // KEYEVENTF_KEYDOWN
            inputs[ 0 ].extraInfo = ( UIntPtr )( int )Win32.GetMessageExtraInfo( );
            inputs[ 1 ].type = Win32.INPUT_KEYBOARD;
            inputs[ 1 ].vk = ( ushort )Keys.A;
            inputs[ 1 ].flags = Win32.KEYEVENTF_KEYUP;
            inputs[ 1 ].extraInfo = ( UIntPtr )( int )Win32.GetMessageExtraInfo( );


            Win32.SendInput( ( uint )inputs.Length, inputs, Win32.SIZEOF_INPUT );
        };
    }
}

Merci Lutinore 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de Lutinore
Bubuss 147 Messages postés samedi 7 juin 2003Date d'inscription 8 décembre 2007 Dernière intervention - 17 mars 2007 à 11:52
0
Merci
 Merci beaucoup de ton aide
Commenter la réponse de Bubuss
cudenetf 449 Messages postés mardi 20 septembre 2005Date d'inscription 26 juillet 2012 Dernière intervention - 10 août 2010 à 07:33
0
Merci
Bonjour , c'est la seule info que j'ai trouvé sur le sujet (assez simple) , je l'ai donc testé mais quand je clique sur le bouton je n'ai qu'une lettre qui apparait.
ie: je clique sur a : j'ai "a" ds le textbox, je clique sur "b" , j'ai "b" et non "ab"

aussi j'aimerais pouvoir le faire depuis un autre formulaire qui serait mon clavier... que dois je passer comme argument ? (si je veux travailler sur des datagrids par exemple) merci
Commenter la réponse de cudenetf
cudenetf 449 Messages postés mardi 20 septembre 2005Date d'inscription 26 juillet 2012 Dernière intervention - 10 août 2010 à 12:01
0
Merci
J'ai aussi des formes modales et je n'arrive donc pas a taper sur mon clavier virtuel

alors que j'ai testé avec celui de windows cela fonctionne...
il arrive a completer automatiquement les cases sur lequel ya le focus (sans qu'on ai a lui dire ou ya le focus )
bref il fonctionne réellement comme un clavier
le seul probleme c'est sa taille ...

comment puis obtenir le meme comportement ???
Commenter la réponse de cudenetf
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 13 août 2010 à 12:32
0
Merci
Salut, SendInput simule le clavier, donc ça va écrire là où se trouve le focus mais si tu utilises ton propre clavier virtuel (une forme à toi) au moment ou tu cliques sur ta forme c'est elle qui va prendre le focus ou du moins l'un de ses cntrôles enfants. Il faut donc que ton clavier virtuel soit une application qui ne gère pas le focus, c'est possible il faut se renseigner sur les styles Win32 et sur la fonction SetStyles.
Commenter la réponse de Lutinore
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 13 août 2010 à 12:38
0
Merci
Ma librairie RawInput contient une structure nommée Input et une methode SendInput completement managée :

http://www.csharpfr.com/codes/LIBRAIRIE-RAWINPUT-NET_43573.aspx
Commenter la réponse de Lutinore
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 13 août 2010 à 13:09
0
Merci
Un exemple de début de clavier virtuel, j'utilise le style WS_EX_NOACTIVATE mais ça produit un petit effet de bord, la fenêtre n'est plus très réactive.

[i]namespace MyKeyboard
{
public partial class Form1 : Form
{
public Form1( )
{
InitializeComponent( );

Button a = new Button( );
a.Text = "a";
a.Size = new Size( 32, 32 );
a.Location = new Point( 10, 10 );
a.Parent = this;
a.Click += new EventHandler( Button_Click );

Button b = new Button( );
b.Text = "b";
b.Size = new Size( 32, 32 );
b.Location = new Point( 48, 10 );
b.Parent = this;
b.Click += new EventHandler( Button_Click );
}

private const int WS_EX_NOACTIVATE = 0x08000000;

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= WS_EX_NOACTIVATE;
return cp;
}
}

// RawInput.NET.dll
private void Button_Click( object sender, EventArgs e )
{
char c = ( ( Button )sender ).Text[ 0 ];

Input[ ] inputs = new Input[ 2 ];
inputs[ 0 ].SetInput( c, KeyInput.KeyDown );
inputs[ 1 ].SetInput( c, KeyInput.KeyUp );
Input.SendInput( inputs );
}
}
}/i
Commenter la réponse de Lutinore

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.