Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-12-2005
FeLiXxUcO FeLiXxUcO is offline
Registrado
 
Registrado: dic 2005
Posts: 5
Poder: 0
FeLiXxUcO Va por buen camino
Hook de Teclado + DLL

Hola queria preguntar si alguien me puede ayudar con este tema, estoy intentando que mi aplicacion, estando minimizada o en el trayicon, responda a una combinacion de teclas (CTRL + 1 y que cambie el color de un shape de su formulario por ejemplo) estando como ventana principal, cualquier otra aplicacion.

He visto que hay que crear una DLL y por medio de los Hooks de las apis hacerlo pro no se como.

Alguien me puede ayudar??

si no, al menos saber como tengo que declarar las funciones en la DLL y como poder llamarlas desde la aplicacion, tengo la inicializacion del hook en un DLL
pro no puedo llamarlas desde mi aplicacion, o no se como hacerlo.

Agradeceria cualquier ayuda
Muchas Gracias.
Responder Con Cita
  #2  
Antiguo 01-12-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
seguramente te orientará lo escrito en este hilo y la unidad hooks.pas de roman.

Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 01-12-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Aunque algo más sencillo podría ser usar RegisterHotKey con la cual le indicamos al sistema que nos mande un mensaje cada vez que la tecla registrada se oprima, independientemente de si nuestra aplicación tiene o no el foco.

// Saludos
Responder Con Cita
  #4  
Antiguo 01-12-2005
FeLiXxUcO FeLiXxUcO is offline
Registrado
 
Registrado: dic 2005
Posts: 5
Poder: 0
FeLiXxUcO Va por buen camino
El problema de la documentacion que hay aqui y a lo que te refieres jachguate, es que esta en Delphi y no tengo ni idea, he tratado de traducirlo pro no lo consigi
¿A que te refieres Roman con RegisterHotKey? es un componente?
Si es un componente y lo que hace es mandarme un mesaje con la combinacion de teclas pulsada,que mi aplicacion actue en consecuencia, y luego devuelva el control a la aplicacion que estaba antes en primer plano me podria servir y mucho.
Es que para que te hagas una idea mi aplicacion hace de servidor. y trabajo con otra que hace de cliente, entonces tengo que poder hacer cambios en el servidor mediate esa una combinacion de teclas, para ver como responde el cliente, que es el que tengo que estar visualizando en todo momento. Espero que se entienda cual es el objetivo.
Muchas gracias a los dos por responder
Responder Con Cita
  #5  
Antiguo 01-12-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Algo así podría hacerse, más o menos, tratándose de Delphi:

Código Delphi [-]
unit UfrmPrincipal;

interface

uses
  Forms, Windows, Messages, Dialogs;

type
  TfrmPrincipal = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    procedure AppMessage(var Msg: tagMSG; var Handled: Boolean);
  end;

var
  frmPrincipal: TfrmPrincipal;

implementation

{$R *.dfm}

procedure TfrmPrincipal.AppMessage(var Msg: tagMSG; var Handled: Boolean);
begin
  if (Msg.message = WM_HOTKEY) then
  begin
    if (LOWORD(Msg.lParam) = MOD_CONTROL)
      and (HIWORD(Msg.lParam) = Ord('O')) then
        ShowMessage('Pulsaste las teclas "CTRL + O"');
  end;
end;

procedure TfrmPrincipal.FormCreate(Sender: TObject);
begin
  Application.OnMessage := AppMessage;
end;

initialization
  RegisterHotKey(Application.Handle, GlobalAddAtom('MiHotKey'), MOD_CONTROL, Ord('O'));

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

end.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 01-12-2005
FeLiXxUcO FeLiXxUcO is offline
Registrado
 
Registrado: dic 2005
Posts: 5
Poder: 0
FeLiXxUcO Va por buen camino
Muchas gasias dec
Aunque ya digo que en Delphi estoy un poco pez.. tratare de traducirlo y ya contare que tal ha ido.
Y si lo logro hacer funciona ya dejare el codigo.
gracias por vuestras respuestas
Responder Con Cita
  #7  
Antiguo 02-12-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Más o menos:


Código:
 void __fastcall TForm1::FormCreate(TObject *Sender)
 {
   Application->OnMessage = AppMessage;
   //
   // 79 es el código ASCII de la letra "O". No he conseguido encontrar la función
   // correspondiente a "Ord" (en Delphi) aquí en C++ Builder. He probado con
   // Integer("O") y con Cardinal("0"), pero, no funciona, así que al cabo he optado
   // por pasar como tercer parámetro de "RegisterHotKey" el número 79, que ya sabes
   // lo que quiere significar. ;)
   //
   RegisterHotKey(Application->Handle, GlobalAddAtomA("MiHotKey"), MOD_CONTROL, 79);
 }
 
 void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
 {
   UnregisterHotKey(Application->Handle, GlobalAddAtomA("MiHotKey"));
 }
 
 // Declarado en la cláusula "private" de "TForm1"
 //
 void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
 {
   if (Msg.message == WM_HOTKEY)
   {
 	if ( (LOWORD(Msg.lParam) == MOD_CONTROL) && (HIWORD(Msg.lParam) == 79) )
 	  ShowMessage("Pulsaste las teclas CTRL + O");
   }
 }
Edito: Adjunto un archivo para que veas "la cosa" funcionando.
Archivos Adjuntos
Tipo de Archivo: zip ejemplo.zip (4,1 KB, 90 visitas)
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 02-12-2005 a las 00:28:43. Razón: Adjuntar archivo.
Responder Con Cita
  #8  
Antiguo 02-12-2005
FeLiXxUcO FeLiXxUcO is offline
Registrado
 
Registrado: dic 2005
Posts: 5
Poder: 0
FeLiXxUcO Va por buen camino
Muchas Gracias David, el fin de semana hare pruebas y ya te comentare
Responder Con Cita
  #9  
Antiguo 05-12-2005
FeLiXxUcO FeLiXxUcO is offline
Registrado
 
Registrado: dic 2005
Posts: 5
Poder: 0
FeLiXxUcO Va por buen camino
Funciona Perfectamente

Bueno David, he utilizado el codigo que me pusiste en mi aplicacion y hace exactamente lo que necesitaba asi que me ha venido de perlas. Solo una aclaracion, tal vez lo que querias buscar en cuanto a Ord("O") en c++ Builder creo que se hace asi: (int)'O' al menos lo uso asi y funciona.

RegisterHotKey(Application->Handle, GlobalAddAtomA("MiHotKey"), MOD_CONTROL, (int)'O');


De nuevo Agradecerte el codigo porque me ha venido genial
Responder Con Cita
  #10  
Antiguo 05-12-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,


Cita:
Empezado por FeLiXxUcO
(...) tal vez lo que querias buscar en cuanto a Ord("O") en c++ Builder creo que se hace asi: (int)'O' al menos lo uso asi y funciona.
Pues gracias por comentarlo, porque acaso pueda tenerlo en cuenta en su momento. Lo cierto es que probé con (Integer)"O" y con (Cardinal)"O" (creo recordar) y no funcionaba... Bueno. De todos modos me alegro de que te fuera bien el tema. Gracias de nuevo por tus comentarios a respecto.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #11  
Antiguo 08-02-2006
i_berbeu i_berbeu is offline
Miembro
 
Registrado: sep 2005
Posts: 23
Poder: 0
i_berbeu Va por buen camino
Yo he probado eso del registerhotkey y no me ha funcionado la verdad
no me pilla la pulsacion de la tecla o
seguramente es porque no lo entiendo del todo o falta algo de codigo que no se poner...
a ver si alguien pudiera explicarme
Gracias
Responder Con Cita
  #12  
Antiguo 09-02-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

i_berbeu, no puede ayudársete si no das más datos, o eres más preciso. Decir:

Cita:
Yo he probado eso del registerhotkey y no me ha funcionado la verdad
Sin decir qué es lo que no te ha funcionado; sin especificar qué error te aparece; sin referir el código fuente que estás tratando de utilizar... como comprenderás no es por no querer, es que así es muy complicado echarte una mano. ¿Verdad?

Cita:
seguramente es porque no lo entiendo del todo o falta algo de codigo que no se poner... a ver si alguien pudiera explicarme
Seguramente así sea. Pero toma nota de lo que te digo más arriba. Y más aún toma nota del código fuente que más arriba en este Hilo tienes a tu disposición. No se explica exactamente qué se lleva a cabo, pero, funcionar, funciona. Así pues, algo debes estar haciendo mal, eso está más o menos claro y es lo más normal del mundo; sin embargo, sin especificar un poco más se hace complicado echarte una mano. ¿No te parece?
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #13  
Antiguo 12-02-2006
i_berbeu i_berbeu is offline
Miembro
 
Registrado: sep 2005
Posts: 23
Poder: 0
i_berbeu Va por buen camino
bueno vamos a ver si me explico mejor en lo que me falla... yo pongo este codigo(en c++ builder 5)
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnMessage = AppMessage;
//
// 79 es el código ASCII de la letra "O". No he conseguido encontrar la función
// correspondiente a "Ord" (en Delphi) aquí en C++ Builder. He probado con
// Integer("O") y con Cardinal("0"), pero, no funciona, así que al cabo he optado
// por pasar como tercer parámetro de "RegisterHotKey" el número 79, que ya sabes
// lo que quiere significar.
//
RegisterHotKey(Application->Handle, GlobalAddAtomA("MiHotKey"), MOD_CONTROL, 79);
}

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
UnregisterHotKey(Application->Handle, GlobalAddAtomA("MiHotKey"));
}

// Declarado en la cláusula "private" de "TForm1"
//
void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
if (Msg.message == WM_HOTKEY)
{
if ( (LOWORD(Msg.lParam) == MOD_CONTROL) && (HIWORD(Msg.lParam) == 79) )
ShowMessage("Pulsaste las teclas CTRL + O");
}
}

que es el que pusiste tu DEC
entonces segun lei, se supone que me deberia pillar la pulsacion de la tecla "o"
aunque mi formulario no tenga el foco. o teniendolo, me da igual....
el caso es que el evento onMessage me pilla en la variable Msg ciertos valores. entonces si miro esos valores en Msg.message tenemos valores del tipo 670, 610, 14, 1550 y cosas asi, que yo no entiendo como eso va a ser igual a VM_HOTKEY a menos que sea un tipo enumerado que no lo se
entonces, resulta que aunque pulse la "o" a mi el evento ese no me captura un mensage en el cual se meta dentro hasta el ShowMessage.

Espero haberme explicado bien con esto y a ver si me solucionais la duda alguno
Gracias
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 08:32: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
Copyright 1996-2007 Club Delphi