Num Pad Virtuel : SendInput ??

Résolu
Bubuss Messages postés 147 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 8 décembre 2007 - 16 mars 2007 à 16:22
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 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

7 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
17 mars 2007 à 05:29
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 );
        };
    }
}
3
Bubuss Messages postés 147 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 8 décembre 2007
17 mars 2007 à 11:52
 Merci beaucoup de ton aide
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
10 août 2010 à 07:33
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
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
10 août 2010 à 12:01
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 ???
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
13 août 2010 à 12:32
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.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
13 août 2010 à 12:38
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
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
13 août 2010 à 13:09
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
0
Rejoignez-nous