Su pregunta despertó mi interés, así que investigué un poco y aunque, desafortunadamente, no tengo una respuesta adecuada para usted, pensé en compartir lo que tengo.
Encontré este ejemplo de cómo crear un gancho de teclado (en Delphi) escrito en 1998, pero se puede compilar en Delphi 2007 con un par de ajustes.
Es una DLL con una llamada a SetWindowsHookEx
que pasa a través de una función de devolución de llamada, que luego puede interceptar las pulsaciones de las teclas: en este caso, está jugando con ellas por diversión, cambiando el cursor de la izquierda a la derecha, etc. Una aplicación simple luego llama a la DLL y le informa. sus resultados basados en un evento TTimer. Si está interesado, puedo publicar el código basado en Delphi 2007.
Está bien documentado y comentado y potencialmente podría usarlo como base para determinar hacia dónde se dirige la pulsación de una tecla. Si pudiera obtener el identificador de la aplicación que envió las pulsaciones de tecla, podría rastrearla de esa manera. Con ese identificador, podrá obtener la información que necesita con bastante facilidad.
Otras aplicaciones han intentado determinar las teclas de acceso rápido mediante sus accesos directos, ya que pueden contener una tecla de acceso directo, que es solo otro término para la tecla de acceso rápido. Sin embargo, la mayoría de las aplicaciones no suelen establecer esta propiedad, por lo que es posible que no devuelva mucho. Si está interesado en esa ruta, Delphi tiene acceso a la IShellLink
interfaz COM que puede usar para cargar un acceso directo y obtener su tecla de acceso rápido:
uses ShlObj, ComObj, ShellAPI, ActiveX, CommCtrl;
procedure GetShellLinkHotKey;
var
LinkFile : WideString;
SL: IShellLink;
PF: IPersistFile;
HotKey : Word;
HotKeyMod: Byte;
HotKeyText : string;
begin
LinkFile := 'C:\Temp\Temp.lnk';
OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, SL));
// The IShellLink implementer must also support the IPersistFile
// interface. Get an interface pointer to it.
PF := SL as IPersistFile;
// Load file into IPersistFile object
OleCheck(PF.Load(PWideChar(LinkFile), STGM_READ));
// Resolve the link by calling the Resolve interface function.
OleCheck(SL.Resolve(0, SLR_ANY_MATCH or SLR_NO_UI));
// Get hotkey info
OleCheck(SL.GetHotKey(HotKey));
// Extract the HotKey and Modifier properties.
HotKeyText := '';
HotKeyMod := Hi(HotKey);
if (HotKeyMod and HOTKEYF_ALT) = HOTKEYF_ALT then
HotKeyText := 'ALT+';
if (HotKeyMod and HOTKEYF_CONTROL) = HOTKEYF_CONTROL then
HotKeyText := HotKeyText + 'CTRL+';
if (HotKeyMod and HOTKEYF_SHIFT) = HOTKEYF_SHIFT then
HotKeyText := HotKeyText + 'SHIFT+';
if (HotKeyMod and HOTKEYF_EXT) = HOTKEYF_EXT then
HotKeyText := HotKeyText + 'Extended+';
HotKeyText := HotKeyText + Char(Lo(HotKey));
if (HotKeyText = '') or (HotKeyText = #0) then
HotKeyText := 'None';
ShowMessage('Shortcut Key - ' + HotKeyText);
end;
Si tiene acceso a Safari Books Online , hay una buena sección sobre cómo trabajar con accesos directos / enlaces de shell en la Guía del desarrollador de Borland Delphi 6 de Steve Teixeira y Xavier Pacheco. Mi ejemplo anterior es una versión sacrificada de allí y este sitio .
¡Espero que ayude!
WM_HOTKEY
mensaje en el registro de mensajes después de presionar la tecla de acceso rápido, es posible que deba ejecutar la versión de 32 bits de Spy ++ .Después de algunas investigaciones, parece que necesitaría acceder a la estructura interna que utiliza MS para almacenar las teclas de acceso rápido. ReactOS tiene una implementación de sala limpia que implementa la
GetHotKey
llamada iterando una lista interna y extrayendo la tecla de acceso rápido que coincide con los parámetros de la llamada.Dependiendo de qué tan cerca esté la implementación de ReactOS de la implementación de MS, es posible que pueda hurgar en la memoria para encontrar la estructura, pero eso está por encima de mi cabeza ...
Supongo que alguien relacionado con esta pregunta hizo este hilo en sysinternals , pero pensé que lo vincularía de todos modos para mantener los dos juntos. El hilo se ve muy intrigante, pero sospecho que sería necesario realizar una inmersión profunda en espeleología para resolver esto sin acceso a los componentes internos de MS.
fuente
En la parte superior de mi cabeza, puede intentar enumerar todas las ventanas con EnumWindows, luego, en la devolución de llamada, envíe WM_GETHOTKEY a cada ventana.
Editar: Aparentemente, estaba equivocado en eso. MSDN tiene más información:
Nota: Aquí hay un programa que pretende tener la funcionalidad que está buscando. Podrías intentar descompilarlo.
fuente
Esto parece decirte mucho: http://hkcmdr.anymania.com/help.html
fuente
hoo
usosSetWindowHookEx
para establecer dos ganchos, unoWH_KEYBOARD_LL
y unoWH_GETMESSAGE
... el resto debería estar bastante documentado en MSDN.Otro hilo menciona un gancho de teclado de nivel NT global:
Reasignar / anular la tecla de acceso rápido (Win + L) para bloquear ventanas
tal vez pueda obtener el control del proceso que llamó al gancho de esa manera, que luego puede resolver con el nombre del proceso
(descargo de responsabilidad: lo tenía en mis marcadores, realmente no lo he probado)
fuente
Sé que puede interceptar el flujo de mensajes en cualquier ventana dentro de su propio proceso, lo que solíamos llamar subclases en VB6. (Aunque no recuerdo la función, ¿quizás SetWindowLong?) No estoy seguro de si puede hacer esto para Windows fuera de su propio proceso. Pero por el bien de esta publicación, supongamos que encuentra una manera de hacerlo. Luego, simplemente puede interceptar los mensajes para todas las ventanas de nivel superior, monitorear el mensaje WM_HOTKEY. No podría conocer todas las teclas de inmediato, pero a medida que las presione, podría averiguar fácilmente qué aplicación las estaba usando. Si conserva los resultados en el disco y los vuelve a cargar cada vez que se ejecuta la aplicación del monitor, puede aumentar el rendimiento de la aplicación con el tiempo.
fuente
Esto no responde exactamente a la parte de la pregunta que trata sobre la API de Windows, pero responde a la parte de la pregunta que trata sobre una lista de teclas de acceso rápido globales y las aplicaciones que las "poseen".
El Hotkey Explorer gratuito en http://hkcmdr.anymania.com/ muestra una lista de todas las teclas de acceso rápido globales y las aplicaciones que las poseen. Esto me ha ayudado a descubrir por qué una tecla de acceso directo específica de la aplicación dejó de funcionar y cómo solucionarlo (reconfigurando la tecla de acceso rápido global registrada en la aplicación que la tenía registrada), en unos pocos segundos.
fuente