8
votes

Crochets de clavier de bas niveau / SendInput avec Winkey + L Possible? (Le lock-out du poste de travail est intercepté à Vista et plus élevé)

Je travaille sur un projet appelé UAWKS (support clavier sans fil Apple non officiel) qui aide Les utilisateurs Windows utilisent le clavier Bluetooth d'Apple. L'un des principaux objectifs d'UAWKS consiste à échanger la clé cmd (qui se comporte comme winkey sous Windows) avec Ctrl , permettant aux utilisateurs de faire < KBD> cmd + c pour copier, cmd + t pour un nouvel onglet, etc.

Il est actuellement développé en utilisant Autohotkey , qui fonctionnait plutôt bien sous Windows XP. Cependant, sur Vista et Windows 7, cmd + l Problèmes:

  • Peu importe les crochets de clavier de bas niveau, gagnant + l est toujours intercepté par Windows et verrouille normalement le poste de travail ...
  • Vous pouvez désactiver le verrouillage du poste de travail avec Ce registre pirater , mais appuyer sur gagnant + l ne peut toujours pas être rebondé dans AHK
  • Appuyez sur gagnant + l laisse WINKKE dans l'état de clé jusqu'à la prochaine (supplémentaire) Winkey up. Simulation d'un événement de porte-clés ne semble pas fonctionner non plus!

    Il semble que gagnant + l est un accord spécial qui fait dégage tout ce qui est.

    J'ai parcouru le code source AHK, et ils essaient de résoudre ce problème dans SendKey () dans Keyboard_Mouse.cpp (près de la ligne 883 dans V1.0.48.05), mais ça ne 't fonctionne. J'ai écrit ma propre application de crochet de clavier de basse niveau en C # et je vois le même problème.

    Quelqu'un d'autre a-t-il rencontré cela? Y a-t-il une solution de contournement?


1 commentaires

Je devrais ajouter qu'il existe des postes de forum sur Autohotkey.com, mais les solutions sont obsolètes ou incorrectes (voir ci-dessous). En outre, ma question n'est pas vraiment limitée à Autohotkey. Je veux éventuellement ré-implémenter l'ensemble du programme en C #. C'est plus une question sur la manière dont Windows Vista et Windows 7 traite WinKey + L différemment, et si quelqu'un l'a vu / résolu cela auparavant. Autohotkey.com/forum/viewtopic.php?t=27554&Highlight=Winkey < / a> Autohotkey.com/forum/...


3 Réponses :


0
votes

1 commentaires

En fait, j'essaie de empêcher le poste de travail de verrouillage. Je peux le faire avec le piratage de registre, mais l'état de la Winkey est toujours gâché chaque fois que vous appuyez sur WinKey + L / cmd + L (ils sont identiques; Je suis un type de cmd et de gain de route interchangeables au-dessus, désolé pour la confusion. Sur Un clavier Apple, il s'appelle CMD, mais le conducteur du clavier Windows l'interprète comme winkey.)



0
votes

J'ai essayé d'interrompre la clé Windows à l'aide du Simulateur d'entrée Windows bibliothèque . Ceci est mon rappel: xxx

Utilisation de ce crochet My Gauche Windows Key agit comme une touche de décalage (comme mise en œuvre et attendue) sous Win XP.
Appuyer sur winkey + l retourne juste l .

éditer : cependant, je peux confirmer Votre observation, que ce code ne fonctionne plus sous Windows 7 plus: / Désolé, je ne peux plus vous aider.


1 commentaires

Merci, mais je suis en train d'utiliser InputSImulator pour mon application Sandbox C #. Pour une raison quelconque, le Winkey Down est bloqué avant même d'appeler InputSimulator.Simulatedown (VKCode), l'effet finit donc à être winkey + VKCode. Et cela ne se produit qu'avec Winkey + L.



2
votes

J'ai compris un moyen de le faire en C #. Il y a quatre états impliqués dans une éventuelle gagnant + l keypress séquence (aucune, gagnant , gagnant + L , l ). Chaque fois que l'état win + l est atteint, définissez un drapeau ("Winlset" ci-dessous). Chaque fois que toutes les clés ont été publiées, nous vérifions cet indicateur et simulez la presse s'il a été défini.

La dernière pièce du puzzle est de simuler la touche WinKey avant le CTRL - < KBD> L (pas de clé). J'ai essayé des approches similaires dans Autohotkey et elle n'a jamais fonctionné, mais il semble fonctionner parfaitement ici.

Le code est ci-dessous. Veuillez consulter des notes explicatives en bas si vous envisagez d'utiliser ce code. xxx

pour la postérité: Veuillez noter que ce code utilise INPUTSIMULATOLE et LowlevelkeyboardHook, qui ne sont pas du .NET Framework. LowlevelkeyboardHook est une classe que j'ai écrit un moment qui expose qui expose des événements mondiaux de clé et de porte-clés tels que les événements C #. Il existe des exemples similaires ici , ici , et un groupe peut être trouvé ICI .

Notez également que j'utilise system.windows.input.key, pas système .Windows.Forms.keys, qui pourrait confondre certaines personnes. System.Windows.input.key est la nouvelle énumération des touches de .NET 3.0 et supérieure, tandis que System.Windows.Forms.Keys est l'ancienne énumération des formulaires Windows.


1 commentaires

Cet exemple ne fonctionne plus sur Windows 10 20h2 x64. J'ai utilisé les versions Nuget des bibliothèques (Lowlevelkeyboardhook 1.3.2.0 et InputSImulator 1.0.4.0)