Hola a todos,
Creo que he encontardo una solución, aunque seguramente no sea la mejor, ya que lo he hecho por medio de hooks.
Lo que hago es crear un hook de teclado, para capturar las teclas pulsadas.
Os explico con el código:
Variables que me hacen falta, yo las he puesto globales en la unidad
Código Delphi
[-]
var
HookKbd: HHook; EsSegundaVez: Boolean;
En la parte del Create del componente:
Código Delphi
[-]
HookKbd := 0; if not((FindWindow('TAppBuilder',nil) > 0) and
(FindWindow('TPropertyInspector',nil) > 0) and
(FindWindow('TAlignPalette',nil) > 0)) then
begin
Version.dwOSVersionInfoSize:=SizeOf(Version);
GetVersionex(Version);
if Version.dwPlatformId <> VER_PLATFORM_WIN32_WINDOWS then
begin
HookKbd := SetWindowsHookEx(WH_KEYBOARD, @KbdHook, HInstance, 0);
EsSegundaVez := False; end;
end;
En el destroy del componente:
Código Delphi
[-]
if HookKbd <> 0 then UnhookWindowsHookEx(HookKbd);
y la función KbdHook:
Código Delphi
[-]
function KbdHook(Code: Integer; WParam, LParam: DWORD): HHook;
var
tmpClase: array[0..30] of Char; begin
GetClassName(GetFocus, tmpClase, 30);
if ((HiWord(GetKeyState(VK_MENU)) = 0) and
(HiWord(GetKeyState(VK_CONTROL)) = 0) and
(tmpClase = 'TMiGrid') and
(Chr(WParam) in ['A'..'Z', '0'..'9', 'Ñ', 'ñ'])) then
begin
if EsSegundaVez then
begin
EsSegundaVez := False;
Result := 1; Exit;
end;
EsSegundaVez := True;
SendMessage(GetFocus, WM_KEYDOWN, WParam, LParam);
Result := 1; end
else
begin
Result := CallNextHookEx(HookKbd, Code, wParam, lParam);
end;
end;
Y eso es todo, seguramente el código se puede mejorar (por ejemplo solo crear un Hook independientemente de los controles que haya), pero es un primer intento.
Por mi parte nada más, sólo que si tenéis alguna sugerencia, duda o comentario aquí estoy.
Un saludo,
Kiko