Travailler sur un fenetre inactive

Résolu
Signaler
Messages postés
10
Date d'inscription
lundi 22 décembre 2008
Statut
Membre
Dernière intervention
9 mars 2009
-
Messages postés
10
Date d'inscription
lundi 22 décembre 2008
Statut
Membre
Dernière intervention
9 mars 2009
-
Bonjour à tous,

J'ai fait une application sous visual c++ qui permet de travailler sur une fenêtre internet. Elle permet d'automatiser des taches, l'application clique et/ou écris automatiquement en fonction de la couleur de certains pixels de la fenetre. Ca marche bien mais je suis obligé de laisser ma fenetre internet au premier plan.
Je viens à vos lumières parce que je voudrais que mon application puisse travailler sur la page internet en arrière plan.

Pour ca j'ai besoin de pistes sur deux points,
1/ Comment capturer la couleur de pixels d'une fenetre en arriere plan?
Est ce que je peux faire un genre de capture d'ecran d'une fenetre non visible?

2/ Comment puis-je cliquer sur des elements d'une fenetre en arriere plan?
Pour l'ecriture je pensais passer par des messages, est ce que ca vous parait judicieux? est ce que ca marche aussi pour les clics souris?

7 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
Salut,

1/ Tu peux essayer WM_PRINTCLIENT. Mais ça risque de ne pas fonctionner. Je ne crois pas qu'il y ait de méthodes miracle pour récupérer une impression écran 5ou un pixel...) d'une application cachée par une autre.

2/ Oui, PostMessage. Tu devrais trouver les messages ici. Tu peux utiliser spy++ fourni avec Visual Studio pour voir les messages postés à une application sur laquelle tu cliques.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,

Il est possible de capturer une fenêtre cachée par une autre en utilisant PrintWindow().
Elle prend comme 2ème paramètre un HDC destination sur lequel sera
dessinée la fenêtre cible. Ce HDC sera de préférence en mémoire. Ainsi,
on peut récupérer les couleurs des pixels sans problème. Exemple:
HWND fenetrecible=FindWindow(0,"Titre de la fenêtre");

HDC screendc=GetDC(0);

HDC memdc=CreateCompatibleDC(screendc);

RECT rect;

GetWindowRect(fenetrecible,&rect);

HBITMAP bitmap=CreateCompatibleBitmap(screendc,rect.right-rect.left,rect.bottom-rect.top);

ReleaseDC(0,screendc);

HBITMAP oldbitmap=(HBITMAP)SelectObject(memdc,bitmap);

BOOL ret=PrintWindow(fenetrecible,memdc,0);

COLORREF pixel=GetPixel(memdc,28,28);

SelectObject(memdc,oldbitmap);

DeleteObject(bitmap);

DeleteDC(memDC);

Pour le clic sur un bouton, il faudra d'abord récupérer son HWND pour lui envoyer le message BM_CLICK.
Messages postés
10
Date d'inscription
lundi 22 décembre 2008
Statut
Membre
Dernière intervention
9 mars 2009

Et bah merci les gars! Vous avez été rapide et clair, c'est parfait. Je vais tester ces petites fonctions et je vous tiens au courant.
Messages postés
10
Date d'inscription
lundi 22 décembre 2008
Statut
Membre
Dernière intervention
9 mars 2009

ok alors premier bilan au sujet de la capture de ma page. J'ai testé les fonctions pour capturer ma fenêtre avec :

int couleur_pixel(int v, int w)
{
    LPCTSTR moz = "MozillaUIWindowClass";
    HWND handle = FindWindowEx(0,0,moz,0);
    HDC hdc = GetDC(NULL);
    HDC memdc = CreateCompatibleDC(hdc);
    RECT rect;
    GetWindowRect(handle,&rect);
    HBITMAP bitmap=CreateCompatibleBitmap(hdc,rect.right-rect.left,rect.bottom-rect.top);
    ReleaseDC(NULL,hdc);
    HBITMAP oldbitmap = (HBITMAP)SelectObject(memdc,bitmap);

    //PrintWindow(handle,memdc,0);
    //SendMessage(handle,WM_PRINTCLIENT, (WPARAM) memdc,NULL);

    COLORREF rgb = GetPixel(memdc, v, w);  
    SelectObject(memdc,oldbitmap);
    DeleteObject(bitmap);
    DeleteDC(memdc);
    return rgb;
}

Racpp, quand je compile avec PrintWindow, j'ai l'erreur de compilation suivante: error C3861: 'PrintWindow' : identificateur introuvable.
Le "handle" est bon, je m'en servais avant avec succés. Le memdc m'a l'air bon aussi et le dernier paramètre ne change rien qu'il vaille 0 ou NULL. Je bloque la dessus. C'est probablement une erreur bête mais je la vois pas!

Rt15, quand j'utilise WM_PRINTCLIENT, ca compile, sauf que j'obtiens une image bmp noir sur toute la dimension de ma fenetre... J'ai cherché ce problème avec google, j'ai trouvé que ca pourrait marché "en récupérant la 2ème fenêtre "MozillaWindowClass"
et en la mettant par ex dans un Static (SetParent()) puis
PrintWindow() sur la fenêtre parente du Static." J'essaye ca mais ca complique bien les choses, j'ai pas tout compris, ca prend du temps a mettre en oeuvre. Est ce que ca parait être une piste valide?

Sinon j'ai oublié de préciser, je travaille avec Visual C++ 2005 Express. Je suis sous windows xp sp3. La bibliotheque user32 est linké au projet, le header windows.h déclaré...
Messages postés
10
Date d'inscription
lundi 22 décembre 2008
Statut
Membre
Dernière intervention
9 mars 2009

Je viens de remarquer que le pixel (v,w) de l'image bmp obtenu est blanc quand ma fenêtre internet est réduite ou hors du pixel (v,w).
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Pour que ton compilateur reconnaisse PrintWindow() mets ceci avant tes includes:
#define  _WIN32_WINNT 0x0501
J'avais oublié de le préciser.
Messages postés
10
Date d'inscription
lundi 22 décembre 2008
Statut
Membre
Dernière intervention
9 mars 2009

merci racpp, tu as raison, printwindow est maintenant reconnu.
J'ai le même problème que pour wm_printclient, je ne vois qu'un écran noir mais j'y travaille.