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.