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

API, COM et SDKs Delphi Discussion :

Clavier Virtuel et Focus


Sujet :

API, COM et SDKs Delphi

  1. #1
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut Clavier Virtuel et Focus
    Bonjour,

    J'ai créé un clavier virtuel sous Delphi qui fonctionne pas mal, mais j'ai un soucis avec les menus.

    Créez le projet "Project1" avec 3 boutons et appliquez le code suivant:
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Déclarations privées }
      protected
        procedure CreateParams(var Params: TCreateParams); override;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    // laisser le focus à l'application active
    procedure TForm1.CreateParams(var Params: TCreateParams); // override
    begin
      inherited;
      with Params do
      begin
        ExStyle   := ExStyle or WS_EX_NOACTIVATE;
        WndParent := GetDesktopwindow;
      end;
    end;
     
    // Lancer un Alt+F O
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Keybd_Event(VK_LMENU, 0, 0, 0);
      Keybd_Event(Ord('F'), 0, 0, 0);
      Keybd_Event(Ord('F'), 0, 2, 0);
      Keybd_Event(VK_LMENU, 0, 2, 0);
     
      Keybd_Event(Ord('O'), 0, 0, 0);
      Keybd_Event(Ord('O'), 0, 2, 0);
    end;
     
    // Lancer Alt+F
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      Keybd_Event(VK_LMENU, 0, 0, 0);
      Keybd_Event(Ord('F'), 0, 0, 0);
      Keybd_Event(Ord('F'), 0, 2, 0);
      Keybd_Event(VK_LMENU, 0, 2, 0);
    end;
     
    // Lancer O
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      Keybd_Event(Ord('O'), 0, 0, 0);
      Keybd_Event(Ord('O'), 0, 2, 0);
    end;
     
    end.
    ce mini projet propose donc 3 boutons, Button1 lance la séquence de touches "Alt+F O" qui lance Fichier/Ouvrir.

    Button2 lance Alt+F et Button3 O

    et bien avec l'IDE de Delphi XE2, Button1 ou Button2 + 3 donne le même résultat.

    avec l'IDE de Delphi 6, Button3 ferme le menu et affiche un "o" dans le code source.

    Idem pour Notepad++ par exemple, la décomposition en deux clics ferme le menu avant de traiter la touche "o".

    le tout testé avec Delphi 6 et XE2 sur un Win7 64bits (la compilation avec D6 ou XE2 ne change rien au problème).

    Connaissez-vous une parade ?

    PS: le clavier virtuel (compilé, sans les sources) peut être téléchargé ici, il présente exactement le même problème évidemment.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 923
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 923
    Par défaut
    Oui, parce que malgré la surcharge de CreateParams, l'application, elle, a tout de même été activée un court instant.
    Pour éviter cela, il faut ajouter un handler sur WM_MOUSEACTIVATE qui va simplement renvoyer MA_NOACTIVATE

  3. #3
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Oui, parce que malgré la surcharge de CreateParams, l'application, elle, a tout de même été activée un court instant.
    Pour éviter cela, il faut ajouter un handler sur WM_MOUSEACTIVATE qui va simplement renvoyer MA_NOACTIVATE
    j'ai testé, ça ne change rien...en fait WS_EX_NOACTIVATE n'est pas supporté par W95, d'où l'ajout de MA_NOACTIVATE pour être compatible avec lui...mais ce n'est pas mon cas

    d'autant que si mon appli prenait le focus, il n'y aurait pas de raison qu'elle le perde ensuite.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre Expert Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Par défaut
    Peut être est-ce du a la gestion des menus de XE2 qui ne sont pas des menus standard windows. Que se passe-t'il quand, au clavier sur XE2, tu fais Alt-f, et tu clique sur une autre application ? le menu se referme t'il ou reste t'il tout de même affiché ?

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 923
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 923
    Par défaut
    Le problème est bien un problème d'activation. Il n'y a qu'à contrôler les messages que l'application cible reçoit pour s'en convaincre

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Lorsque j'avais de fenêtre qui ne devait pas prendre le focus,
    en plus de WS_EX_NOACTIVATE qui avait un comportement douteux,
    Je redéfinissais le Show qui récupérait la fenêtre active GetForegroundWindow puis en fin de fonction fait un SetForegroundWindow pour la rétablir quand WS_EX_NOACTIVATE ne semblait pas suffir,
    Je crois que c'était dans le cas ou je faisais une TForm ressemblant à un balloon hint avancé (avec bouton) et affiché depuis une appli en notify icon (MainForm masquée)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Alors, je suis bien d'accord que c'est un problème lié au second clic, mais ça n'est pas un problème de focus puisque c'est bien la fenêtre destinatrice qui gère le "o".

    cependant je vais en rester là, car je viens de teste avec OSK.EXE, le clavier virtuel de Microsoft et avec Notepad, Alt+F n'ouvre pas le menu, il se positionne sur "Fichier" uniquement, et si j'ouvre le menu moi même et que je clique sur "o" de OSK, le menu se ferme également

    il faudrait que je teste avec le clavier de Windows 8 mais je n'ai pas d'écran tactile sous W8.

    si quelqu'un a l'occasion de tester...

    Merci
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. [WD12] Clavier Virtuel sans prise de focus
    Par chailanc dans le forum WinDev
    Réponses: 7
    Dernier message: 22/06/2010, 16h57
  2. Clavier virtuel - gestion focus
    Par ramoud dans le forum C#
    Réponses: 3
    Dernier message: 08/10/2008, 09h21
  3. 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
  4. Programmer un clavier virtuel
    Par juvamine dans le forum Windows
    Réponses: 1
    Dernier message: 30/07/2006, 17h47
  5. Clavier virtuel
    Par ouquoi dans le forum MFC
    Réponses: 2
    Dernier message: 22/02/2006, 11h33

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