Sendkeys et gestion de l'état du clavier
-
- Messages : 15
- Enregistré le : ven. avr. 13, 2007 10:59 am
- Localisation : pays de loire
Sendkeys et gestion de l'état du clavier
Bonjour,
sous paradox 10, j'utilise la commande objectpal SENDKEYS, mais la difficulté c'est que je n'arrive pas à gérer l'état du clavier.
Ainsi, lorsque j'envoie "7", selon que l'état du clavier est MAJ activé ou non, j'obtiens un "7" ou un "è",
si vous avez une solution à m'apporter, je cherche depuis longtemps sans trouver et même dans la gestion des évènements, je n'ai rien trouvé qui permettait de m'informer sur l'état du clavier ponctuellement.
Merci
sous paradox 10, j'utilise la commande objectpal SENDKEYS, mais la difficulté c'est que je n'arrive pas à gérer l'état du clavier.
Ainsi, lorsque j'envoie "7", selon que l'état du clavier est MAJ activé ou non, j'obtiens un "7" ou un "è",
si vous avez une solution à m'apporter, je cherche depuis longtemps sans trouver et même dans la gestion des évènements, je n'ai rien trouvé qui permettait de m'informer sur l'état du clavier ponctuellement.
Merci
-
- Site Admin
- Messages : 855
- Enregistré le : sam. sept. 14, 2002 10:41 pm
- Localisation : Igny (Essonne)
Autre info, sous Vista apparemment certaines commandes SendKey ne passent plus mais Jan Maryssael propose une solution via une petite DLL Delphi (voir thread "SendKeys command replacement for >=W2K (vista included) and >=P9" dans le forum pnews.paradox-3rdparty en date du 27/04/2008 :
Il a montré par ailleurs précédemment comment passer par l'API windows directement :Hi all,
Download:
http://users.skynet.be/fa495766/jmsndkys.zip
Created for >= P9
OS: >= w2k
A full lib for opal wasn't possible in the short time I had
So it ships as a dll.
Look at the readme.txt: the command(s) is (are) a look alike as the
one(s) you are familiar with in paradox.
;--------------------------------------
Uses "jmsndkys.dll"
cmSendKeys(strSendKeysString cPtr, intWait cLong)cLong
endUses
;--------------------------------------
Additional comments and testing appreciated
Jan Maryssael
(cf thread "winpostmessage + Paradox + Vista" sur le forum pnews.paradox-development du 24/04/2008)Uses "user32.dll"
keybd_event(bVk cLong, bScan cLong, dwFlags cLong, dwExtraInfo cLong)
endUses
method pushButton(var eventInfo Event)
;// Ici on envoie <Entrée> sans passer par sendkey
keybd_event(VK_RETURN, 0, 0, 0)
endMethod
-
- Messages : 15
- Enregistré le : ven. avr. 13, 2007 10:59 am
- Localisation : pays de loire
bonsoir Come,
toujours présent à rendre service.
J'ai bien essayé avec setShiftKeyDown et plus spécialement avec isShiftKeyDown mais cette fonction n'agit pas sur la touche VERROUILLAGE CAPLOCK et ne donne pas sa situation.
Dans les fonctions SENDKEYS, il y a bien {capslock}, {vk_captial}
mais elles n'informent pas sur la situation du clavier et d'ailleurs en les utilisant, étrangement elles ne fonctionnent pas comme au clavier puisque selon l'état du clavier la frappe devient MAJ ou Minus au lieu de se bloquer sur MAJ
Même en envoyant un Keyevent "VK_CAPITAL" je n'arrive pas à déverrouiller "CAP LOCK"
Il y aurait bien comme tu le suggères une solution en passant directement par l'API windows, mais là je ne maitrise pas.
Il m'apparait tout de même incroyable que dans objectPal il n'y ait rien qui gère le positionnemement de la touche "CAP LOCK" d'ailleurs le problème est identique avec NumLock.
toujours présent à rendre service.

J'ai bien essayé avec setShiftKeyDown et plus spécialement avec isShiftKeyDown mais cette fonction n'agit pas sur la touche VERROUILLAGE CAPLOCK et ne donne pas sa situation.
Dans les fonctions SENDKEYS, il y a bien {capslock}, {vk_captial}
mais elles n'informent pas sur la situation du clavier et d'ailleurs en les utilisant, étrangement elles ne fonctionnent pas comme au clavier puisque selon l'état du clavier la frappe devient MAJ ou Minus au lieu de se bloquer sur MAJ
Même en envoyant un Keyevent "VK_CAPITAL" je n'arrive pas à déverrouiller "CAP LOCK"
Il y aurait bien comme tu le suggères une solution en passant directement par l'API windows, mais là je ne maitrise pas.
Il m'apparait tout de même incroyable que dans objectPal il n'y ait rien qui gère le positionnemement de la touche "CAP LOCK" d'ailleurs le problème est identique avec NumLock.

-
- Site Admin
- Messages : 855
- Enregistré le : sam. sept. 14, 2002 10:41 pm
- Localisation : Igny (Essonne)
Bonsoir
Donc le problème se règle facilement via l'API windows :
Donc le problème se règle facilement via l'API windows :
Uses "user32.dll"
GetKeyState(nVirtKey cLong)clong [stdcall "GetKeyState"]
keybd_event(bVk cLong, bScan cLong, dwFlags cLong, dwExtraInfo cLong)
EndUses
method pushButton(var eventInfo Event)
var
rep anytype
endvar
rep = GetKeyState(VK_CAPITAL)
if smallint(rep) = 0 then
Msginfo("Message :","Pas de Caps Lock\n\nOn enclenche le Caps Lock...")
keybd_event(VK_CAPITAL, 0, 0, 0)
else
Msginfo("Message :","On est déjà en Caps Lock")
endif
endMethod
-
- Messages : 15
- Enregistré le : ven. avr. 13, 2007 10:59 am
- Localisation : pays de loire
bonsoir,
facile hum ...
si j'ai bien compris, pour déverrouiller l'utilisation de keybd_event(VK_SHIFT, 0, 0, 0) serait suffisant dans la mesure ou l'on a paramétré la gestion du clavier en ce sens,
mais si je passe effectivement en minuscule, étrangement le voyant reste allumé sur Cap Lock.
Si je double keybd_event(VK_SHIFT, 0, 0, 0), le voyant s'éteint mais je reviens au majuscule.
Pas simple d'autant que les autres variables (0,0,0) doivent avoir certainement une fonction lorsqu'elle sont changées mais je n'ai pas trouvé lesquelles malgré plusieurs essais.
Bon, je crois que je vais quand même pouvoir gérer mon problème de majuscule sous sendkeys grace à ton aide.
bien que je dispose déjà au niveau de ma fiche d'une déclaration de USES objectpal, comment déclarer en même temps une USES DLL ?

facile hum ...

si j'ai bien compris, pour déverrouiller l'utilisation de keybd_event(VK_SHIFT, 0, 0, 0) serait suffisant dans la mesure ou l'on a paramétré la gestion du clavier en ce sens,
mais si je passe effectivement en minuscule, étrangement le voyant reste allumé sur Cap Lock.
Si je double keybd_event(VK_SHIFT, 0, 0, 0), le voyant s'éteint mais je reviens au majuscule.
Pas simple d'autant que les autres variables (0,0,0) doivent avoir certainement une fonction lorsqu'elle sont changées mais je n'ai pas trouvé lesquelles malgré plusieurs essais.

Bon, je crois que je vais quand même pouvoir gérer mon problème de majuscule sous sendkeys grace à ton aide.
bien que je dispose déjà au niveau de ma fiche d'une déclaration de USES objectpal, comment déclarer en même temps une USES DLL ?
-
- Messages : 15
- Enregistré le : ven. avr. 13, 2007 10:59 am
- Localisation : pays de loire
Bonsoir,
En fait l'instruction GetKeyState dans ma fiche provoque une erreur de violation de partage. de type:
"Vous avez tenté d'accéder à un document non ouvert
Violation de partage général inattendue"
il semble d'ailleurs que ma fiche rencontre cette erreur qui jusqu'à présent ne m'avait jamais génée (elle apparait uniquement en message)et que l'instruction ne fait que la révèler et bloque le processus.
Cela fait donc plus de 6 heures que je travaille sur ma fiche à la décortiquer pour voir où le bât blesse, je reviendrai ultérieurement pour vous dire si c'est OK
Merci encore de votre aide
En fait l'instruction GetKeyState dans ma fiche provoque une erreur de violation de partage. de type:
"Vous avez tenté d'accéder à un document non ouvert
Violation de partage général inattendue"
il semble d'ailleurs que ma fiche rencontre cette erreur qui jusqu'à présent ne m'avait jamais génée (elle apparait uniquement en message)et que l'instruction ne fait que la révèler et bloque le processus.
Cela fait donc plus de 6 heures que je travaille sur ma fiche à la décortiquer pour voir où le bât blesse, je reviendrai ultérieurement pour vous dire si c'est OK
Merci encore de votre aide
-
- Site Admin
- Messages : 855
- Enregistré le : sam. sept. 14, 2002 10:41 pm
- Localisation : Igny (Essonne)
Bonjour
Juste pour clarifier je pense que pour VK_SHIFT tout est fourni en OPAL donc pas besoin d'appel externe à l'API windows. Par contre c'est pour la touche CapsLock (VK_CAPITAL) que cet appel est nécessaire car effectivement en OPAL nous n'avons rien de proposé.
Il me semble en outre que pour contrôler l'état du clavier (Majuscule ou minuscule) il suffit de contrôler CapsLock, la touche de verrouillage majuscule/minuscule (pas besoin de VK_SHIF, passage ponctuel en Majuscule/minuscule). Si l'on souhaite des minuscules par exemple on teste l'état de CapsLock (GetKeySate) , si c'est enclenché on envoie un keybd_event demandant l'appui CapsLock et c'est terminé me semble-t-il.
J'ai donc une fiche de test qui démontre cela et que je peux vous faire passer si vous voulez.
Pour info voici la page msdn qui décrit les valeurs possibles de touche (VK_...) : http://msdn.microsoft.com/en-us/library ... S.85).aspx
Juste pour clarifier je pense que pour VK_SHIFT tout est fourni en OPAL donc pas besoin d'appel externe à l'API windows. Par contre c'est pour la touche CapsLock (VK_CAPITAL) que cet appel est nécessaire car effectivement en OPAL nous n'avons rien de proposé.
Il me semble en outre que pour contrôler l'état du clavier (Majuscule ou minuscule) il suffit de contrôler CapsLock, la touche de verrouillage majuscule/minuscule (pas besoin de VK_SHIF, passage ponctuel en Majuscule/minuscule). Si l'on souhaite des minuscules par exemple on teste l'état de CapsLock (GetKeySate) , si c'est enclenché on envoie un keybd_event demandant l'appui CapsLock et c'est terminé me semble-t-il.
J'ai donc une fiche de test qui démontre cela et que je peux vous faire passer si vous voulez.
Pour info voici la page msdn qui décrit les valeurs possibles de touche (VK_...) : http://msdn.microsoft.com/en-us/library ... S.85).aspx
-
- Messages : 15
- Enregistré le : ven. avr. 13, 2007 10:59 am
- Localisation : pays de loire
Bonjour,
J'ai réussi à retrouver mon erreur dans ma fiche.
CAP_LOCK a un effet alternatif que si XP est configuré en ce sens. Pour ma part, vestige de ma vieille machine à écrire, c'est la touche SHIFT qui déverrouille CAP_LOCK.
La touche SHIFT seule ne semble pas non plus gérée par objectPal.
L'instruction API keybd_event(VK_SHIFT, 0, 0, 0) fonctionne mais elle bloque cette touche en position basse, ce qui fait mon affaire à moitié car par la suite elle provoque des erreurs de frappe.
J'ai vu que pour la faire remonter il fallait lancer une instruction du type :
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0),
mais je déclare certainement mal la 3ième variable représentant "KEYEVENTF_KEYUP".
car je n'arrive toujours pas à mes fins .
Avez vous la solution ?
J'ai réussi à retrouver mon erreur dans ma fiche.

CAP_LOCK a un effet alternatif que si XP est configuré en ce sens. Pour ma part, vestige de ma vieille machine à écrire, c'est la touche SHIFT qui déverrouille CAP_LOCK.
La touche SHIFT seule ne semble pas non plus gérée par objectPal.
L'instruction API keybd_event(VK_SHIFT, 0, 0, 0) fonctionne mais elle bloque cette touche en position basse, ce qui fait mon affaire à moitié car par la suite elle provoque des erreurs de frappe.
J'ai vu que pour la faire remonter il fallait lancer une instruction du type :
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0),
mais je déclare certainement mal la 3ième variable représentant "KEYEVENTF_KEYUP".

Avez vous la solution ?
-
- Site Admin
- Messages : 855
- Enregistré le : sam. sept. 14, 2002 10:41 pm
- Localisation : Igny (Essonne)
Bonsoir
Ce soir je n'ai pas trop de temps mais en plus j'avoue ne pas très bien comprendre le souci (comment atteindre par exemple ce paramètre XP dont vous parlez ?) Vu que mon clavier réagit comme je l'attends avec mon code exemple (mais c'est vrai j'ai testé très, trop ?, vite) je ne sais plus très bien que proposer en fait.
Si vous disposez d'une petite fiche (sans table, la plus simple possible) exposant le souci précis et le résultat que vous espérez, j'essaierai de regarder cela
Ce soir je n'ai pas trop de temps mais en plus j'avoue ne pas très bien comprendre le souci (comment atteindre par exemple ce paramètre XP dont vous parlez ?) Vu que mon clavier réagit comme je l'attends avec mon code exemple (mais c'est vrai j'ai testé très, trop ?, vite) je ne sais plus très bien que proposer en fait.
Si vous disposez d'une petite fiche (sans table, la plus simple possible) exposant le souci précis et le résultat que vous espérez, j'essaierai de regarder cela
-
- Messages : 15
- Enregistré le : ven. avr. 13, 2007 10:59 am
- Localisation : pays de loire
N'ayant pas de site où déposer mes photos, je vous l'adresse par mail, pour en faire profiter tout le monde, je modifierai ultérieurement mon post pour y ajouter le lien.Côme a écrit :(comment atteindre par exemple ce paramètre XP dont vous parlez ?)

Mon problème est presque résolu. Grâce à l'accès aux API windows, je sais reconnaitre lorsque CAP_LOCK est activé et je sais alors passer en minuscule en appuyant sur SHIFT reste que mon instruction est incomplète car la Touche SHIFT reste en position appuyée.

Il ne me reste plus à savoir comment programmer l'instruction API pour faire remonter la touche SHIFT...?

-
- Messages : 15
- Enregistré le : ven. avr. 13, 2007 10:59 am
- Localisation : pays de loire
-
- Site Admin
- Messages : 855
- Enregistré le : sam. sept. 14, 2002 10:41 pm
- Localisation : Igny (Essonne)
Bonsoir
Juste pour comprendre : est-ce que le fait de repasser au paramétrage "normal" du verrouillage majuscule (donc par CapsLock et non Shift) permet de résoudre le souci ?
"L'instruction API keybd_event(VK_SHIFT, 0, 0, 0) fonctionne mais elle bloque cette touche en position basse, ce qui fait mon affaire à moitié car par la suite elle provoque des erreurs de frappe. "
Moi cela me semble logique puisque vous avez demandé spécifiquement ce comportement pour Shift (qui agit donc maintenant comme Capslock) !
Quelle est dans ce cas la touche qui prend le rôle de Shift pour une bascule temporaire à la demande ? Mystère pour ma part à ce stade !
Juste pour comprendre : est-ce que le fait de repasser au paramétrage "normal" du verrouillage majuscule (donc par CapsLock et non Shift) permet de résoudre le souci ?
"L'instruction API keybd_event(VK_SHIFT, 0, 0, 0) fonctionne mais elle bloque cette touche en position basse, ce qui fait mon affaire à moitié car par la suite elle provoque des erreurs de frappe. "
Moi cela me semble logique puisque vous avez demandé spécifiquement ce comportement pour Shift (qui agit donc maintenant comme Capslock) !
Quelle est dans ce cas la touche qui prend le rôle de Shift pour une bascule temporaire à la demande ? Mystère pour ma part à ce stade !