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

Delphi Discussion :

touche virtuelle les " : "


Sujet :

Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 108
    Par défaut touche virtuelle les " : "
    bonjour
    c'est une petite question

    je voudrais savoir comment faire la touche virtuel " : "
    car ca ca ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    keybd_event(ord(':'),0,1,0); //touche enfoncé
    keybd_event(ord(':'),0,2,0); //touche relevé
    donc pour faire un a il faut mettre ord('A') en majuscule
    si on met ord('a') en minuscule sa fait une autre lettre ici un 1
    bref j'ai tester toute les touche minuscul du clavier je n'ai pas trouvé

    merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,
    Le caractère ':' a pour valeur 191 (ne me demande pas pourquoi, c'est purement empirique ... ) donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      keybd_event(191,0,0,0); //touche enfoncé
      keybd_event(191,0,KEYEVENTF_KEYUP,0);
    doit simuler le ':'
    eb.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 108
    Par défaut
    merci beaucoup
    cela fonctionne

    aurait tu une liste de tout ces caratères spéciaux ??

  4. #4
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Citation Envoyé par care
    merci beaucoup
    cela fonctionne

    aurait tu une liste de tout ces caratères spéciaux ??
    c'est dans l'aide microsoft à laquelle tu accède dans ton IDE par Aide-->SDK Windows à la rubrique "Virtual Key Code"

    Les codes touches sont définies sous formes de constantes commençant par les lettres VK (pour Virtual Key) , les voici :
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    Symbolic constant name	Value (hexadecimal)	Mouse or keyboard equivalent
    VK_LBUTTON	01	Left mouse button 
    VK_RBUTTON	02	Right mouse button 
    VK_CANCEL	03	Control-break processing 
    VK_MBUTTON	04	Middle mouse button (three-button mouse) 
    _________       05-07	Undefined 
    VK_BACK	08	BACKSPACE key 
    VK_TAB	09	TAB key 
    _________	0A-0B	Undefined 
    VK_CLEAR	0C	CLEAR key 
    VK_RETURN	0D	ENTER key 
    ________ 	0E-0F	Undefined 
    VK_SHIFT	10	SHIFT key 
    VK_CONTROL	11	CTRL key 
    VK_MENU	12	ALT key 
    VK_PAUSE	13	PAUSE key 
    VK_CAPITAL	14	CAPS LOCK key 
    _______ 	15-19	Reserved for Kanji systems 
    _______ 	1A	Undefined 
    VK_ESCAPE	1B	ESC key 
    ________	1C-1F	Reserved for Kanji systems 
    VK_SPACE	20	SPACEBAR 
    VK_PRIOR	21	PAGE UP key 
    VK_NEXT 	22	PAGE DOWN key 
    VK_END  	23	END key 
    VK_HOME 	24	HOME key 
    VK_LEFT 	25	LEFT ARROW key 
    VK_UP 	 	26	UP ARROW key 
    VK_RIGHT	27	RIGHT ARROW key 
    VK_DOWN 	28	DOWN ARROW key 
    VK_SELECT	29	SELECT key 
     _____ 	 	2A	Original equipment manufacturer (OEM) specific 
    VK_EXECUTE	2B	EXECUTE key 
    VK_SNAPSHOT	2C	PRINT SCREEN key for Windows 3.0 and later 
    VK_INSERT	2D	INS key 
    VK_DELETE	2E	DEL key 
    VK_HELP	2F	HELP key 
    VK_0	30	0 key 
    VK_1	31	1 key 
    VK_2	32	2 key 
    VK_3	33	3 key 
    VK_4	34	4 key 
    VK_5	35	5 key 
    VK_6	36	6 key 
    VK_7	37	7 key 
    VK_8	38	8 key 
    VK_9	39	9 key 
    _____	3A-40	Undefined 
    VK_A	41	A key 
    VK_B	42	B key 
    VK_C	43	C key 
    VK_D	44	D key 
    VK_E	45	E key 
    VK_F	46	F key 
    VK_G	47	G key 
    VK_H	48	H key 
    VK_I	49	I key 
    VK_J	4A	J key 
    VK_K	4B	K key 
    VK_L	4C	L key 
    VK_M	4D	M key 
    VK_N	4E	N key 
    VK_O	4F	O key 
    VK_P	50	P key 
    VK_Q	51	Q key 
    VK_R	52	R key 
    VK_S	53	S key 
    VK_T	54	T key 
    VK_U	55	U key 
    VK_V	56	V key 
    VK_W	57	W key 
    VK_X	58	X key 
    VK_Y	59	Y key 
    VK_Z	5A	Z key 
    VK_LWIN	5B	Left Windows key (Microsoft Natural Keyboard) 
    VK_RWIN	5C	Right Windows key (Microsoft Natural Keyboard) 
    VK_APPS	5D	Applications key (Microsoft Natural Keyboard) 
    _____ 	5E-5F	Undefined 
    VK_NUMPAD0	60	Numeric keypad 0 key 
    VK_NUMPAD1	61	Numeric keypad 1 key 
    VK_NUMPAD2	62	Numeric keypad 2 key 
    VK_NUMPAD3	63	Numeric keypad 3 key 
    VK_NUMPAD4	64	Numeric keypad 4 key 
    VK_NUMPAD5	65	Numeric keypad 5 key 
    VK_NUMPAD6	66	Numeric keypad 6 key 
    VK_NUMPAD7	67	Numeric keypad 7 key 
    VK_NUMPAD8	68	Numeric keypad 8 key 
    VK_NUMPAD9	69	Numeric keypad 9 key 
    VK_MULTIPLY	6A	Multiply key 
    VK_ADD	6B	Add key 
    VK_SEPARATOR	6C	Separator key 
    VK_SUBTRACT	6D	Subtract key 
    VK_DECIMAL	6E	Decimal key 
    VK_DIVIDE	6F	Divide key 
    VK_F1	70	F1 key 
    VK_F2	71	F2 key 
    VK_F3	72	F3 key 
    VK_F4	73	F4 key 
    VK_F5	74	F5 key 
    VK_F6	75	F6 key 
    VK_F7	76	F7 key 
    VK_F8	77	F8 key 
    VK_F9	78	F9 key 
    VK_F10	79	F10 key 
    VK_F11	7A	F11 key 
    VK_F12	7B	F12 key 
    VK_F13	7C	F13 key 
    VK_F14	7D	F14 key 
    VK_F15	7E	F15 key 
    VK_F16	7F	F16 key 
    VK_F17	80H	F17 key 
    VK_F18	81H	F18 key 
    VK_F19	82H	F19 key 
    VK_F20	83H	F20 key 
    VK_F21	84H	F21 key 
    VK_F22	85H	F22 key 
    VK_F23	86H	F23 key 
    VK_F24	87H	F24 key 
    _____ 	88-8F	Unassigned 
    VK_NUMLOCK	90	NUM LOCK key 
    VK_SCROLL	91	SCROLL LOCK key 
    _____ 	92-B9	Unassigned 
    _____ 	BA-C0	OEM specific 
    _____ 	C1-DA	Unassigned 
    _____ 	DB-E4	OEM specific 
    _____ 	E5	Unassigned 
    _____ 	E6	OEM specific 
    _____ 	E7-E8	Unassigned 
    _____ 	E9-F5	OEM specific 
    VK_ATTN	F6	Attn key
    VK_CRSEL	F7	CrSel key
    VK_EXSEL	F8	ExSel key
    VK_EREOF	F9	Erase EOF key
    VK_PLAY	FA	Play key
    VK_ZOOM	FB	Zoom key
    VK_NONAME	FC	Reserved for future use. 
    VK_PA1	FD	PA1 key
    VK_OEM_CLEAR	FE	Clear key
    j'ai formatté ça comme un pied, mais tu vas t'y retrouver, hein ?

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Effectivement Waskol a raison, utiliser les constantes des touches virtuelles au maximum est plus parlant. Maintenant toutes les touches ne sont pas définies sous forme de constante (le ':' par exemple)
    Si tu veux connaître le code d'une touche en particulier, tu peux le retrouver de façon empirique de cette façon :
    2 champs Edit sur une forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      Edit2.Text := IntToStr(Key);
    end;
    Pour simuler une touche accessible avec la touche Shift (la touche '%' par exemple tu peux faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      keybd_event(VK_SHIFT,0,0,0); //touche Shift enfoncée
      keybd_event(192,0,0,0); //touche enfoncée
      keybd_event(192,0,KEYEVENTF_KEYUP,0);// Touche relachée
      keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);//Touche Shift relachée
    Je ne sais pas exactement ce que tu veux faire mais je te donne une autre méthode pour envoyer une chaine de caractère quelconque à un handle de fenêtre de ton application ou d'une application distante, ça fonctionne de la même façon :
    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
    procedure Tform1.SendString(aHandle : THandle; S : String);
    var
      ScanCode: Word;
      lParam: longint;
      i : integer;
    begin
      for i := 1 to Length(S) do
      begin
        ScanCode:= OemKeyScan(ord(S[i])) ;
        lParam:= longint(ScanCode) shl 16 or 1;
        PostMessage(aHandle, WM_CHAR, Ord(S[i]), lParam);
      end;
    end;
     
    // Envoyer une chaine dans TEdit1
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      SendString(Edit1.Handle, 'Ma chaine quelconque : '' *%ïç');
    end;
    Je pense qu'avec ça, tu as tout ...
    Bon courage.
    Eb.

  6. #6
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Voici un extrait de l'unité UnitSystem.pas qui se trouve dans les sources de mon programme démineur (défi Delphi n°1) :
    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
    procedure SimulateKeyDown(Key : byte);
    begin
      keybd_event(Key, 0, 0, 0);
    end;
     
    procedure SimulateKeyUp(Key : byte);
    begin
      keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
    end;
     
    procedure SimulateKeystroke(Key : byte; extra : DWORD);
    begin
      keybd_event(Key, extra, 0, 0);
      keybd_event(Key, extra, KEYEVENTF_KEYUP, 0);
    end;
     
    procedure SendKeys(s : string);
    var i : integer;
        flag : bool;
        w : word;
    begin
      flag := not GetKeyState(VK_CAPITAL)=1;
      if flag then SimulateKeystroke(VK_CAPITAL, 0);
      for i :=1 to Length(s) do
      begin w := VkKeyScan(s[i]);
      if ((HiByte(w) <> $FF) and (LoByte(w) <> $FF))
      then begin
          if HiByte(w)=1
          then SimulateKeyDown(VK_SHIFT);
          SimulateKeystroke(LoByte(w), 0);
          if HiByte(w)=1
          then SimulateKeyUp(VK_SHIFT);
        end;
      end;
      if flag then SimulateKeystroke(VK_CAPITAL, 0);
    end;
    La fonction SendKeys te permet de simuler l'utilisation d'une touche alphanumérique, même si tu ne connais pas son code touche (le programme utilise la fonction API VkKeyScan )

    Exemple :
    Ou pour écrire dans un mémo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SendKeys('Salut tout le monde !');
    Bon, ce qu'il faut savoir, c'est que pour simuler l'envoi d'une touche et que celà fasse quelque chose, il faut impérativement que la fenêtre, et en particulier le contrôle qui doit réagir à cette simulation de touche aie le FOCUS , sinon, ça ne marche pas et c'est bien normal .

    Pourquoi ? Hé bien imaginez tout simplement que votre programme, ce soit vous : pour écrire dans le mémo, vous allez mettre votre fiche en avant plan (si elle n'était pas active, puis vous allez cliquer dans le mémo, avant d'y écrire votre texte), votre programme doit avoir en définitive le même comportement qu'un utilisateur Lambda.

    Du coup, il y a trois ou quatre scénarii :
    - votre programme simule l'appui d'une touche sur sa propre fiche, et le caractère tapé est destiné à la fiche lui même :
    - votre programme simule l'appui d'une touche sur sa propre fiche, et le caractère tapé est destiné au mémo que vous y avez placé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.SetFocusedControl(MeMo1);
    - Votre programme s'adresse à la fiche ou contrôle d'une autre application, dans ce cas il faut donner le focus à ce contrôle fenétré (pour ce faire, il faut connaître son Handle) :
    --> d'abord on active la fiche de l'autre programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure ActiverFenetre(AHandle:HWND);
    var ARect:TRect;
    begin
      //si la fenètre est cachée, on la montre
      if not IsWindowVisible(AHandle)
      then ShowWindow(AHandle,SW_SHOW);
     
      //on récupère le "rectangle" de la fenètre, en coordonnées écran
      GetWindowRect(AHandle,ARect);
      //on clique sur la barre de titre
      MouseClickOnScreen(BoutonGauche,Point(ARect.Left+50,ARect.Top+5));
      //la fenètre est activée, même si on est pas propriétaire du thread
      //(échec de l'API Windows SetActiveWindow et SetFocus dans ce cas)
    end;
    --> puis on fait cliquer notre programme sur le contrôle qui est censé recevoir les évènement claviers (si ce n'est pas lui qui les reçoit par défaut), ou bien on simule plusieurs tabulations dans un nombre repéré par vos soins sur la fiche active (ce qui déplace le rectangle de focus de contrôle en contrôle), suivi en général de la touche entrée/alt/etc pour activer le contrôle (Alt pour un menu par exemple)

    --> pour un clic de souris "virtuel" (qui ne déplace pas votre curseur de souris, l'unité dont je vous ai parlé contient ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure ActiverFenetre(AHandle:HWND);
    var ARect:TRect;
    begin
      //si la fenètre est cachée, on la montre
      if not IsWindowVisible(AHandle)
      then ShowWindow(AHandle,SW_SHOW);
     
      //on récupère le "rectangle" de la fenètre, en coordonnées écran
      GetWindowRect(AHandle,ARect);
      //on clique sur la barre de titre
      MouseClickOnScreen(BoutonGauche,Point(ARect.Left+50,ARect.Top+5));
      //la fenètre est activée, même si on est pas propriétaire du thread
      //(échec de l'API Windows SetActiveWindow et SetFocus dans ce cas)
    end;
    Pour connaître le Handle d'un contrôle d'un autre programme, il faut connaître le nom de la fiche qui le contient, récupérer son Handle, énumérer tous les contrôles qui s'y trouvent, etc...

    Vous pouvez toujours vous amuser à décortiquer la façon dont mon programme automate-démineur joue (il lance l'appli, cliques sur les cases pour de vrai, rentre son nom "au clavier" si il obtient un bon score, etc...)

    L'avantage du SendString(aHandle : THandle; S : String); de ebastien, c'est que tu n'as pas besoin de placer le focus sur ton contrôle fenétré pour qu'il reçoive le code touche (vive l'API PostMessage), par contre, celà nécessite de connaître son Handle.

    Hors le Handle d'un Contrôle qui ne sera jamais le même d'une exécution à l'autre : aujourd'hui son handle sera égal à 23665, demain il sera égal 45632. Et trouver le Handle d'un contrôle qui se trouve dans la fiche d'un autre programme n'est pas une mince affaire

    Maintenant avec l'Arsenal dont tu disposes, tu devrais surement t'en sortir

    Bon dev

  7. #7
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bien vu Waskol ! Je pense qu'avec tout ça, il y a de quoi faire ...
    Waskol a écrit :
    Bon, ce qu'il faut savoir, c'est que pour simuler l'envoi d'une touche et que celà fasse quelque chose, il faut impérativement que la fenêtre, et en particulier le contrôle qui doit réagir à cette simulation de touche aie le FOCUS , sinon, ça ne marche pas et c'est bien normal .
    C'est vrai qu'avec Keybd_event on peut vraiment tout faire (ouvrir les menus avec ALT+Touche etc.) mais effectivement, il faut impérativement que le control fenêtré ait le focus. Si il s'agit juste d'envoyer une chaine de caractère à un control Edit dont on connait le handle, on n'a pas besoin de lui donner le focus avec l'envoi d'un message WM_CHAR. C'est plus limité fonctionnellement c'est vrai, mais ça évite le soucis du focus.
    eb.

Discussions similaires

  1. [XML]/[DocBook] Les entités &quot; &lt; etc.
    Par ykerb2 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 08/05/2007, 20h25
  2. Sudo problème avec les simples quotes
    Par Tronche dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 23/03/2007, 12h02
  3. Les doubles quotes dans les fprintf
    Par Changedman dans le forum C
    Réponses: 30
    Dernier message: 22/02/2007, 12h07

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