Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - aguml

#71
Es el visustin 7: http://www.aivosto.com/getshareware.html  es un demo con mayusculas ya que le falta codigo y no puede hacerse full pero a falta de esto lo tengo muy avanzado porque ya puedo exportar a word, a powerpoint, copiar al portapapeles, imprimir, guardar pero todo eso lo hago con imagenes bmp pero lo que quiero es que si le das a editar te deja modificar todo pero no te deja guardar los cambios, ni copiar ni nada. El problema es el editor. A ver si puedes mirarlo y me dices a ver que solucion ves. Por cierto, usa una ocx para crear el organigrama la cual es de paga y pude ver el serial de registro jajaja. A ver si podemos darle a esto y ya lo tumbamos del todo jejeje.
#72
El titulo es un poco lioso pero a ver si puedo explicarlo. Mi aplicacion tiene un TScrollBox y dentro un TImage el cual puedo mover de posicion y la idea es que al ampliar la imagen o encogerla se mantenga el centro de la parte de la imagen que se ve con el centro del scrollbox. Tengo esto:

int centroAncho = Image2->Left / 2 + Image2->Width / 2; //Centro del ancho de la imagen
int centroAlto = Image2->Top / 2 + Image2->Height / 2; //Centro del alto de la imagen
int centroScrollAncho = ScrollBox2->Width / 2; //Centro del ancho del ScrollBox
int centroScrollAlto = ScrollBox2->Height / 2; //Centro del alto del scrollbox


Entonces se me ocurrio que si sustituyo "centroAncho" por "centroScrollAncho" y luego despejo la ecuacion para obtener Image2->Left pues ya lo tendria y lo mismo para el Top y lo hice asi:

Image2->Left = (centroScrollAncho - Image2->Width / 2) * 2;
Image2->Top = (centroScrollAlto - Image2->Height / 2) * 2;


Algo hay mal o en el despeje o en el planteamiento porque no obtengo lo que deseo.
La imagen la muevo por dentro del scrollbox y no permito que el borde inferior de la imagen suba mas arriba del borde inferior del scrollbox excepto cuando la imagen tenga un alto menor que el del scrollbox y lo mismo con el borde derecho. Le sumo el alto de la imagen y el ancho porque si es mas grande que el scrollbox y la arrastro hacia arriba su Top será negativo y creo que asi obtengo la parte visible de la imagen pero algo falla en mi planteamiento ¿podeis ayudarme con eso?
#73
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.
#74
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?
#75
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.
#76
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.
#77
¿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.
#78
Pues siguiendo el modo en que hace en la MSDN donde se capturaba toda la pantalla lo he modificado para que capture el contenido de un componente pero lo que realmente hace es capturar el tamaño del componente independientemente de lo que haya, o sea, si encima de la ventana que tiene el componente hay mas ventanas pues captura el rectangulo del tamaño del componente y captura todo lo que haya en ese area incluido trozos de ventanas y todo. Ademas lo que hace este codigo es redimensionar la imagen al tamaño de destino y yo no quiero redimensionar la imagen sino que me gustaria poder capturarla tal cual y luego poder meterla en un TImage que está dentro de un TScrollBox. Os adjunto el codigo del proyecto.
A ver si podeis ayudarme que ando muy perdido en esto y lo necesito para el tema del loader.
Otro detalle, he colocado un Timage en el form de mi aplicacion y al verlo en WinExplorer aparece el boton pero no aparece el TImage ¿como puede ser eso? ¿como puedo obtener entonces el hwnd del TImage sin saber su clase?

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

void done(HBITMAP hbmScreen, HDC hdcMemDC, HDC hdcScreen, HWND hWnd, HDC hdcWindow);
int CaptureAnImage(HWND hWnd, HWND MyBitmap);
//--------------------------------------------------------------------------

BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{

        char clase[256];

        //memset(clase,0, sizeof(clase));
        GetClassName(hwnd, clase, sizeof(clase));
        if(strcmp(clase, "AfxOleControl42") == 0)
        {
                HWND MyVentana = FindWindow(NULL, "Form1");

                int retval = CaptureAnImage(hwnd, MyVentana);
                return FALSE;
        }
        return TRUE;
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        HWND hwnd;

        hwnd = FindWindow("ThunderRT6FormDC", "Visustin Editor");

        if(!hwnd)
                MessageBox(Application->Handle,"No se encuentra abierto el editor de Visustin.", "Error", MB_OK | MB_APPLMODAL | MB_ICONERROR);
        else
                EnumChildWindows(hwnd, (WNDENUMPROC)EnumChildProc, 0);
}
//---------------------------------------------------------------------------

int CaptureAnImage(HWND hWnd, HWND MyBitmap)
{
    HDC hdcScreen;
    HDC hdcWindow;
    HDC hdcMemDC = NULL;
    HBITMAP hbmScreen = NULL;
    BITMAP bmpScreen;

    // Retrieve the handle to a display device context for the client
    // area of the window.
    hdcScreen = GetDC(hWnd);
    hdcWindow = GetDC(MyBitmap);

    // Create a compatible DC which is used in a BitBlt from the window DC
    hdcMemDC = CreateCompatibleDC(hdcWindow);

    if(!hdcMemDC)
    {
        MessageBox(hWnd, "CreateCompatibleDC has failed", "Failed", MB_OK);
        done(hbmScreen, hdcMemDC, hdcScreen, hWnd, hdcWindow);
        return 1;
    }

    // Get the client area for size calculation
    RECT rcClient;
    GetClientRect(hWnd, &rcClient);

    //This is the best stretch mode
    SetStretchBltMode(hdcWindow,HALFTONE);

    //The source DC is the entire screen and the destination DC is the current window (HWND)
    if(!StretchBlt(hdcWindow,
               0,0,
               rcClient.right, rcClient.bottom,
               hdcScreen,
               0,0,
               GetSystemMetrics (SM_CXSCREEN),
               GetSystemMetrics (SM_CYSCREEN),
               SRCCOPY))
    {
        MessageBox(hWnd, "StretchBlt has failed", "Failed", MB_OK);
        done(hbmScreen, hdcMemDC, hdcScreen, hWnd, hdcWindow);
        return 1;
    }
   
    // Create a compatible bitmap from the Window DC
    hbmScreen = CreateCompatibleBitmap(hdcWindow, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top);
   
    if(!hbmScreen)
    {
        MessageBox(hWnd, "CreateCompatibleBitmap Failed", "Failed", MB_OK);
        done(hbmScreen, hdcMemDC, hdcScreen, hWnd, hdcWindow);
        return 1;
    }

    // Select the compatible bitmap into the compatible memory DC.
    SelectObject(hdcMemDC,hbmScreen);
   
    // Bit block transfer into our compatible memory DC.
    if(!BitBlt(hdcMemDC,
               0,0,
               rcClient.right-rcClient.left, rcClient.bottom-rcClient.top,
               hdcWindow,
               0,0,
               SRCCOPY))
    {
        MessageBox(hWnd, "BitBlt has failed", "Failed", MB_OK);
        done(hbmScreen, hdcMemDC, hdcScreen, hWnd, hdcWindow);
        return 1;
    }

    // Get the BITMAP from the HBITMAP
    GetObject(hbmScreen,sizeof(BITMAP),&bmpScreen);
     
    BITMAPFILEHEADER   bmfHeader;   
    BITMAPINFOHEADER   bi;
     
    bi.biSize = sizeof(BITMAPINFOHEADER);   
    bi.biWidth = bmpScreen.bmWidth;   
    bi.biHeight = bmpScreen.bmHeight; 
    bi.biPlanes = 1;   
    bi.biBitCount = 32;   
    bi.biCompression = BI_RGB;   
    bi.biSizeImage = 0; 
    bi.biXPelsPerMeter = 0;   
    bi.biYPelsPerMeter = 0;   
    bi.biClrUsed = 0;   
    bi.biClrImportant = 0;

    DWORD dwBmpSize = ((bmpScreen.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmpScreen.bmHeight;

    // Starting with 32-bit Windows, GlobalAlloc and LocalAlloc are implemented as wrapper functions that
    // call HeapAlloc using a handle to the process's default heap. Therefore, GlobalAlloc and LocalAlloc
    // have greater overhead than HeapAlloc.
    HANDLE hDIB = GlobalAlloc(GHND,dwBmpSize);
    char *lpbitmap = (char *)GlobalLock(hDIB);   

    // Gets the "bits" from the bitmap and copies them into a buffer
    // which is pointed to by lpbitmap.
    GetDIBits(hdcWindow, hbmScreen, 0,
        (UINT)bmpScreen.bmHeight,
        lpbitmap,
        (BITMAPINFO *)&bi, DIB_RGB_COLORS);

    // A file is created, this is where we will save the screen capture.
    HANDLE hFile = CreateFile("captureqwsx.bmp",
        GENERIC_WRITE,
        0,
        NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL, NULL);
   
    // Add the size of the headers to the size of the bitmap to get the total file size
    DWORD dwSizeofDIB = dwBmpSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

    //Offset to where the actual bitmap bits start.
    bmfHeader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);
   
    //Size of the file
    bmfHeader.bfSize = dwSizeofDIB;
   
    //bfType must always be BM for Bitmaps
    bmfHeader.bfType = 0x4D42; //BM   

    DWORD dwBytesWritten = 0;
    WriteFile(hFile, (LPSTR)&bmfHeader, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL);
    WriteFile(hFile, (LPSTR)&bi, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL);
    WriteFile(hFile, (LPSTR)lpbitmap, dwBmpSize, &dwBytesWritten, NULL);
   
    //Unlock and Free the DIB from the heap
    GlobalUnlock(hDIB);   
    GlobalFree(hDIB);

    //Close the handle for the file that was created
    CloseHandle(hFile);

    done(hbmScreen, hdcMemDC, hdcScreen, hWnd, hdcWindow);

    return 0;
}

void done(HBITMAP hbmScreen, HDC hdcMemDC, HDC hdcScreen, HWND hWnd, HDC hdcWindow)
{
        //Clean up
    DeleteObject(hbmScreen);
    DeleteObject(hdcMemDC);
    ReleaseDC(NULL,hdcScreen);
    ReleaseDC(hWnd,hdcWindow);
}

#79
Pues estoy haciendo una aplicacion la cual busca la ventana de otra aplicacion la cual tiene un AfxOleControl42 y dentro tenemos una serie de objetos (no se bien que son lo que hay dentro pero puedo modificar tanto los textos como dimensiones). Una vez encontrada la ventana, con EnumChildWindows busco el AfxOleControl42 para obtener un hwnd. Ahora bien, segun me comentaron para obtener su contenido tendria que lidiar con funciones como GetDC, GetObject, SetObject, CreateCompatibleDC, GetWindowDC,... La idea es obtener un bitmap del contenido de dicho componente pero no doy con la forma de hacerlo. ¿Me podeis ayudar a solucionarlo?
#80
yo ya he intentado de todo y no hay manera, se ve que en symbian lo han hecho diferente y no vale ni el whatsapp xtract ni el whatsapp decrypt ni nada de lo que he encontrado por la red.
Además de que la cifrado que se usa lo que hace es ir descifrando de 16 en 16 bytes por lo que tiene que ser el largo del archivo múltiplo de 16 y estos no lo son. He probado a borrar algunos de los últimos bytes del final para que fuese su tamaño múltiplo de 16 y entonces con un código en python que encontré si lo descifro aparentemente pero cuando intento abrirlo con sqlite me dice que no es una base de datos o está cifrado. Entonces hice también el código para cifrar ya que usa una cifrado simétrica usando la misma clave para ambos procesos y cree un archivo de texto plano que su largo fuera múltiplo de 16 y lo encripté sin problemas y luego lo desencripté y obtuve el texto correctamente con lo cual el código que usé va bien pero algo en esos msgstore.bak.x no cuadra. Nos tocará esperar y la verdad es que los hackers no se suelen meter mucho con symbian asi que lo tenemos crudo.