Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - GDI: catturare screenshot con incluso il puntatore mouse
Forum - C/C++ - GDI: catturare screenshot con incluso il puntatore mouse

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 0:27
Sabato, 17/04/2010
Salve a tutti. Ho riscritto alcune funzioni trovate su internet per salvare una screenshot del desktop, il problema è che nella screenshot non è incluso il cursore del mouse. Ho trovato quest'articolo
http://www.aspfree.com/c/a/Windows-Scripting/Screen-Captur ...
e mi chiedevo se qualcuno più competente riesce a individuare, qualora fosse presente al suo interno, il codice per aggiungere il cursore al bitmap. Vi posto qui sotto il codice delle mie funzioni

Codice sorgente - presumibilmente C/C++

  1. void saveBitmap(char *fileName,HBITMAP hBitmap) {
  2.     FILE* fp = NULL;
  3.     LPVOID pBuf = NULL;
  4.     BITMAPINFO bmpInfo;
  5.     BITMAPFILEHEADER bmpFileHeader;
  6.     HDC hdc = GetDC(NULL);
  7.         ZeroMemory(&bmpInfo,sizeof(BITMAPINFO));
  8.         bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  9.         GetDIBits(hdc,hBitmap,0,0,NULL,&bmpInfo,DIB_RGB_COLORS);
  10.         if(bmpInfo.bmiHeader.biSizeImage <= 0) {
  11.                 bmpInfo.bmiHeader.biSizeImage =
  12.                                 bmpInfo.bmiHeader.biWidth *
  13.                                 abs(bmpInfo.bmiHeader.biHeight) *
  14.                                 (bmpInfo.bmiHeader.biBitCount + 7)/8;
  15.         }
  16.         if((pBuf = malloc(bmpInfo.bmiHeader.biSizeImage)) == NULL) {
  17.                 printf("Unable to Allocate Bitmap Memory\n");
  18.         } else {
  19.                 bmpInfo.bmiHeader.biCompression = BI_RGB;
  20.                 GetDIBits(hdc,hBitmap,0,bmpInfo.bmiHeader.biHeight,pBuf, &bmpInfo, DIB_RGB_COLORS);
  21.                 if((fp = fopen(fileName,"wb")) == NULL){
  22.                         printf("Unable to Create Bitmap File\n");
  23.                 } else {
  24.                         bmpFileHeader.bfReserved1 = 0;
  25.                         bmpFileHeader.bfReserved2 = 0;
  26.                         bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + bmpInfo.bmiHeader.biSizeImage;
  27.                         bmpFileHeader.bfType = 19778; //Equivale a scrivere bmpFileHeader.bfType='MB';
  28.                         bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  29.                         fwrite(&bmpFileHeader, sizeof(BITMAPFILEHEADER), 1, fp);
  30.                         fwrite(&bmpInfo.bmiHeader, sizeof(BITMAPINFOHEADER), 1, fp);
  31.                         fwrite(pBuf, bmpInfo.bmiHeader.biSizeImage, 1, fp);
  32.                 }
  33.         }
  34.     if(hdc) {
  35.         ReleaseDC(NULL,hdc);
  36.     }
  37.     if(pBuf) {
  38.         free(pBuf);
  39.     }
  40.     if(fp) {
  41.         fclose(fp);
  42.     }
  43. }
  44.  
  45. void captureScreen(char* fileName){
  46.     int  nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
  47.     int  nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
  48.     HWND hDesktopWnd = GetDesktopWindow();
  49.     HDC  hDesktopDC = GetDC(hDesktopWnd);
  50.     HDC  hCaptureDC = CreateCompatibleDC(hDesktopDC);
  51.     HBITMAP hCaptureBitmap = CreateCompatibleBitmap(hDesktopDC, nScreenWidth, nScreenHeight);
  52.     SelectObject(hCaptureDC,hCaptureBitmap);
  53.     BitBlt(hCaptureDC,0,0,nScreenWidth,nScreenHeight,hDesktopDC,0,0,SRCCOPY);
  54.     saveBitmap(fileName, hCaptureBitmap);
  55.     ReleaseDC(hDesktopWnd,hDesktopDC);
  56.     DeleteDC(hCaptureDC);
  57.     DeleteObject(hCaptureBitmap);
  58. }


Ultima modifica effettuata da robrock80 il 17/04/2010 alle 0:29
PM Quote
Avatar
gforce (Normal User)
Rookie


Messaggi: 33
Iscritto: 21/01/2010

Segnala al moderatore
Postato alle 15:02
Sabato, 17/04/2010
se sei su windows non riuscirai mai a vedere il puntatore, se sei su linux funziona tutto alla perfezione

PM Quote
Avatar
gforce (Normal User)
Rookie


Messaggi: 33
Iscritto: 21/01/2010

Segnala al moderatore
Postato alle 15:03
Sabato, 17/04/2010
su windows non cattura mail il puntatore, su linux si ...

PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 15:26
Sabato, 17/04/2010
Eppure c'è VncTight
http://www.tightvnc.com/
che ci riesce. Ho scaricato il progetto da source forge, sono andato anche in debug (ho visto che cattura i bitmap con GDI), ma il progetto è veramente complesso e non sono riuscito a trovare la documentazione

PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 21:42
Sabato, 17/04/2010
Alla fine dopo un bel pò di sbattimenti sono riuscito a sovrapporre 2 immagini: una è lo screen appena catturato e l'altra è un'immagine, caricata dalla resources, di un puntatore grafico che viene inserito nell'altra immagine in base alle coordinate del mouse correnti.
Ecco il codice
Codice sorgente - presumibilmente C#

  1. int i = 0;
  2.         while (i != 24) {
  3.                 HBITMAP bitmap1 = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP1));
  4.             BITMAPINFO bmpInfo1;
  5.             ZeroMemory(&bmpInfo1,sizeof(BITMAPINFO));
  6.             bmpInfo1.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  7.             HDC hdc1 = CreateCompatibleDC(NULL);
  8.             GetDIBits(hdc1,bitmap1,0,0,NULL,&bmpInfo1,DIB_RGB_COLORS);
  9.                 SelectObject(hdc1,bitmap1);
  10.  
  11.  
  12.                 int  nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
  13.                 int  nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
  14.                 HWND hDesktopWnd = GetDesktopWindow();
  15.                 HDC  hDesktopDC = GetDC(hDesktopWnd);
  16.                 HDC  hdc2 = CreateCompatibleDC(hDesktopDC);
  17.                 HBITMAP bitmap2 = CreateCompatibleBitmap(hDesktopDC, nScreenWidth, nScreenHeight);
  18.                 SelectObject(hdc2,bitmap2);
  19.                 BitBlt(hdc2,0,0,nScreenWidth,nScreenHeight,hDesktopDC,0,0,SRCCOPY);
  20.  
  21.                 POINT ptCursorPos;
  22.                 GetCursorPos(&ptCursorPos);
  23.  
  24.                 BitBlt(hdc2,ptCursorPos.x,ptCursorPos.y,bmpInfo1.bmiHeader.biWidth,bmpInfo1.bmiHeader.biHeight,hdc1,0,0,SRCCOPY);
  25.                 SelectObject(hdc2,bitmap2);
  26.  
  27.                 char temp[10] = "prova";
  28.                 char buffer[6];
  29.                 itoa(i, buffer, 10);
  30.                 strcat(temp, buffer);
  31.                 strcat(temp, ".bmp");
  32.                 saveBitmap(temp, bitmap2);
  33.  
  34.                 ReleaseDC(hDesktopWnd,hDesktopDC);
  35.                 DeleteDC(hdc1);
  36.                 DeleteDC(hdc2);
  37.                 DeleteObject(bitmap1);
  38.                 DeleteObject(bitmap2);
  39.                 i++;
  40.         }




Ora manca l'effetto trasparenza per rendere decente il puntatore del mouse...

PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 14:19
Domenica, 18/04/2010
Qualcuno sà come sovrappore 2 immagini di cui una monocromatica e fare in modo che la parte bianca o nera della seconda non venga copiata?

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 12:19
Mercoledì, 21/04/2010

che bello! ora il trojan si fanno un pezzo alla volta sul forum!

la frase più scritta da robrock: "ho trovato ma non sono riuscito, qualcuno mi aiuta?"

PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 17:25
Mercoledì, 21/04/2010
Testo quotato

Postato originariamente da HeDo:


che bello! ora il trojan si fanno un pezzo alla volta sul forum!

la frase più scritta da robrock: "ho trovato ma non sono riuscito, qualcuno mi aiuta?"




Me pareva strano che stàvolta non rosicavi... Chiederò anche aiuto, quello è vero, ma guarda un pò quante righe di codice trovi in questo post di aiuto: fai la stessa cosa per gli altri miei post e alla fine ti rendi conto che di tutto quello che ho fatto fino ad adesso ho ricevuto aiuto in piccola parte rispetto all'enorme lavoro che ho fatto; ma va bene anche così: alla fine è sempre un modo di convidere una passione con altre persone. Ringrazio comunque tutti quelli mi hanno aiutato fino ad ora e spero che i miei post possano essere utili anche ad altre persone che sono di fronte agli stessi miei problemi e se qualcuno vuole il mio codice sarò lieto di condividerlo a differenza di tanta gente come te che si tiene per se le conoscenze anzichè trasferirle. E comunque quando chiedo aiuto significa che sul problema ci ho sbattuto la testa almeno un'ora o 2 e talvolta anche di +: in questo caso scrivo un post sul forum, ma continuo a cercare per conto mio.

P.S.: ringrazio TheKaneB: per fare quello che dovevo fare FreeImage rallentava il processo e alla fine ho usato libjpeg (ho visto che c'è una versione turbo, ma anche se sono riuscito a compilarla il processo crusha)

Ultima modifica effettuata da robrock80 il 21/04/2010 alle 17:40
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 17:59
Mercoledì, 21/04/2010
Testo quotato

Postato originariamente da robrock80:

Me pareva strano che stàvolta non rosicavi...




rosicando per cosa? perchè io non so chiedere aiuto così bene quanto lo fai te?

Testo quotato

Postato originariamente da robrock80:
Chiederò anche aiuto, quello è vero, ma guarda un pò quante righe di codice trovi in questo post di aiuto: fai la stessa cosa per gli altri miei post e alla fine ti rendi conto che di tutto quello che ho fatto fino ad adesso ho ricevuto aiuto in piccola parte rispetto all'enorme lavoro che ho fatto; ma va bene anche così: alla fine è sempre un modo di convidere una passione con altre persone.




hai chiesto aiuto più di 20 volte sul forum, e posso metterci una mano sul fuoco che almeno 15 di queste sono richieste sul trojan che stai sviluppando.
Stai facendo la cosa sbagliata nel modo sbagliato, la condivisione del codice con gli altri viene dopo le buone intenzioni, non dopo le cattive.

Testo quotato

Postato originariamente da robrock80:
Ringrazio comunque tutti quelli mi hanno aiutato fino ad ora e spero che i miei post possano essere utili anche ad altre persone che sono di fronte agli stessi miei problemi e se qualcuno vuole il mio codice sarò lieto di condividerlo a differenza di tanta gente come te che si tiene per se le conoscenze anzichè trasferirle.



ringrazia quelli che non hanno capito cosa stai facendo, magari ti risponderanno anche la prossima volta che ti bloccherai (cioè tipo stasera).

io non tengo le conoscenze che ho per me, sono sempre pronto ad aiutare il prossimo, sempre che il prossimo non sia arrivato a fregare un altro prossimo.

Testo quotato

Postato originariamente da robrock80:
E comunque quando chiedo aiuto significa che sul problema ci ho sbattuto la testa almeno un'ora o 2 e talvolta anche di +: in questo caso scrivo un post sul forum, ma continuo a cercare per conto mio



meno male, moltiplica 2 ore per richieste 15 e hai 30 ore di battute sulla testa.
ormai sarai un borg di star trek.

Testo quotato

Postato originariamente da robrock80:
P.S.: ringrazio TheKaneB: per fare quello che dovevo fare FreeImage rallentava il processo e alla fine ho usato libjpeg (ho visto che c'è una versione turbo, ma anche se sono riuscito a compilarla il processo crusha)



l'unica cosa che crusha sono le mie scatole ogni volta che posti un'altra richiesta sul trojan che stai sviluppando.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo