Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: bonmario - Settembre 12, 2018, 08:09:30 am

Titolo: Salvare "disegno" del form di un altro programma
Inserito da: bonmario - Settembre 12, 2018, 08:09:30 am
Ciao a tutti,
ho fatto un programma che esegue in fila queste operazioni:
1 - lancia un altro programma (fatto da altri e non più in manutenzione)
2 - lo porta in primo piano
3 - fa uno screenshot del desktop
4 - lo salva in un file jpg

A me infatti, in particolari momenti del giorno, serve "salvare" le informazioni emesse a video dal programma lanciato col punto 1.

Il tutto funziona bene, tranne che in una situazione: se quando gira il mio programma c'è attivo lo screensaver, lo screenshot salvato è completamente nero.

Mi chiedevo allora una cosa: avendo l'handle o il PID di un altro programma, è possibile "catturarne l'immagine del form" ???

Grazie in anticipo, Mario
Titolo: Re:Salvare "disegno" del form di un altro programma
Inserito da: xinyiman - Settembre 13, 2018, 04:38:18 pm
Purtroppo io non saprei aiutarti. Però così a naso direi che la cosa più facile è disabilitare lo screensaver. Così hai risolto il problema.
Titolo: Re:Salvare "disegno" del form di un altro programma
Inserito da: bonmario - Settembre 13, 2018, 04:43:59 pm
Ok, grazie !!

Ciao, Mario
Titolo: Re:Salvare "disegno" del form di un altro programma
Inserito da: Stilgar - Settembre 15, 2018, 08:25:01 am
Ciao.

In prima battuta potresti iniziare con l'handle del programma che lanci (le api di lancio dovrebbero restituirtelo). Ti fai dire qual è il hdc (l'handle di disegno) a partire dall'hwnd (a memoria sono gli acronimi usati in msdn).   
Potresti con queste informazioni
1) interagire con la finestra principale del processo figlio
2) associare all'hdc un canvas specifico a tuo uso e consumo.
Spedisci un messaggio di paint al programma figlio.
Tramite il canvas salvare l'immagine.

In seconda battuta.
Se vuoi estrarre direttamente le info, dovresti chiedere a tutti  i figli dell'hwnd principale di darti il loro testo associato  (una sorta di get text)

Questi due approcci si basano sul fatto che ci sia qualcosa di visibile e interrigabile.

Un terzo approccio potrebbe essere, se possibile, lancio il programma. Mando il segnale di elaborazione all'handle di base. Spedisco il messaggio che fa salvare su disco senza chiedere il nome da usare. Elaboro il file e lo elimino.
Stilgar
Titolo: Re:Salvare "disegno" del form di un altro programma
Inserito da: Stilgar - Settembre 15, 2018, 08:58:38 am
Riferimenti

https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getdc


https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowthreadprocessid

https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-enumwindows


Combinandole
https://stackoverflow.com/questions/11711417/get-hwnd-by-process-id-c

😊

Trovi il pezzo di codice
Codice: [Seleziona]
HWND g_HWND=NULL;
BOOL CALLBACK EnumWindowsProcMy(HWND hwnd,LPARAM lParam)
{
    DWORD lpdwProcessId;
    GetWindowThreadProcessId(hwnd,&lpdwProcessId);
    if(lpdwProcessId==lParam)
    {
        g_HWND=hwnd;
        return FALSE;
    }
    return TRUE;
}
EnumWindows(EnumWindowsProcMy,m_ProcessId);