Capslock

Signaler
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
-
bonjour,
je voudrais pouvoir activer automatiquement les majuscule ssur certains formulaires
j'ai essayé
            if (!Control.IsKeyLocked(Keys.CapsLock))
            {
                SendKeys.Send("{capslock}");
            }
mais quand je tape ds les champs text , celui ci est toujours en minuscules

Quelqu'un pourrait-il m'expliquer pourquoi?
[comme test g egalement ajouté        
    if (e.KeyCode == Keys.CapsLock)
            {
                if (!Control.IsKeyLocked(Keys.CapsLock))
                {
                    MessageBox.Show("Vous avez désactivé les majuscules!!\nVous en avez besoin pour le lecteur de code barre.");
                }
                else
                {
                    MessageBox.Show("Majuscules activées");
                }
            }

dans un événement keydown
et j'obtiens le message majuscules acitvées (mais elles ne le sont pas en vrai)

14 réponses

Messages postés
86
Date d'inscription
jeudi 23 octobre 2003
Statut
Membre
Dernière intervention
21 juin 2007
2
Autre manière, sur l'événement TextChanged, tu peux mettre :


control.Text = control.Text.ToUpper();

où "control" est le nom de ton textbox...

C'est beaucoup mieux que de simuler l'appui d'une touche...
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
si tes controles sont des textbox, tu as tout simplement la propriété CharacterCasing que tu peux passer sur "upper". sinon, tu peux tout simplement ne pas tenir compte de la casse utilisée par l'utilisateur.

string MaString = lecontroledesaisi.lastring;
MaString.ToUpper();
pas besoin de lui forcer l'activation de la touche majuscule (ce qui est dailleurs tres tres chiant quand une appli fait ca, dailleurs)
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
ok merci,
mais ds le cas d'appuie sur les touches numeriques en haut du clavier (ou d'un ordi portable) si j'appuie sur la touche je ne crois pas que cela change le & en 1 (par exemple).
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
aussi merci a lutinore qui me renvoiue sur une question que j'avais deja poser precedemment; lol
par contre le probleme avec celle-ci est que meme lorsque je lancais mon appli sans lancer ce formulaire ou je voulais forcer le capslock(avec  
[ DllImport( "user32.dll", SetLastError = true ) ]
    private static extern uint SendInput( uint num, [ In ] KEYBDINPUT[ ] inputs, int size );),
cleui-ci se declenchait (par exemple je lancais un autre formulaire ocntenu ds le meme projet) et quand je revenais sous visual studio et ben ct en majuscule et ca a fini par me fatigué (lol).
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
mais je comprends toujours pas pourquoi le sendkeys.send("{capslock}") ne fonctionne pas. ??
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
"merci a lutinore qui me renvoiue sur une question que j'avais deja poser precedemment; lol"


Oups.. j'avais pas vu.

"quand je revenais sous visual studio et ben ct en majuscule et ca a fini par me fatigué (lol)."

Normal, désactive le capslock en quittant l'application, dans la méthode OnFormClosed ou Dispose. Mais c'est sûr qu'activer le capslock à l'insu de l'utilisateur c'est enervant.
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
non ce que je voulais dire c  que meme si je ne lancais pas le formulaire ou l'instruction acitver capslock se trouvait
celoui-ci s'activait , g fait un test en mettant un messagebox ds le ocnstructeur pour voir si il etait lancé mais aucun message n'apparaissait et de retour sous l'editeur kje me retrouvais en majuscule,
sinon comment qu'on l'enleve le capslock :(  pour le mettre on entre  byte VK_CAPITAL = 0x14;
quel est le chiffre pour le supprimer (et ne supprimer que lui bien sur)?
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Dans le code que je t'ai donné l'autre fois, la méthode SendInput est dans une méthode anonyme sur l'évènement Click du bouton, donc CapsLock est activé seulement sur le click du bouton.

Il n'y a pas de chiffre pour le supprimer, 0x14 c'est la touche CapsLock elle même. Par contre on simule l'appui sur cette touche. Si il est sur ON il passe sur OFF et inversement..

private const int INPUT_KEYBOARD = 1;
private const int VK_CAPITAL = 0x14;
private const int KEYEVENTF_KEYUP = 0x0002;


[ StructLayout( LayoutKind.Sequential ) ]
private 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;
}


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


[ DllImport( "user32.dll" ) ]
private static extern short GetKeyState( int vk );


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


public bool CapsLock // true ON, false OFF.
{
    get { return ( GetKeyState( VK_CAPITAL ) & 0x0001 ) == 1; }
}


private void ToggleCapsLock( )
{
    KEYBDINPUT[ ] inputs = new KEYBDINPUT[ 2 ];
    inputs[ 0 ].type = INPUT_KEYBOARD;
    inputs[ 0 ].vk = VK_CAPITAL;
    inputs[ 0 ].flags = 0; // KeyDown
    inputs[ 0 ].extraInfo = ( UIntPtr )( int )GetMessageExtraInfo( );
    inputs[ 1 ].type = INPUT_KEYBOARD;
    inputs[ 1 ].vk = VK_CAPITAL;
    inputs[ 1 ].flags = KEYEVENTF_KEYUP;
    inputs[ 1 ].extraInfo = ( UIntPtr )( int )GetMessageExtraInfo( );


    SendInput( ( uint )inputs.Length, inputs, Marshal.SizeOf( typeof( KEYBDINPUT ) ) );
    Application.DoEvents( ); // Thread reads key messages from its message queue.
}
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Je crois que je vais mettre ça sur Codyx. : )
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
ok merci bien pour tes explications !


c quoi codyx sinon (je pourrais peut etre y trouver des choses interessantes )?
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
c'est un site lié à CodeS-SourceS (même login et mot de passe).
www.codyx.org

<hr size="2" />VC# forever
Messages postés
12
Date d'inscription
jeudi 4 août 2005
Statut
Membre
Dernière intervention
5 février 2008

Voici pour vous messieurs

    http://files.codes-sources.com/fichier.aspx?id=42045&f=TradTouch%5CSend.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

 public partial class Form1 : Form
 { 
        public Form1()
        {
            InitializeComponent();
            SendPerso.Touche(Keys.CapsLock);
        }
}

class SendPerso
    {
        #region Win32 et Structure
            [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();
            }
        #endregion

        /// <summary>
        /// Méthode d'appel à l'api win32
        /// </summary>
        ///

         public static void Touche(Keys touche)
         {
             KEYBDINPUT[] inputs = new KEYBDINPUT[2];
             inputs[0].type = Win32.INPUT_KEYBOARD;
             inputs[0].vk = (ushort)touche;
             inputs[0].flags = 0; // KEYEVENTF_KEYDOWN
             inputs[0].extraInfo = (UIntPtr)(int)Win32.GetMessageExtraInfo();
             inputs[1].type = Win32.INPUT_KEYBOARD;
             inputs[1].vk = (ushort)touche;
             inputs[1].flags = Win32.KEYEVENTF_KEYUP;
             inputs[1].extraInfo = (UIntPtr)(int)Win32.GetMessageExtraInfo();

             Win32.SendInput((uint)inputs.Length, inputs, Win32.SIZEOF_INPUT);
         }
    }
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
lol.. merci toshi_hk de remonter ce message presque 1 an plus tard, mais la réponse était déja donnée sur la première page et d'ailleurs le code que tu viens de donner s'en inspire.