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

Entrée/Sortie Java Discussion :

Changement de l'input standard sur Windows avec message MSDN


Sujet :

Entrée/Sortie Java

  1. #1
    Invité
    Invité(e)
    Par défaut Changement de l'input standard sur Windows avec message MSDN
    Bonjour à tous,

    Je cherche à changer la langue d'entrée (input standard clavier) en Java. Pour cela j'ai besion d'utiliser deux fonctions MSDN pour interagir avec l'OS. La 1ère est "loadkeyboardLayout" qui charge le clavier (dont voici la description http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx) et la 2ème active la langue qu'on vient de charger avec la fonction précédente (sa description est la suivante : http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx).

    Voici le code que j'utilise :
    Code : 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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    protected static final Call LOAD_LAYOUT = new Call( "USER32.DLL", "LoadKeyboardLayoutA","GI:I",12);
    protected static final Call ACTIVATE_LAYOUT = new Call( "USER32.DLL", "ActivateKeyboardLayoutA", "II:I:",8);
    protected static final String INPUT_LOCAL = "00000401"; // langue d'entrée
    protected static final int ACTIVE_PARAM = 0x00000001;
    /**
    * changer la langue d'entrée ( entrée clavier) du système
    */
     
    public void loadInputLanguage() throws COMException, IOException {
     
    	FuncPtr loadLayout = null ;
    	FuncPtr activateLayout = null;
     
    	/**
            * Charger la langue d'entrée
            */
     
    	loadLayout = new FuncPtr( LOAD_LAYOUT.getDllName(), LOAD_LAYOUT.getFunctionName());
    	NakedByteStream bs = new NakedByteStream();
    	LittleEndianOutputStream leo = new LittleEndianOutputStream
     
    	/**
            * If the specified input locale identifier is not already loaded,
            * the function loads and activates the input locale identifier for the current thread
            */
     
    	leo.writeStringUnicode( INPUT_LOCAL);// ( 0x1401) input arabic
    	leo.writeInt(ACTIVE_PARAM);
    	byte[] b = loadLayout.invoke( LOAD_LAYOUT.getParameterDescription(), LOAD_LAYOUT.getStackSize(), bs, null, ReturnFlags.CHECK_FALSE);
    	System.out.println(LOAD_LAYOUT.getStackSize());
    	LittleEndianInputStream leis = new LittleEndianInputStream( new ByteArrayInputStream( b));
    	int hkl = leis.readInt();
     
    	/**
            * Activer la langue d'entrée chargée
            */
     
    	activateLayout = new FuncPtr( ACTIVATE_LAYOUT.getDllName(), ACTIVATE_LAYOUT.getFunctionName());
    	NakedByteStream bsa = new NakedByteStream();
    	LittleEndianOutputStream leoa = new LittleEndianOutputStream(bsa);
     
    	/**
            * Activates the specified locale identifier for the entire process and sends
            * the WM_INPUTLANGCHANGE message to the current thread's focus or active window
            */
     
    	//Input locale identifier to be activated.
    	leoa.writeInt(hkl);
    	leoa.writeInt( 0x00000100);
     
    	// KLF_SETFORPROCESS
    	byte[] ba = activateLayout.invoke( ACTIVATE_LAYOUT.getParameterDescription(), ACTIVATE_LAYOUT.getStackSize(), bsa, null, ReturnFlags.CHECK_FALSE);
    	LittleEndianInputStream leisa = new LittleEndianInputStream( new ByteArrayInputStream( ba));
    	int lastHkl = leisa.readInt();
    	if(lastHkl == 0) {
    		System. err.println( "Failed to activate keyboard layout");
    	}
     
    	loadLayout.close();
    	activateLayout.close();
     
    }
    Cela produit une java layer exception.

    Merci d'avance pour votre aide.

  2. #2
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Bonjour,

    D'où vient la classe Call?
    Bien le bonjour chez vous
    Jowo

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour jowo,

    J'ai effectivement oublié de mentionné la class Call. C'est moi qui l'ai créée et voici le code :

    Code : 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
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package hotVirtualKeyboard;
     
    /**
     *
     * @author msahlali
     */
    public class Call {
        private int stackSize;
        private String functionName;
        private String parameterDescription;
        private String dllName;
     
        public Call(String dllName, String functionName, String parameterDescription, int stackSize) {
            this.stackSize = stackSize;
            this.functionName = functionName;
            this.parameterDescription = parameterDescription;
            this.dllName = dllName;
        }
     
        public int getStackSize() {return stackSize;}
        public String getFunctionName() {return functionName;}
        public String getParameterDescription() {return parameterDescription;}
        public String getDllName() {return dllName;}
     }
    J'ai réussi a me débarrasser de l'exception en modifiant les descriptions des deux fonctions "load" et "activate" comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    protected static final Call LOAD_LAYOUT = new Call( "USER32.DLL", "LoadKeyboardLayoutW","GI:I:",8);
    protected static final Call ACTIVATE_LAYOUT = new Call( "USER32.DLL", "ActivateKeyboardLayout", "II:I:",4);
    Le problème maintenant est que la langue d'entrée n'est pas modifiée. Je pense qu'il faut jouer sur les paramètres mais n'en suis pas certain. Voici une petite description des paramètres de "loadkeyboardlayout" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private final static int KLF_ACTIVE = 0x1; //chargement et activation de la langue d'entrée pour le processus courant
    private final static int KLF_NOTELLSHELL = 0x80; // informer le shell du chngement de l'input
    private final static int KLF_REORDER = 0x8; // fonctionne avec KLF_ACTIVE, charge la input et la mets en tête des inputs
    private final static int KLF_SUBSTITUTE_OK = 0x2; // remplace l'input dans le registre et l'active pour toutes les applications
    Je ne sais pas vraiment lequel utiliser, lequel serait le plus approprié.
    Merci beaucoup pour votre aide.

Discussions similaires

  1. comment installer Prado sur windows avec EasyPHP
    Par mapmip dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 17/04/2011, 11h33
  2. Réponses: 5
    Dernier message: 23/12/2009, 11h31
  3. xemacs sur windows avec xwin
    Par Ksawery dans le forum Windows XP
    Réponses: 0
    Dernier message: 26/08/2009, 17h28
  4. Problème d'affichage sur Windows avec Dev-C++
    Par Cognote dans le forum Débuter
    Réponses: 2
    Dernier message: 29/07/2008, 09h04
  5. Postgresql sur windows avec du php
    Par grellierj dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 19/01/2005, 23h07

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