Enviar tecla con PostMessage a ventana de un proceso
#1
Escrito 30 diciembre 2009 - 08:27
Espero su ayuda
Saludos y Pròspero Año Nuevo (d)
#2
Escrito 30 diciembre 2009 - 08:32
¿ Y no te sirven los eventos OnKeyPress, OnKeyDown de la forma ?
Me imagino que al ocupar toda la pantalla siempre tiene el foco, ¿ o me equivoco ?
Salud OS
#3
Escrito 30 diciembre 2009 - 08:36
Hola
¿ Y no te sirven los eventos OnKeyPress, OnKeyDown de la forma ?
Me imagino que al ocupar toda la pantalla siempre tiene el foco, ¿ o me equivoco ?
Salud OS
Pero es para la ventana de un proceso que ocupa toda la pantalla pero usando la api keybd_event no detecta el pulsado de la tecla y ps creo que la unica manera que debe funcionar es mandando la tecla
#4
Escrito 30 diciembre 2009 - 08:39
Salud OS
#5
Escrito 30 diciembre 2009 - 08:42
¿ Que tecla es la que deseas capturar ?
Salud OS
F5
#6
Escrito 30 diciembre 2009 - 09:01
keybd_event(VK_F5,$74,KEYEVENTF_EXTENDEDKEY, 0);
Salud OS
#7
Escrito 30 diciembre 2009 - 09:57
Ah vaya, ¿ y si intentas hacer esto ?
delphi
keybd_event(VK_F5,$74,KEYEVENTF_EXTENDEDKEY, 0);
Salud OS
Aun sigue sin funcionar funciona eps creo que usando PostMessage debe funcionar
#8
Escrito 31 diciembre 2009 - 04:06
PostMessage( GetParentForm(Self).Handle, WM_NEXTDLGCTL,0,0 );
Cambia WM_NEXTDLGCTL por el código de la tecla que quieras enviar (WM_NEXTDLGCTL es el tabulador, para forzar el salto al siguiente control).
#9
Escrito 31 diciembre 2009 - 06:52
Prueba con la funcion SendInput, que suele funcionar cuando la otra falla.
procedure SendKey(Code: Cardinal; KeyUp: Boolean); var Input: TInput; begin FillChar(Input,Sizeof(Input),0); Input.Itype:= INPUT_KEYBOARD; Input.ki.wScan:= MapVirtualKey(Code,0); if KeyUp then Input.ki.dwFlags:= KEYEVENTF_SCANCODE or KEYEVENTF_KEYUP else Input.ki.dwFlags:= KEYEVENTF_SCANCODE; SendInput(1,Input,Sizeof(TInput)); end; // Por ejemplo SendKey(VK_F5,FALSE); Sleep(200); SendKey(VK_F5,TRUE);
Aqui te dejo un ejemplo que envía la tecla F5 cuando se pulsa el botón derecho del ratón.
const WH_MOUSE_LL = 14; KEYEVENTF_SCANCODE = $08; var Hook: HHook; // Esta funcion es la que envia la tecla procedure SendKey(Code: Cardinal; KeyUp: Boolean); var Input: TInput; begin FillChar(Input,Sizeof(Input),0); Input.Itype:= INPUT_KEYBOARD; Input.ki.wScan:= MapVirtualKey(Code,0); if KeyUp then Input.ki.dwFlags:= KEYEVENTF_SCANCODE or KEYEVENTF_KEYUP else Input.ki.dwFlags:= KEYEVENTF_SCANCODE; SendInput(1,Input,Sizeof(TInput)); end; function MouseProc(Code: Integer; WParam, LParam: DWORD): LRESULT; stdcall; begin if Code = HC_ACTION then begin if WParam = WM_RBUTTONDOWN then SendKey(VK_F5,FALSE) else if WParam = WM_RBUTTONUP then SendKey(VK_F5,TRUE); end; Result := CallNextHookEx(Hook, Code, WParam, LParam); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin // Quitamos el hook if Hook <> 0 then UnhookWindowsHookEx(Hook); end; procedure TForm1.FormCreate(Sender: TObject); begin // Arrancamos el hook, por ejemplo al crear el formulario Hook := SetWindowsHookEx(WH_MOUSE_LL, @MouseProc, HInstance, 0); end;
#10
Escrito 31 diciembre 2009 - 12:48
La funcion keybd_event funciona mal con algunos programas, especialmente los juegos.
Prueba con la funcion SendInput, que suele funcionar cuando la otra falla.
delphi
procedure SendKey(Code: Cardinal; KeyUp: Boolean); var Input: TInput; begin FillChar(Input,Sizeof(Input),0); Input.Itype:= INPUT_KEYBOARD; Input.ki.wScan:= MapVirtualKey(Code,0); if KeyUp then Input.ki.dwFlags:= KEYEVENTF_SCANCODE or KEYEVENTF_KEYUP else Input.ki.dwFlags:= KEYEVENTF_SCANCODE; SendInput(1,Input,Sizeof(TInput)); end; // Por ejemplo SendKey(VK_F5,FALSE); Sleep(200); SendKey(VK_F5,TRUE);
Aqui te dejo un ejemplo que envía la tecla F5 cuando se pulsa el botón derecho del ratón.
delphi
const WH_MOUSE_LL = 14; KEYEVENTF_SCANCODE = $08; var Hook: HHook; // Esta funcion es la que envia la tecla procedure SendKey(Code: Cardinal; KeyUp: Boolean); var Input: TInput; begin FillChar(Input,Sizeof(Input),0); Input.Itype:= INPUT_KEYBOARD; Input.ki.wScan:= MapVirtualKey(Code,0); if KeyUp then Input.ki.dwFlags:= KEYEVENTF_SCANCODE or KEYEVENTF_KEYUP else Input.ki.dwFlags:= KEYEVENTF_SCANCODE; SendInput(1,Input,Sizeof(TInput)); end; function MouseProc(Code: Integer; WParam, LParam: DWORD): LRESULT; stdcall; begin if Code = HC_ACTION then begin if WParam = WM_RBUTTONDOWN then SendKey(VK_F5,FALSE) else if WParam = WM_RBUTTONUP then SendKey(VK_F5,TRUE); end; Result := CallNextHookEx(Hook, Code, WParam, LParam); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin // Quitamos el hook if Hook <> 0 then UnhookWindowsHookEx(Hook); end; procedure TForm1.FormCreate(Sender: TObject); begin // Arrancamos el hook, por ejemplo al crear el formulario Hook := SetWindowsHookEx(WH_MOUSE_LL, @MouseProc, HInstance, 0); end;
Exactamente quiero enviar la tecla a la ventana de un juego y creo que la unica manera que sirva es enviando un hook del la tecla al handle del juego hay alguna manera de hacer el hook enviando la tecla al handle?
Saludos y Pròspero Año Nuevo