Sendkeys et gestion de l'état du clavier

forairinfo
Messages : 15
Enregistré le : ven. avr. 13, 2007 10:59 am
Localisation : pays de loire

Sendkeys et gestion de l'état du clavier

Message par forairinfo » mer. juin 04, 2008 4:22 pm

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

Côme
Site Admin
Messages : 855
Enregistré le : sam. sept. 14, 2002 10:41 pm
Localisation : Igny (Essonne)

Message par Côme » jeu. juin 05, 2008 7:25 pm

Bonsoir :wink:

Avez-vous essayé setShiftKeyDown et isShiftKeyDown ?
Cela pourrait correspondre à ce que vous cherchez non ?

Côme
Site Admin
Messages : 855
Enregistré le : sam. sept. 14, 2002 10:41 pm
Localisation : Igny (Essonne)

Message par Côme » jeu. juin 05, 2008 7:48 pm

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 :
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
Il a montré par ailleurs précédemment comment passer par l'API windows directement :
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
(cf thread "winpostmessage + Paradox + Vista" sur le forum pnews.paradox-development du 24/04/2008)

forairinfo
Messages : 15
Enregistré le : ven. avr. 13, 2007 10:59 am
Localisation : pays de loire

Message par forairinfo » jeu. juin 05, 2008 11:25 pm

bonsoir Come,

toujours présent à rendre service. :D

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. :?

Côme
Site Admin
Messages : 855
Enregistré le : sam. sept. 14, 2002 10:41 pm
Localisation : Igny (Essonne)

Message par Côme » ven. juin 06, 2008 1:47 am

Bonsoir

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

forairinfo
Messages : 15
Enregistré le : ven. avr. 13, 2007 10:59 am
Localisation : pays de loire

Message par forairinfo » sam. juin 07, 2008 2:09 am

bonsoir, :D

facile hum ... :lol:

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.
:cry:
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 ?

Côme
Site Admin
Messages : 855
Enregistré le : sam. sept. 14, 2002 10:41 pm
Localisation : Igny (Essonne)

Message par Côme » sam. juin 07, 2008 2:04 pm

Salut :wink:

Donc pour le uses il suffit de faire un autre bloc uses avant ou après le premier normalement.

Pour le reste j'ai donc obtenu un résultat qui me semblait satisfaisant mais je n'ai pas tout testé effectivment :D. J'ai testé en outre sur un portable qui n'a pas de VerrNum par exemple !

forairinfo
Messages : 15
Enregistré le : ven. avr. 13, 2007 10:59 am
Localisation : pays de loire

Message par forairinfo » sam. juin 07, 2008 9:33 pm

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

Côme
Site Admin
Messages : 855
Enregistré le : sam. sept. 14, 2002 10:41 pm
Localisation : Igny (Essonne)

Message par Côme » dim. juin 08, 2008 12:28 pm

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

forairinfo
Messages : 15
Enregistré le : ven. avr. 13, 2007 10:59 am
Localisation : pays de loire

Message par forairinfo » lun. juin 09, 2008 8:35 am

Bonjour,

J'ai réussi à retrouver mon erreur dans ma fiche. :D

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". :roll: car je n'arrive toujours pas à mes fins .

Avez vous la solution ?

Côme
Site Admin
Messages : 855
Enregistré le : sam. sept. 14, 2002 10:41 pm
Localisation : Igny (Essonne)

Message par Côme » lun. juin 09, 2008 10:02 pm

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

forairinfo
Messages : 15
Enregistré le : ven. avr. 13, 2007 10:59 am
Localisation : pays de loire

Message par forairinfo » mar. juin 10, 2008 1:58 am

Côme a écrit :(comment atteindre par exemple ce paramètre XP dont vous parlez ?)
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. :!:

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. :D

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

Côme
Site Admin
Messages : 855
Enregistré le : sam. sept. 14, 2002 10:41 pm
Localisation : Igny (Essonne)

Message par Côme » mar. juin 10, 2008 8:42 am

Bonjour

Image

Merci, je ne connaissais pas !

Bon dès que j'ai 2 minutes je regarderai plus avant le souci avec SHIFT qui reste enfonçé

forairinfo
Messages : 15
Enregistré le : ven. avr. 13, 2007 10:59 am
Localisation : pays de loire

Message par forairinfo » lun. févr. 01, 2010 1:06 pm

Bonjour :D

juste pour dire que je n'ai toujours pas trouvé de solution pour déverouiller la touche majuscule.

Si quelqu'un a trouvé la solution :? :idea:

Merci

Côme
Site Admin
Messages : 855
Enregistré le : sam. sept. 14, 2002 10:41 pm
Localisation : Igny (Essonne)

Message par Côme » mer. févr. 03, 2010 1:14 am

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 !

Répondre