Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-08-2003
DML DML is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina
Posts: 16
Poder: 0
DML Va por buen camino
Unhappy Simular Teclas

Hola,
Quisiera saber como simularle a la ventana de una applicacion que estoy presionando teclas

he probado con varios componentes pero no tuve suerte.

gracias de antemano
Responder Con Cita
  #2  
Antiguo 10-08-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Hola:

Mira si lo que quieres es enviar cualquier tecla, o en concreto, teclas alfanuméricas (caracteres). El siguiente código te puede servir:

Código:
//Codigo se toma de la lista de constantes del tipo VK_XXX en windows.pas
procedure EnviaTecla (Destinatario: THandle; Codigo: Integer);
begin
  SendMessage (Destinatario, WM_KEYDOWN, Codigo, 0)
end;

procedure EnviaCaracter (Destinatario: THandle; Caracter: Char);
begin
  SendMessage (Destinatario, WM_CHAR, Ord(Caracter), 0)  
end;

// Ejemplo de uso:

 // envía el caracter al Memo1
EnviaCaracter (Memo1.Handle, 'C'); 

// envía el caracter al form en que estamos
EnviaCaracter (Self.Handle, 'C');   

// envía el caracter al form principal de nuestra aplicación
EnviaCaracter (Application.Handle, 'C');  

// envía el caracter al contro activo del form principal de nuestra aplicación
EnviaCaracter (Application.ActiveControl.Handle, 'C');  

// envía el caracter a todas las aplicaciones activas en Windows
EnviaCaracter (HWND_BROADCAST, 'C');
Si quieres situar el mensaje en la cola de mensajes, sin que se tenga por qué procesar inmediatamente, puedes usar PostMessage en vez de SendMessage.
__________________
Guía de Estilo
Responder Con Cita
  #3  
Antiguo 11-08-2003
Julià T. Julià T. is offline
Miembro
 
Registrado: may 2003
Ubicación: en el teclado
Posts: 314
Poder: 21
Julià T. Va por buen camino
Una manera muy sencilla es la función

keybd_event(Código_tecla_virtual,0,0,0);

si quieres que la tecla se emule en otro componente

Componente_Destino.setfocus;
keybd_event(Código_tecla,0,0,0);
Application.ProcessMessages; //si fuera necesario canviar el foco
CompenteOrigen.SetFocus; //si fuera necesario canviar el foco
Responder Con Cita
  #4  
Antiguo 11-08-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Aunque veo que ya te han asesorado muy bien, te recomiendo este hilo http://www.clubdelphi.com/foros/arch...ic.php?t=20320

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.

Última edición por delphi.com.ar fecha: 11-08-2003 a las 21:11:14.
Responder Con Cita
  #5  
Antiguo 12-08-2003
DML DML is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina
Posts: 16
Poder: 0
DML Va por buen camino
Question

Como hago para simularle las teclas a una sub-ventana de otra applicacion(No hecha por mi en delphi) ((EXTERNA))

Ninguna de las formas que leí me funcionó
Responder Con Cita
  #6  
Antiguo 12-08-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Todas las formas te tienen que funcionar, lo que tienes que cambiar es el Handle de la ventana a la que le envíes el mensaje... Para buscar la ventana te recomiendo leer este hilo http://www.clubdelphi.com/foros/arch...ght=findwindow

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #7  
Antiguo 01-09-2004
AndyG AndyG is offline
Registrado
 
Registrado: ago 2004
Posts: 5
Poder: 0
AndyG Va por buen camino
Hola DML,

estoy intentando hacer eso mismo, es decir, enviar el mensaje que se presiono una tecla a una aplicacion externa, en mi caso particular es a la aplicacion activa. MI aplicacion delphi no se activa, esta en segundo plano. ¿Pudiste resolverlo?, ¿como?

Desde ya muchas gracias!!!!!!
Andy
Responder Con Cita
  #8  
Antiguo 01-09-2004
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
¿Ya intentaste con keybd_event? ¿Qué problemas te dio?

// Saludos
Responder Con Cita
  #9  
Antiguo 01-09-2004
AndyG AndyG is offline
Registrado
 
Registrado: ago 2004
Posts: 5
Poder: 0
AndyG Va por buen camino
Si, probe con keydb_event, y no me funciono intentando escribir en la aplicacion externa, pues estoy perdiendo el foco de la misma, no quedandome ninguna aplicacion activa.

Lo que quiero hacer es enviar un mensaje de que se presiono una tecla a la aplicacion activa actualmente. Mi aplicacion no toma foco.

Basicamente mi aplicacion es un form, con un speedbutton:

//esto es para que al ejecutar la aplicacion no se active
procedure TForm1.CMShowingChanged(var Message: TMessage);
begin
if Showing then
ShowWindow(Handle, SW_SHOWNA)
else
inherited;
end;

//para que al clickear sobre el boton, la aplicacion no se active
procedure TForm1.MOUSEACTIVATE(var Message: TWMMouseActivate);
begin
message.Result := MA_NOACTIVATE;
end;


procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
keybd_event(Ord(TSpeedButton(Sender).caption[1]), 0, 0, 0);
// PostMessage(GetForegroundWindow, WM_CHAR, Ord(TSpeedButton(Sender).caption[1]), 0)
end;

Tambien probe enviar un mensaje a la ventana activa y tampoco me funciona.
Tenes idea que estoy haciendo mal, por donde puedo seguir????

Gracias nuevamente.
Responder Con Cita
  #10  
Antiguo 01-09-2004
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
Cita:
Empezado por AndyG
...no quedandome ninguna aplicacion activa.

Lo que quiero hacer es enviar un mensaje de que se presiono una tecla a la aplicacion activa actualmente.

...

Tambien probe enviar un mensaje a la ventana activa y tampoco me funciona.

Tenes idea que estoy haciendo mal
Pues creo que tú mismo sabes ya la respuesta ¿no?

Si no hay aplicación activa ¿como planeas envierle nada a la aplicación activa?

Yo creo que vas a tener que enfocar el problema desde otro ángulo: en lugar de tratar de enviar la tecla a la aplicación activa trata de identificar plenamente la ventana (es decir, obtener su 'handle') a quien quieres enviársela para mandarlo a esa ventana.

Lo del MouseActivate no creo que te funcione. Al parecer sólo sirve para que otra ventana de tu misma aplicación preserve el foco pero no una ventana de otra aplicación como ya te has dado cuenta.

// Saludos
Responder Con Cita
  #11  
Antiguo 01-09-2004
AndyG AndyG is offline
Registrado
 
Registrado: ago 2004
Posts: 5
Poder: 0
AndyG Va por buen camino
Eso lo estuve haciendo de esta forma, pero tampoco me funciono:

PostMessage(GetForegroundWindow, WM_CHAR, Ord(TSpeedButton(Sender).caption[1]), 0)

GetForegroundWindow me devuelve un valor <> 0, ¿tengo alguna forma de saber a quien pertenece ese handle?, para verificar si es el correcto.

Con respecto a lo del MouseActivate, si eso no me sirve, como hago para que al clickear sobre un boton de una aplicacion que no esta activa, esta no tome el foco????, es decir, que la aplicacion actualmente activa no pierda el foco.

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 03:43:55.


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