Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Capturar las teclas Alt+TAb (https://www.clubdelphi.com/foros/showthread.php?t=70428)

Galahad 20-10-2010 13:28:44

Capturar las teclas Alt+TAb
 
Estoy intentando crear una especie de 'Tasklist' con los formularios que el usuario tiene abiertos de la aplicación. La idea es 'capturar' el Alt+Tab de Windows para mostrar los formularios minimizados por el usuario (si los hay) y permitirle al usuario cambiar rapidamente de formulario.
El control de los formularios ya me funciona bien, solo me falta el que la aplicación procese el Alt+Tab,, me salta siempre el de windows,, si lo pongo una tecla rápida como por ejemplo Ctrl+J, me funciona perfectamente,, este es el código, agradeceria me indicasen que estoy haciendo mal.

Código:


 procedure TfrmPrincipal.AppMessage(var Msg: tagMSG; var Handled: Boolean);
begin
  if (Msg.message = WM_SYSCOMMAND) then
  begin
      if (LOWORD(Msg.lParam) = MOD_ALT)
      and (HIWORD(Msg.lParam) = VK_TAB ) then
        ShowMessage('Pulsaste las teclas "ALT + TAB"');
  end;
end;
  initialization
  RegisterHotKey(Application.Handle, GlobalAddAtom('MiHotKey'), MOD_ALT, VK_TAB);

finalization
  UnregisterHotKey(Application.Handle, GlobalAddAtom('MiHotKey'));

Gracias....

Ñuño Martínez 21-10-2010 09:42:13

Posiblemente se pueda, pero si Windows estuviera bien diseñado no debería ser posible (al menos en mi opinión).

Por otro lado no es necesario que lo hagas, ya que puedes usar la combinación [Ctrl]+[Tab], la cual va cambiando entre lengüetas o ventanas de una única aplicación. Al menos así es en algunas aplicaciones que he visto y es lo que yo haría.

Galahad 21-10-2010 10:21:01

Capturar Alt+Tab
 
Cita:

Empezado por Ñuño Martínez (Mensaje 379981)
Posiblemente se pueda, pero si Windows estuviera bien diseñado no debería ser posible (al menos en mi opinión).

Por otro lado no es necesario que lo hagas, ya que puedes usar la combinación [Ctrl]+[Tab], la cual va cambiando entre lengüetas o ventanas de una única aplicación. Al menos así es en algunas aplicaciones que he visto y es lo que yo haría.

Gracias por la respuesta, por desgracia, esta aplicación no está diseñada con menus y forms situados en pestañas, son ventanas individuales, y con ventanas individuales no funciona, supongo que podria utilizar por ejemplo Ctrl+T y que el usuario intente cambiar su hábito de utilizar Alt+Tab....

Ñuño Martínez 21-10-2010 10:33:53

Cita:

Empezado por Galahad (Mensaje 379990)
Gracias por la respuesta, por desgracia, esta aplicación no está diseñada con menus y forms situados en pestañas, son ventanas individuales, y con ventanas individuales no funciona, supongo que podria utilizar por ejemplo Ctrl+T y que el usuario intente cambiar su hábito de utilizar Alt+Tab....

¿Que no funciona con [Ctrl]+[Tab]? Eso sí que es raro.:confused:

escafandra 21-10-2010 15:39:11

Código Delphi [-]
unit Unit1;

interface

uses Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
  procedure FormCreate(Sender: TObject);
  procedure HotKey(var Message: TMessage); message WM_HOTKEY;

    procedure FormClose(Sender: TObject; var Action: TCloseAction); end;

var Form1: TForm1;

implementation

{$r *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 RegisterHotKey(Handle, 111, MOD_ALT, VK_TAB);
end;

procedure TForm1.HotKey(var Message: TMessage);
begin
 if Message.WParam = 111 then
  begin
   MessageBox(0, 'Hola', 'jeje', 0);
  end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  UnRegisterHotKey(Handle, 111);
end;

end.


Saludos.

roman 21-10-2010 15:53:30

Escafandra, ¿esto funciona? Lo he probado en Windows Vista y no pasa nada.

// Saludos

Galahad 21-10-2010 20:37:21

Cita:

Empezado por roman (Mensaje 380023)
Escafandra, ¿esto funciona? Lo he probado en Windows Vista y no pasa nada.

// Saludos

Je,je,,, yo también lo he probado,, y efectivamente no funciona,, pero si
cambiamos MOD_ALT, por MOD_CONTROL,, funciona !!!,, osea

Código:

RegisterHotKey(Handle, 111, MOD_CONTROL, VK_TAB);
esto consigue el resultado correcto, llego a la conclusión de que Windows "procesa" su propio control antes del de nuestro programa.

Saludos...

escafandra 21-10-2010 22:05:53

Cita:

Empezado por roman (Mensaje 380023)
Escafandra, ¿esto funciona? Lo he probado en Windows Vista y no pasa nada.

// Saludos


Bueno, lo he probado en un XP profesional y otro Home y si me funciona.
No he tenido oportunidad de probar en Vista ni W7.

Saludos.

escafandra 21-10-2010 23:39:08

Efectivamente, el sistema de capturar HotsKeys en Win 7 no funciona con ALT+TAB. Pero si funciona un Hook al teclado como el de este ejemplo que he preparado:

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  WHookKeyboard: cardinal;

implementation

{$R *.dfm}
function KeyboardHook(Code, wParam, lParam: Integer): Integer; stdcall;
begin
  if (Code = HC_ACTION) and LongBool(PDWORD(lParam + 8)^ and $20{LLKHF_ALTDOWN}) and (PDWORD(lParam)^ = VK_TAB) then
  begin
      Beep();
  end;
  Result:= CallNextHookEx(WHookKeyboard, Code, wParam, lParam);
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
 WHookKeyboard:= SetWindowsHookEx(13{WH_KEYBOARD_LL}, @KeyboardHook, HInstance, 0);

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  UnhookWindowsHookEx(WHookKeyboard);
end;

end.

Saludos.


La franja horaria es GMT +2. Ahora son las 22:09:50.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi