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 ++ .