Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Simular Tecla Pulsada

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Simular Tecla Pulsada Responder citando

Saludos.... mi pregunta es la siguiente:

¿Como puedo simular que tengo alguna tecla pulsada, obviamente sin pulsarle fisicamente en el teclado?

Mas en concreto, lo que necesito es que presionando alguna tecla del teclado, mediante una funcion, engañar al Sistema Operativo o minimo a mi aplicacion y hacerle creer que tengo pulsada la tecla Shift, para que a la hora de que se active el Evento OnKeyDown de la forma, el parametro Shift, contenga ssShift....

Gracias, espero me puedan ayudar!
_________________
Dirección Municipal de Informática
H. Ayuntamiento de Tijuana
Arriba Lopez Obrador !!!
Los Mexicanos Merecemos Respeto !!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

No sé si he comprendido muy bien pero he hecho unas prácticas y esto es lo que ha salido:
En el OnKeyDown de un TMemo:
Código:

    if (Key!=16){
      if (Key==74){
        Key = 16;
        Shift <<ssShift;
        StatusBar1->Panels->Items[0]->Text = "Tecla Shift pulsada...";
      }
    }

Y en el OnKeyUp:
Código:

    if (Key!=16){
      if (Key==74){
        Key = 16;
        Shift >>ssShift;
        StatusBar1->Panels->Items[0]->Text = "Tecla Shift descansa";
      }
    }

Capturo la tecla "J" como si fuera la tecla "Shift".
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias Tugui por tu respuesta, si es mas o menos una solucion posible... nada mas que me gustaria hacerlo de una manera que se pueda utilizar la API, para que en verdad el Sistema Operativo note la pulsacion del Shift, ya que lo que yo quiero es por ejemplo, presionar y soltar la tecla J y que para la aplicacion, sea como si tuviera mantenida la tecla Shift presionada, y hasta que vuelva a presionar la tecla J, sea como si ya hubiese dejado de presionar la tecla Shift.... digo la tecla J por decir cualquier tecla, es lo de menos...

Leo en un post anterior me ayudo a hacer algo asi, pero para la tecla NumLock... espero que alguien pueda ayudarme un poco, se los agradeceria muchisimo.... saludos...
_________________
Dirección Municipal de Informática
H. Ayuntamiento de Tijuana
Arriba Lopez Obrador !!!
Los Mexicanos Merecemos Respeto !!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Intenta con esto.



Código:
HANDLE hw=this->Memo1->Handle;
if(hw){
   PostMessage(hw,WM_KEYDOWN,0x43,NULL);
   PostMessage(hw,WM_KEYDOWN,0x45,NULL);
   PostMessage(hw,WM_KEYDOWN,0x53,NULL);
   PostMessage(hw,WM_KEYDOWN,0x41,NULL);
   PostMessage(hw,WM_KEYDOWN,0x52,NULL);
   PostMessage(hw,WM_KEYDOWN,0x20,NULL);
}


envia, una serie de letras, a un memo, debes obtener el HANDLE, del objeto a donde quieres enviar las teclas, los formatos exadecimales, tambien se pueden cambiar por VK_ y la tecla que quieras enviar

ejemplo
Código:
PostMessage(hw,WM_KEYDOWN,VK_UP,NULL);

Esto envia la flecha arriba al campo memo..

saludos.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Muchas gracias CEsar, ya me detecta la tecla shift, pero lo que no puedo hacer ahora que me detecte es que se quede presionada, al parecer con esa funcion, es como si la presionara y soltara... lo que necesito es que se quede presioada, hasta que yo mismo manualmente la desactive, no se si se pueda hacer esto...

el codigo que puse fue asi en un boton:
Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  PostMessage(Handle,WM_KEYDOWN,VK_SHIFT,NULL);
}


y en el Evento OnKeyDown:
Código:

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
  //ShowMessage(Key);

  if((Shift.Contains(ssShift))&&(Key==VK_RETURN))
    ShowMessage("Shift + Enter");
}

Habia puesto en ShowMessage nada mas para detectar la pulsacion de la tecla shift desde el codigo del boton y efectivamente si la detecta, pero si presiono enter, no me detecta la tecla shift y la tecla enter a la vez presionadas... lo que necesito como habia dicho es que al activar el PostMessage, la tecla shift se quede activa hasta presionar que yo manualmente la desactive... espero su respuesta, muchas gracias
_________________
Dirección Municipal de Informática
H. Ayuntamiento de Tijuana
Arriba Lopez Obrador !!!
Los Mexicanos Merecemos Respeto !!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Código:
TForm1 *Form1;
int SoltarShift;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    //ahora si vil trampa al teclado je je
    SoltarShift=1;
    while(1){
      Application->ProcessMessages();//permitir los mensajes
      PostMessage(Handle,WM_KEYDOWN,VK_SHIFT,NULL);
      Caption="shif presionada";
      if(!SoltarShift){
            Caption = "se dejo de presionar shift:";
            break;
      }
    }
    // para mayor expliacion, dice, la referencia que cuando
    // se mantiene pulsada una tecla, se envian varios mensajes
    // KeyDown al sistema, y es un solo Mensaje KeyUp, para liberarla
    // de esta manera, la tecla, es como si estuviera presionada.
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    SoltarShift =0;
}
//---------------------------------------------------------------------------


prueba con esto
saludos
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

hola CEsar

Muchas gracias, asi como me lo pusiste fgunciona.... nada mas que lo que yo queria era que al activarse el evento OnKeyDown, el parametro Shift conteniera ssShift, en pocas palabras que Shift.Contains(ssShift) me devolviera true, pero no lo hace... al parecer esto no se va a poder, sino, no importa... asi lo hare como lo pusiste en el post anterior.. muchisimas gracias por tui ayuda....
_________________
Dirección Municipal de Informática
H. Ayuntamiento de Tijuana
Arriba Lopez Obrador !!!
Los Mexicanos Merecemos Respeto !!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Bien, ultima si asi no es, me rindo, jejeje

Código:
void __fastcall TForm1::Button1Click(TObject *Sender)
{

 //activar pulsado de la tecla shift, por siempre
    keybd_event(VK_SHIFT, 1, 0, 0);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
//quitar pulsado de la tecla shift
   keybd_event(VK_SHIFT, 1, KEYEVENTF_KEYUP, 0);
}
//---------------------------------------------------------------------------



saludos
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Muchisiimas gracias Cesar, funciona a la perfeccion... no solo lo reconoce la aplicacion, sino todo el windows... es como si en verdad estuviese presionando la tecla Shift, muchas gracias nuevamente era justo lo que necesitaba....
_________________
Dirección Municipal de Informática
H. Ayuntamiento de Tijuana
Arriba Lopez Obrador !!!
Los Mexicanos Merecemos Respeto !!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.