it-swarm.dev

¿Cómo puedo determinar qué proceso posee una tecla de acceso directo en Windows?

Dada una tecla de acceso rápido, ¿cómo puedo encontrar qué programa lo posee?

92
aldrinleal

Precaución : Si usa Win 8 o una versión posterior, no use esta utilidad ya que creará algunos problemas, vea los comentarios.

Si está ejecutando un Windows anterior a Windows 8, entonces Windows Hotkey Explorer es probablemente lo que desea. Esto también se menciona en la pregunta de StackOverflow: ¿Averigua qué proceso registró una tecla de acceso rápido global? (API de Windows) .

45
Hans-Peter Störr

Esto me funciona en Win10 (y probablemente en todas las otras versiones de Windows incluso vagamente recientes) ... también copiado aquí desde https://stackoverflow.com/a/43645062/995048 ya que esta página parece para llegar primero en los resultados de búsqueda:

Una forma posible es usar la herramienta de Visual Studio Spy ++ .

Prueba esto:

  1. Ejecute la herramienta (para mí, está en C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\spyxx_AMD64.exe, o use spyxx.exe para monitorear los procesos de 32 bits)
  2. En la barra de menú, seleccione Spy -> Registre mensajes ... (o presione Ctrl + M)
  3. Compruebe Todas las ventanas en el sistema en el Marco adicional de Windows
  4. Cambie a la pestaña Mensajes
  5. Haga clic en el botón Borrar todo
  6. Seleccione WM_HOTKEY en el cuadro de lista, o marque Teclado en Grupos de mensajes (si está de acuerdo con más ruido potencial)
  7. Haga clic en el botón OK
  8. Presione la tecla de acceso rápido en cuestión (Win + R, por ejemplo)
  9. Seleccione la línea WM_HOTKEY en la ventana Mensajes (Todas las ventanas), haga clic con el botón derecho y seleccione Propiedades ... en el menú contextual
  10. En el cuadro de diálogo Propiedades del mensaje, haga clic en el enlace Manejador de ventana (este será el controlador de la ventana que recibió el mensaje)
  11. Haga clic en el botón Sincronizar en el cuadro de diálogo Propiedades de la ventana. Esto mostrará la ventana en la vista de árbol principal de Spy ++.
  12. En el cuadro de diálogo Propiedades de la ventana, seleccione la pestaña Proceso
  13. Haga clic en el enlace Id. De proceso. Esto te mostrará el proceso (En mi Win + R caso: Explorer)
50
user995048

Esto probablemente ha sido respondido en Stack Overflow en este hilo:

¿Averigua qué proceso registró una tecla de acceso directo global? (API de Windows)

Aquí está la respuesta de Pauk :

Tu pregunta despertó mi interés, así que he investigado un poco y, aunque lamentablemente no tengo una respuesta adecuada para ti, pensé en compartir lo que tengo.

Encontré este ejemplo de creación de gancho de teclado (en Delphi) escrito en 1998, pero se puede compilar en Delphi 2007 con un par de ajustes.

Es un DLL con una llamada a SetWindowsHookEx que pasa a través de una función de devolución de llamada, que luego puede interceptar pulsaciones de teclas: en este caso, está jugando con ellos por diversión, cambiando el cursor izquierdo hacia la derecha, etc. Una aplicación sencilla luego llama a DLL e informa sus resultados basándose en un evento TTimer. Si estás interesado puedo publicar el código basado en Delphi 2007.

Está bien documentado y comentado, y potencialmente podría usarlo como una base para averiguar a dónde va una pulsación de tecla. Si pudiera obtener el identificador de la aplicación que envió los golpes de tecla, podría rastrearlo de esa manera. Con ese control, podrá obtener la información que necesita con bastante facilidad.

Otras aplicaciones han intentado determinar las teclas de acceso rápido mediante los accesos directos, ya que pueden contener una tecla de acceso directo, que es solo otro término para las teclas de acceso rápido. Sin embargo, la mayoría de las aplicaciones no tienden a establecer esta propiedad, por lo que es posible que no devuelva mucho. Si está interesado en esa ruta, Delphi tiene acceso a la interfaz COM IShellLink 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 por Steve Teixeira y Xavier Pacheco. Mi ejemplo anterior es una versión masacrada de allí y este sitio .

¡Espero que ayude!

5
Ivo Flipse