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# Discussion :

Affichage/mise en page Clavier Virtuel


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 97
    Par défaut Affichage/mise en page Clavier Virtuel
    Bonjour, j'ai une application utilisant un écran tactile je souhaite afficher le clavier virtuel natif du système d'exploitation installer (windows 7 32 bits ou 64 bits).

    J'utilise la fonction Process pour afficher le clavier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    osk = new Process();
    osk.StartInfo.UseShellExecute = true;
    osk.StartInfo.FileName = file;
    osk.StartInfo.WorkingDirectory = dir;
    osk.Start();
    avec file= "osk.exe"; et dir = "C:/WINDOWS/system32/osk.exe";

    Mon problème est lors d lancement du clavier, il me met :
    Impossible de lancer le clavier visuel
    Cela vient t'il de ma version de Win7 ( 64 bits ) ?
    Comment faire pour contrer ceci ?

    p.s: Je n'est pas envie de copier des osk.exe dans mon application pour
    les lancer selon la version de l'OS, sa je sait le faire.

    Ma deuxième question est la suivante :

    Je souhaiterais savoir quelle est la meilleure solution pour changer la taille du clavier virtuel une fois afficher ?

    J'utilise sa pour l'instant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Process[] p = Process.GetProcessesByName("osk");
    ...
    SetWindowPos(...);                              
    MoveWindow(pr.MainWindowHandle, ...);
    Merci

    Kevdeta

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tu te compliques la vie, il n'y a pas besoin de préciser le répertoire. Le répertoire C:\Windows\system32 est dans le PATH, donc tu peux juste faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process osk = Process.Start("osk.exe");
    Pour récupérer la fenêtre, tu attends d'abord que l'application ait démarré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    osk.WaitForInputIdle();
    Et tu récupères la propriété MainWindowHandle comme tu fais actuellement (mais pas besoin de passer par GetProcessesByName, puisque tu as déjà le process dans ta variable osk).

    Pour ce qui est du déplacement/redimensionnement, je ne pense pas qu'il y ait de meilleure solution que MoveWindow...

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 97
    Par défaut
    Bon j'ai fait comme ta version simplifié mais sa ne change rien, j'ai une fenêtre
    Impossible de lancer le clavier visuel
    qui s'affiche.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    bizarre... et si tu le lances manuellement, ça fonctionne ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 97
    Par défaut
    Oui cela fonctionne si je le lance manuellement...

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    OK, apparemment tu n'es pas le premier à rencontrer ce problème...

    Ici il suggère de copier osk.exe dans le dossier de l'application, mais apparemment tu ne veux pas faire ça...

    il dit de mettre UseShellExecute à false, mais apparemment il faut avoir l'élévation de privilèges UAC. Il y a aussi une autre solution sur la même page où il joue avec les threads, je sais pas trop ce que ça donne.

    Encore une autre idée ici, en créant un process séparé (cf. dernière réponse de Rafael_RF)

    Bref, ça a pas l'air simple... bon courage

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 97
    Par défaut
    Ok je vais chercher avec tes liens, le 2ème me semble intéressant,
    et oui la première solution (copier les osk dans l'application) est maleureusement ce que j'utilise pour l'instant mais je ne trouve pas sa très interressant et je voudrais utiliser l'osk natif de l'os présent.

    J'ai essayer le
    UseShellExecute = false
    mais sa ne change pas grand chose non plus.


    Bref oui sa à l'air complex mais bon, vera bien .



    Merci de m'avoir tout de même aider.

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 97
    Par défaut
    Bon sa fonctionne enfin !

    C'est comme si vous m'aviez donner tout sur un plateau .

    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
     
     [DllImport("kernel32.dll", SetLastError = true)]
            private static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);
            [DllImport("kernel32.dll", SetLastError = true)]
            public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);
            private const UInt32 WM_SYSCOMMAND = 0x112;
            private const UInt32 SC_RESTORE = 0xf120;
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
            private string OnScreenKeyboadApplication = "osk.exe";
     
     
    ma fonction ()
    {
     string processName = System.IO.Path.GetFileNameWithoutExtension(obj.OnScreenKeyboadApplication);              // Check whether the application is not running              
                    var query = from process in Process.GetProcesses()
                                where process.ProcessName == processName
                                select process;
                    var keyboardProcess = query.FirstOrDefault();
                    // launch it if it doesn't exist             
                    if (keyboardProcess == null)
                    {
                        IntPtr ptr = new IntPtr(); ; bool sucessfullyDisabledWow64Redirect = false;                  // Disable x64 directory virtualization if we're on x64,                 // otherwise keyboard launch will fail.                 
                        if (System.Environment.Is64BitOperatingSystem)
                        {
                            sucessfullyDisabledWow64Redirect = Wow64DisableWow64FsRedirection(ref ptr);
                        }
                        // osk.exe is in windows/system folder. So we can directky call it without path                 
                        using (Process osk = new Process())
                        {
                            osk.StartInfo.FileName = obj.OnScreenKeyboadApplication;
                            osk.Start();
                            osk.WaitForInputIdle(2000);
     
                        }
     
                        // Re-enable directory virtualisation if it was disabled.                 
                        if (System.Environment.Is64BitOperatingSystem)
                            if (sucessfullyDisabledWow64Redirect)
                                Wow64RevertWow64FsRedirection(ptr);
                    }
     
    }
    Ce code fonctionne parfaitement, j'espère que sa reservira pour d'autres.

    Bref j'ai aussi ajouter ensuite mes fonctions MoveWindows et autres et sa fonctionne aussi, alors avant de mettre ce post en [RESOLU], j'ai une dernière question !

    J'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (bVisible)
                            ShowWindowAsync(keyboardProcess.MainWindowHandle, SW_SHOW);
                        else
                            ShowWindowAsync(keyboardProcess.MainWindowHandle, SW_HIDE);
    Le code veut bien me HIDE mon clavier mais ne veut pas le Re-afficher de nouveau lorsque que bVisible = true.
    J'ai essayer de récuperer le Handle de la fénêtre avec keyboardProcess.MainWindowHandle qui devrai fonctionner( mais non) et ensuite avec GetProcessByName() et la pareil le Hide marche parfaitement mais le SHOW lui non.

    Si vous passez par la et que vous avez une idée, faite tournée

    Kevdeta

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 4
    Par défaut
    Salut, je serais intéressé par le code, car je dois

    - afficher le clavier virtuel (osk)
    - le placé a un certain endroit sur ma fenêtre
    - le customisé si je peux

    et j'avoue qu’étant un débutant en c# je galère pas mal.
    (ps je ferait tous mes appel via des fichier .bat, pas besoin de vue)

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/05/2009, 12h23
  2. affichage sur une mise en page 3 colonnes
    Par lou64 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 13/10/2008, 22h37
  3. Réponses: 6
    Dernier message: 29/08/2008, 18h43
  4. Clavier virtuel et focus sur page HTML
    Par salma92 dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 08/08/2008, 17h41
  5. Inserer clavier virtuel sur une page web
    Par solidxiii dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 05/02/2008, 10h28

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