Découvrez ce processus enregistré une touche d'accès rapide? (API Windows)
Aussi loin que j'ai pu trouver, Windows n'offre pas une fonction de l'API de dire ce que l'application a enregistré une touche d'accès rapide (via RegisterHotkey). Je ne peux trouver qu'un raccourci est enregistré si RegisterHotkey retourne false, mais pas le "propriétaire" de la touche de raccourci.
En l'absence d'une relation directe de l'API, pourrait-il y être une façon détournée? Windows conserve la poignée associée à chaque inscrit de raccourci - c'est un peu affolant qu'il devrait y avoir aucun moyen d'obtenir cette information.
Exemple de quelque chose qui n'y aurait probablement pas de travail: envoyer (simuler) un régime enregistré d'raccourci, puis intercepter la touche message Windows envoie le processus qui l'a enregistré. Tout d'abord, je ne pense pas que intercepter le message pourrait révéler la destination la poignée de la fenêtre. Deuxièmement, même si c'était possible, ce serait une mauvaise chose à faire, depuis l'envoi de touches de raccourci pourrait déclencher toutes sortes de potentiellement indésirables de l'activité de divers programmes.
Il n'a rien de critique, mais j'ai vu souvent de demandes de fonctionnalités, et l'ai moi-même été victime d'une des applications de ce registre, les raccourcis sans même communiquer n'importe où dans l'INTERFACE utilisateur ou des documents.
(Travail en Delphi, et pas plus qu'un apprenti à la WinAPI, s'il vous plaît être gentil.)
Vous devez vous connecter pour publier un commentaire.
Votre question a piqué mon intérêt, j'ai donc fait un peu de creuser et de tout, malheureusement je n'ai pas de bonne réponse pour vous, je pensais que je voudrais partager ce que j'ai.
J'ai trouvé ce exemple de création de hook clavier (en Delphi) écrit en 1998, mais il est compilable en Delphi 2007 avec un couple de réglages.
C'est une DLL avec un appel à
SetWindowsHookEx
qui passe à travers une fonction de rappel, qui peut alors intercepter les frappes de touche: Dans ce cas, c'est bricoler avec eux pour s'amuser, changer de curseur de gauche à droite, etc. Une application simple, puis appelle la DLL et rend compte de ses résultats sur la base d'un TTimer événement. Si vous êtes intéressé, je peux poster le Delphi 2007 en fonction du code.Il est bien documenté et commenté et vous pourriez l'utiliser comme une base de travail où une touche est en cours. Si vous pouviez obtenir le descripteur de l'application qui a envoyé les frappes de touche, vous pouvez retrouver de cette façon. Avec cette poignée vous seriez en mesure d'obtenir les informations dont vous avez besoin assez facilement.
D'autres applications ont essayé de déterminer raccourcis en passant par leurs Raccourcis, car ils peuvent contenir une touche de Raccourci, qui est juste un autre terme pour la touche de raccourci. Cependant, la plupart des applications n'ont pas tendance à définir cette propriété de sorte qu'il pourrait ne pas revenir beaucoup. Si vous êtes intéressé par cette route, Delphi a accès à
IShellLink
COM interface qui vous pouvez utiliser pour charger un raccourci vers le haut et d'obtenir sa touche de raccourci:Si vous avez accès à des Safari Books Online, il y a un bon article sur le travail avec les raccourcis /liens shell dans le Borland Delphi 6 Guide du Développeur par Steve Teixeira et Xavier Pacheco. Mon exemple ci-dessus est une boucherie version à partir de là et ce site.
Espère que ça aide!
Une façon est d'utiliser l' Visual Studio outil Spy++.
Donner à ceci un essai:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\spyxx_amd64.exe
)WM_HOTKEY
dans la zone de liste, ou de vérifier Clavier dans Groupes de Messages (si vous êtes OK avec plus de potentiel de bruit)WM_HOTKEY
ligne dans le Messages (Toutes les Fenêtres) de la fenêtre, cliquez avec le bouton droit et sélectionnez Propriétés... dans le menu contextuelEXPLORER
)WM_HOTKEY
message dans le journal des Messages après avoir appuyé sur la touche de raccourci, vous pouvez avoir besoin pour exécuter la version 32 bits de Spy++.Après quelques recherches, il semble que vous auriez besoin pour obtenir l'accès à la structure interne que MS utilise pour stocker les touches de raccourci. ReactOS a un nettoyage de la salle de mise en œuvre qui met en œuvre la
GetHotKey
appel par itération d'une liste interne et de l'extraction de la touche qui correspond aux paramètres de l'appel.Selon ReactOS de mise en œuvre de la MS de la mise en œuvre, vous pourriez être en mesure de fouiller dans la mémoire de trouver la structure, mais c'est au dessus de ma tête...
Je présume ce fil de discussion sur sysinternals a été demandé par une personne liée à cette question, mais je pensais le lien de toute façon à maintenir les deux ensemble. Le fil a l'air très intéressant, mais je soupçonne que certains de profondeur de plongée spéléo devra arriver à ce chiffre, sans accès à la MS internes.
Sur le dessus de ma tête, vous pouvez essayer de les énumérer toutes les fenêtres avec EnumWindows, puis dans le rappel, envoyer WM_GETHOTKEY à chaque fenêtre.
Edit: Apparemment je me suis trompé à ce sujet. MSDN a plus d'informations:
Remarque: Ici est un programme visant à la fonctionnalité que vous recherchez. Vous pouvez essayer de décompiler il.
Cela semble vous dire beaucoup de choses:
http://hkcmdr.anymania.com/help.html
hoo
utiliseSetWindowHookEx
de définir deux crochets, unWH_KEYBOARD_LL
et unWH_GETMESSAGE
... le reste devrait être assez bien documenté sur le site MSDN.Un autre thread mentionne un mondial NT du clavier au niveau du crochet:
Re-assigner/remplacement de raccourci Win + L) pour verrouiller les fenêtres
peut-être que vous pouvez obtenir le handle du processus qui a appelé le crochet de cette façon, vous pouvez ensuite résoudre le nom du processus
(disclaimer: je l'avais dans mes favoris, n'ont pas vraiment essayé/testé)
Je sais que vous pouvez intercepter les flux de messages dans une fenêtre à l'intérieur de votre propre processus que nous avons utilisé pour l'appel de sous-classement en VB6. (Si je ne me souviens pas de la fonction, peut-être SetWindowLong?) Je suis pas sûr si vous pouvez le faire pour windows en dehors de votre propre processus. Mais pour l'amour de ce post, supposons que vous trouverez un moyen de le faire. Ensuite, vous pouvez simplement intercepter les messages pour toutes les fenêtres de niveau supérieur, surveiller les WM_HOTKEY message. Vous ne seriez pas en mesure de connaître toutes les touches à droite au large de la chauve-souris, mais comme ils étaient pressés vous pouvez facilement comprendre ce que l'application a été de les utiliser. Si vous conservé vos résultats sur le disque et rechargé à chaque fois que votre moniteur application a été lancée, vous pouvez augmenter les performances de votre application dans le temps.
Ce n'est pas exactement la réponse de la partie de la question qui est sur l'API Windows, mais il répond à la partie de la question qui est sur une liste de raccourcis d'interface et les applications qui "propre" entre eux.
La libre touche de Raccourci de l'Explorateur à http://hkcmdr.anymania.com/ montre une liste de tous les raccourcis d'interface et les applications qui en sont propriétaires. Cette juste a m'a aidé à comprendre pourquoi une application spécifique à la touche de raccourci cessé de fonctionner et comment résoudre le problème (par le réaménagement de la global hotkey dans le app qui il avait enregistré), dans un délai de quelques secondes.