Récupération des pixels d'une fenêtre cachée

Le
sebcmoa
Bonjour,

Je vous expose mon problème :

- J'utilise la fonction glReadPixels sur une fenêtre invisible. Cela
me retourne bien les donnéesmais problème connucette fonction
est bien trop lente.

- J'essaie donc de récupérer les données de la fenêtre (de son DC)
d'une manière plus rapide. J'ai besoin d'avoir la valeur RGBA de
chaque pixel de la fenêtre pour faire des traitements dessus par la
suite.

- J'ai déjà tenté de créer une texture OPENGL et de récupérer l=
es
données comme cela mais les valeurs de hauteur et de largeur de ma
texture doivent être des puissances de deux et je ne connais pas par
avance la taille de ma fenêtre.

- Je me suis donc tourné vers l'API windows et getDIBits. getDIBits
n'est pas censé me retourner les valeurs de ALPHA mais un getDIBits +
un glReadPixels de la valeur ALPHA reste plus rapide qu'un
glReadPixels sur les données RGBA.
J'ai donc tenté le code suivant que j'ai trouvé en fouillant la
toile :

[CODE]
HDC hDCMem = CreateCompatibleDC(s->native.window.hDC);
HBITMAP hBmp = NULL;
HGDIOBJ hOld;
HDC hDC;
LRESULT res;

RECT rect;
int temp,i,j;
unsigned long * temp_pix = pixels;

BITMAPINFO bitmap_info;

bitmap_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmap_info.bmiHeader.biWidth = width;
bitmap_info.bmiHeader.biHeight = -(signed)height;
bitmap_info.bmiHeader.biPlanes = 1;
bitmap_info.bmiHeader.biBitCount = 32;
bitmap_info.bmiHeader.biCompression = BI_BITFIELDS;
bitmap_info.bmiHeader.biXPelsPerMeter = 0;
bitmap_info.bmiHeader.biYPelsPerMeter = 0;
bitmap_info.bmiHeader.biClrUsed = 0;
bitmap_info.bmiHeader.biClrImportant = 0;
GetWindowRect(s->native.window.hWND, & rect);

hBmp = CreateCompatibleBitmap(hDCMem,width,height);
hOld = SelectObject(hDCMem, hBmp);

GetDIBits(hDCMem,hBmp,0,height,NULL,&bitmap_info,DIB_RGB_COLORS);

res = SendMessage(s->native.window.hWND, WM_PRINT, (WPARAM)
hDCMem, PRF_CHILDREN | PRF_CLIENT);

res = GetDIBits(hDCMem,hBmp,
0,height,pixels,&bitmap_info,DIB_RGB_COLORS);

SelectObject(hDCMem, hOld);
DeleteObject(hDCMem);
[/CODE]

Mais je n'obtiens aucune donnée

Quelqu'un aurait-il une petite idée de comment récupérer les donnée=
s
d'une fenêtre cachée ou plutôt les pixels du DC associé) ?

Merci par avance.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Christian ASTOR
Le #17944871
wrote:

- Je me suis donc tourné vers l'API windows et getDIBits. getDIBits
n'est pas censé me retourner les valeurs de ALPHA mais un getDIBits +
un glReadPixels de la valeur ALPHA reste plus rapide qu'un
glReadPixels sur les données RGBA.
J'ai donc tenté le code suivant que j'ai trouvé en fouillant la
toile :



Hormis que ce n'est pas compilable, il y a des bugs comme
CreateCompatibleBitmap() qui ne doit pas se faire sur un Memory DC
Pour les fenêtres non visibles, PrintWindow() fonctionne plus souvent
que WM_PRINT*
Pour GetDIBits() et les DIB, voir les ex de la PSDK dans
SamplesMultimediaGdi (WinCap32, ...)
sebcmoa
Le #17945261
> Hormis que ce n'est pas compilable, il y a des bugs comme
CreateCompatibleBitmap() qui ne doit pas se faire sur un Memory DC
Pour les fenêtres non visibles, PrintWindow() fonctionne plus souvent
que WM_PRINT*
Pour GetDIBits() et les DIB, voir les ex de la PSDK dans
SamplesMultimediaGdi (WinCap32, ...)




Le "pas compilable", bien entendu pour pouvoir tester j'ai adapté le
code pour que cela marche...

Pour le "PrintWindow" j'ai un soucis car en ajoutant l'include
windows.h & en linkant avec user32.lib
cela ne passe pas ... j'ai même tenté avec winspool.h/lib...mais
toujours rien ça ne passe pas à la
compilation...d'où le SendMessage que j'ai laissé...

Par contre les GetDIBits je ne vois pas torp trop le soucis...
sebcmoa
Le #17945511
On 24 nov, 14:38, wrote:
> Hormis que ce n'est pas compilable, il y a des bugs comme
> CreateCompatibleBitmap() qui ne doit pas se faire sur un Memory DC
> Pour les fenêtres non visibles, PrintWindow() fonctionne plus souvent
> que WM_PRINT*
> Pour GetDIBits() et les DIB, voir les ex de la PSDK dans
> SamplesMultimediaGdi (WinCap32, ...)

Le "pas compilable", bien entendu pour pouvoir tester j'ai adapté le
code pour que cela marche...

Pour le "PrintWindow" j'ai un soucis car en ajoutant l'include
windows.h & en linkant avec user32.lib
cela ne passe pas ... j'ai même tenté avec winspool.h/lib...mais
toujours rien ça ne passe pas à la
compilation...d'où le SendMessage que j'ai laissé...

Par contre les GetDIBits je ne vois pas torp trop le soucis...



PrintWindow obtenu avec un GetProcAddress...ça ça passe mais toujours
que des pixels noirs après le GetDIBits...
Christian ASTOR
Le #17950131
wrote:

On 24 nov, 14:38, wrote:

Hormis que ce n'est pas compilable, il y a des bugs comme
CreateCompatibleBitmap() qui ne doit pas se faire sur un Memory DC
Pour les fenêtres non visibles, PrintWindow() fonctionne plus souvent
que WM_PRINT*
Pour GetDIBits() et les DIB, voir les ex de la PSDK dans
SamplesMultimediaGdi (WinCap32, ...)



Le "pas compilable", bien entendu pour pouvoir tester j'ai adapté le
code pour que cela marche...

Pour le "PrintWindow" j'ai un soucis car en ajoutant l'include
windows.h & en linkant avec user32.lib
cela ne passe pas ... j'ai même tenté avec winspool.h/lib...mais
toujours rien ça ne passe pas à la
compilation...d'où le SendMessage que j'ai laissé...

Par contre les GetDIBits je ne vois pas torp trop le soucis...




PrintWindow obtenu avec un GetProcAddress...ça ça passe mais toujours
que des pixels noirs après le GetDIBits...



PrintWindow() dépend de _WIN32_WINNT
Si je teste un DDB avec, par ex, la Calculatrice (sans tenir compte du
cas où elle est minimizée (SetParent(), ...)) :

HWND hWndDest = FindWindow(L"SciCalc", NULL);
RECT rect;
GetWindowRect(hWndDest, &rect);
int nWidth = rect.right - rect.left;
int nHeight = rect.bottom - rect.top;
HDC hScreenDC = GetDC(NULL);
HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, nWidth, nHeight);
HDC hDCMem = CreateCompatibleDC(hScreenDC);
HBITMAP hBitmapOld = (HBITMAP)SelectObject(hDCMem, hBitmap);
PrintWindow(hWndDest, hDCMem, 0);
// Test si hBitmap est OK en la copiant sur l'écran
BitBlt(hScreenDC, 0, 0, nWidth, nHeight, hDCMem, 0, 0, SRCCOPY);
// Releases...
SelectObject(hDCMem, hBitmapOld);
DeleteDC(hDCMem);
DeleteObject(hBitmap);
ReleaseDC(NULL, hScreenDC);
sebcmoa
Le #17953181
On 24 nov, 21:49, Christian ASTOR
wrote:
> On 24 nov, 14:38, wrote:

>>>Hormis que ce n'est pas compilable, il y a des bugs comme
>>>CreateCompatibleBitmap() qui ne doit pas se faire sur un Memory DC
>>>Pour les fenêtres non visibles, PrintWindow() fonctionne plus souven t
>>>que WM_PRINT*
>>>Pour GetDIBits() et les DIB, voir les ex de la PSDK dans
>>>SamplesMultimediaGdi (WinCap32, ...)

>>Le "pas compilable", bien entendu pour pouvoir tester j'ai adapté le
>>code pour que cela marche...

>>Pour le "PrintWindow" j'ai un soucis car en ajoutant l'include
>>windows.h & en linkant avec user32.lib
>>cela ne passe pas ... j'ai même tenté avec winspool.h/lib...mais
>>toujours rien ça ne passe pas à la
>>compilation...d'où le SendMessage que j'ai laissé...

>>Par contre les GetDIBits je ne vois pas torp trop le soucis...

> PrintWindow obtenu avec un GetProcAddress...ça ça passe mais toujou rs
> que des pixels noirs après le GetDIBits...

PrintWindow() dépend de _WIN32_WINNT
Si je teste un DDB avec, par ex, la Calculatrice (sans tenir compte du
cas où elle est minimizée (SetParent(), ...)) :

HWND hWndDest = FindWindow(L"SciCalc", NULL);
RECT rect;
GetWindowRect(hWndDest, &rect);
int nWidth = rect.right - rect.left;
int nHeight = rect.bottom - rect.top;
HDC hScreenDC = GetDC(NULL);
HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, nWidth, nHeight);
HDC hDCMem = CreateCompatibleDC(hScreenDC);
HBITMAP hBitmapOld = (HBITMAP)SelectObject(hDCMem, hBitmap);
PrintWindow(hWndDest, hDCMem, 0);
// Test si hBitmap est OK en la copiant sur l'écran
BitBlt(hScreenDC, 0, 0, nWidth, nHeight, hDCMem, 0, 0, SRCCOPY);
// Releases...
SelectObject(hDCMem, hBitmapOld);
DeleteDC(hDCMem);
DeleteObject(hBitmap);
ReleaseDC(NULL, hScreenDC);





OK...m'ci...je vois où étaient mes soucis...mais bon cela n'a pas
résolu mon problème...la seule chose que j'ai réussi à récupére r pour
le moment c'est le bord de ma fenêtre cachée...mais pas le contenu...
Publicité
Poster une réponse
Anonyme