Eliminar atajo de teclas

Iniciado por aguml, 6 Junio 2013, 15:10 PM

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

aguml

¿Es posible eliminar un atajo de teclas que usa un programa para asi poder usarlo desde windows?
Me explico mejor, estoy con un programa el cual tiene como limitacion que no deja copiar y tiene como atajo para ello Ctrl+C con lo que si pulso ese atajo me sale un mensaje de chico malo pero la idea es hacer que ese atajo no exista para el programa y asi cuando haga Ctrl+C funcionará esa combinacion pero desde windows, no desde el mismo programa, esa es la idea pero no se si estoy equivocado y si el programa no lo gestiona no se puede gestionar desde el propio windows. La cosa pinta muy mal y esta es mi ultima bala jejeje.

MCKSys Argentina

Creo que no te entendi: Quieres quitarle la hotkey al proggie? Si lo haces, como vas a pasarle el comando "copiar"?

La hotkey es solo eso: un atajo de teclado. El comando debe estar implementado en el soft. Ese es el que debes atacar (me refiero a la parte del codigo). No el trigger (teclado, mouse, etc) del mismo...

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


apuromafo CLS

  en que lenguaje está el soft?
, si es visual basic, puedes usar IDA, puedes usar vbdecompiler y así otros...
ollydbg sirve para depurar, pero si ese evento es un componente  o más aún es demo de los que les gusta los nag...

te lo digo de otra forma  cuando pulsamos en un setup, "siguiente" es un boton de continuar, pero dentro de los eventos en algun lugar apunta donde usará el recurso, lo define con algun push y que evento le dará, luego si se anula el push solo se anularía, en cambio atacar   al "script generador" o donde lo crea, puedes llegar a cosas aún mayor  como anular el boton o más aún olvidar el form.

me pasó en programas como historias clínicas, como armadillo(cuando intentaba registrarlo) y así otros programas, aveces lo que ves son solo consecuencias, lo que si vale esta ahi, pero cerca...  ejemplo el mismo hsn, crea un hilo que envia a detectar el depurador, anulado el hilo, no hay debugger present...

así que yo creo que si no se pilla por algún boton ni tecla, entonces a analizar un poco más y encontrar si hay algo que tenga relación con el tema...

saludos Apuromafo

aguml

#3
Veo que no me entendisteis jejeje. Lo primero decir que es un VB. Mi lógica es porque cuando programa en C++Builder alguna aplicación y no asigno atajos y estoy por ejemplo en un TEdit y doy a Ctrl+C ó Ctrl+V ó Ctrl+X estos atajos funcionan aunque yo no los haya asignado en mi programa por lo que me da que pensar que se encarga el propio XP de usar esos atajos siempre que mi aplicación no los use. Entonces, el programa en cuestión es DEMO, en mayúsculas porque es demo pero demo jajaja, no se puede saltar la limitación de copiar puesto que no existe código que copie ni nada, solo el código que captura el atajo y te muestra el MessageBox de chico malo y nada más.
Entonces se me ocurrió ¿que pasaría si me cargo de alguna manera la asignación del atajo en el programa en cuestión? ¿se encargará Windows de gestionar ese atajo? ¿Me permitiría así copiar lo que tenga seleccionado? ¿Que tengo que buscar en el binario para cargarme la captura y que pase el control de ese atajo directamente a Windows? Hay una especie de gestor de pulsaciones de teclas que usa para decidir que hacer por ejemplo cuando pulsas Ctrl+C, Ctrl+X, C, ... que consiste en una serie de saltos condicionales. Para saber si cuando pulsaste una tecla tenias pulsada la tecla Ctrl compara un valor que no se bien de donde lo saca con 2 y si es 2 es que estaba pulsada la tecla control, para mayusculas da 1, y si no esta pulsada ninguna de esas 2 da cero. Si llegas a la comparacion de la C vemos que compara la tecla pulsada con 0x43 y si es asi sigue sin saltar y luego compara un valor que se obtiene de alguna manera que no llegué a ver con 0x2 y si coincide no salta y te muestra el chico malo de que no puedes copiar y si no coincide salta a otro sitio donde te muestra un menú de colores. Probé a nopear el Call que muestra al chico malo pero no sirve de nada porque no muestra el mensaje pero sigue sin copiar nada. Ese es el plan y espero poder decir como Anibal Smith "Me gusta que los planes salgan bien" jejeje.

PD: si no se puede eliminar el atajo pero si se pudiera sustituir por ejemplo por Ctrl+L pues tambien valdría si con ello consigo que copie jejeje.

Os adjunto un pequeño ejemplo que he programado en el que no podréis copiar el contenido del TEdit con Ctrl+C porque yo lo asigno a otra cosa y si podréis pegar, cortar... todas las combinaciones de teclas de XP porque no las tengo asignadas. A ver si podéis mirarlo y entre todos damos con el sitio donde el programa decide si existe atajo o no en el programa y podemos anularlo para que coja el atajo Windows XP. Yo lo he estado mirando y veo que el programa gestiona las teclas pulsadas y hay una serie de comparaciones similares a las de programa víctima con saltos condicionales y demás. Para capturar las teclas usa GetKeyPress o algo así era (ya cerré el xp y no puedo mirarlo ahora mismo)
Aquí el link de mi exe de ejemplo: http://www.mediafire.com/download/bxh5d9bqolzst5a/Project1.raro

Edito: El ejemplo ya lo he solucionado y ha funcionado perfectamente mi idea. Lo he abierto con Reshacker y sorpresa:



El valor del Shortcut pasado a hexa es 0x4043 y cargándonos esa linea ya no existe el Atajo y nos deja copiar directamente desde XP. El problema es que esto es un C++Builder 6 y el programa victima es un VB y no tiene esa estructura al verlo con Reshacker y no puedo quitar el atajo asi. Sigo en las mismas Grrrrrrrrrr.

MCKSys Argentina

No estas teniendo en cuenta algo: la CLASE del control.

Si la app usa un Edit de Windows, todo el tema de "eventos" ya esta hecho, por eso lo puede handlear el SO.

Ahora, cuando el programador le "asigna" al edit un shortcut, lo que hace es redirigir la ejecuion a su propio codigo, pero no se elimina (reemplaza) el codigo del SO. Por eso funciono tu ejemplo.

En VB (al menos en VB6, .NET deberia ser peor) los edit no son los del SO. Estan definidos en el runtime de VB. En realidad son una subclase del Edit del SO, y tienen todos los "eventos" handleados por el runtime. Por eso hay veces que los mensajes para Edit del SO no funcionan de igual forma en los Edit (TextBox) de VB.

Si el proggie tiene un Edit nativo, podrias hacer lo mismo que en tu ejemplo. Sino, vas a tener que buscar la parte donde asigna la hotkey.

Para ver la clase, usa Spy++ o algo parecido.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


aguml

Mmmm, hay algo que no entiendo, lo que tiene que copiar está dentro de un AfxOleControl42 pero no se como mirar eso que dices. Si no estoy equivocado, ese control en realidad es una especie de contenedor pero si miro en Spy++ o en Win Explorer veo que no hay nada dentro aunque estoy viendo que hay unos dibujos (es curioso pero los TImage, o los TShape de Builder tampoco aparecen).
Con GetWindowLongPtr puedo ver que el componente tiene estos Style:
WS_CHILD
WS_CLIPCHILDREN
WS_CLIPSIBLINGS
WS_HSCROLL
WS_VISIBLE
WS_VSCROLL

En las demás pestañas del Spy++ hay mas info pero no creo que sea muy relevante para este caso.
No quiero copiar texto sino formas y textos que puedo seleccionar haciendo clic en ellas.

MCKSys Argentina

Quizas podrias probar usando SendMessage y esto: http://msdn.microsoft.com/en-us/library/windows/desktop/ms649011(v=vs.85).aspx

Quizas el runtime lo handlee directamente y copie el contenido del control en el clipboard...

Con probar no se pierde nada...  ;D

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


aguml

me pierdo con eso que indicas pero veo que usa algo como stringcbcopy y en este caso hay imagenes tambien. Ademas, sendmessage necesita el handle ¿Le sirve el hwnd del control?

MCKSys Argentina

Cita de: aguml en  7 Junio 2013, 23:39 PM
Ademas, sendmessage necesita el handle ¿Le sirve el hwnd del control?

Si
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


aguml

#9
No se hacer eso tío, además, ¿para eso ese programa tendría que enviar las cosas al portapapeles antes? es que no me entero de na.

Edito: he estado mirando si podia copiar al portapapeles desde mi aplicacion y he "fabricado" esto:

//La siguiente linea es necesaria para evitar el error de compilacion
//'E2015 Ambiguity between 'TBitmap' and 'Windows::TBitmap'
#define TBitmap Graphics::TBitmap

void CopyImageToClipboard(HANDLE hwnd, int Width, int Height, unsigned int CopyImageFormat, unsigned int cbFormat)
{
       //ENVIANDO UNA IMAGEN BMP AL PORTAPAPELES
       //Creamos una copia de la imágen ya escalada y la asignamos a un Handle
       HANDLE hNew = CopyImage(hwnd,
                               CopyImageFormat,
                               Width, //NULL para no escalar el ancho
                               Height, //NULL para no escalar el alto
                               LR_COPYRETURNORG);

       //Abrimos el portapapeles pasandole el hwnd de
       //nuestra aplicación
       OpenClipboard(Application->Handle);

       //Borramos el contenido del portapapeles con
       //EmptyClipboard para luego pegar la imagen
       EmptyClipboard();

       //Pegamos la imagen con el Api SetClipBoardData _
       //indicando que es un mapa de bits y le enviamos _
       //el handle de la imagen obtenido anteriormente
       SetClipboardData(cbFormat, (long*)hNew);

       //Cerramos el portapapeles usando el Api CloseClipboard
       CloseClipboard();
       //FIN DEL ENVIO
}

void PasteImageToClipboard(TBitmap *picture, unsigned int cbFormat)
{
       //COPIANDO LA IMAGEN DESDE EL PORTAPAPELES
       //Abrimos el portapapeles pasandole el hwnd de
       //nuestra aplicación
       OpenClipboard(Application->Handle);

       //Obtenemos el contenido con GetClipboardData y
       //se lo asignamos al Image2
       picture->Handle = GetClipboardData(cbFormat);

       //Cerramos el portapapeles usando el Api CloseClipboard
       CloseClipboard();
       //FIN DE LA RECEPCION
}


y asi las uso:

CopyImageToClipboard(hwnd, Form1->Image2->Width, Form1->Image2->Height, IMAGE_BITMAP, CF_BITMAP);
PasteImageToClipboard(Form1->Image2->Picture->Bitmap, CF_BITMAP);


El problema es que para que funcione necesito obtener antes el handle de la imagen que seleccione y lo mas que consigo es el handle del componente GRRRRRRRRR.