Travailler sur un fenetre inactive

Résolu
kesakoa Messages postés 10 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 9 mars 2009 - 13 févr. 2009 à 17:33
kesakoa Messages postés 10 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 9 mars 2009 - 19 févr. 2009 à 01:21
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

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
13 févr. 2009 à 22:52
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.
3
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
14 févr. 2009 à 22:32
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.
3
kesakoa Messages postés 10 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 9 mars 2009
15 févr. 2009 à 10:14
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.
0
kesakoa Messages postés 10 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 9 mars 2009
16 févr. 2009 à 11:01
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é...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kesakoa Messages postés 10 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 9 mars 2009
16 févr. 2009 à 11:33
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).
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
16 févr. 2009 à 17:55
Pour que ton compilateur reconnaisse PrintWindow() mets ceci avant tes includes:
#define  _WIN32_WINNT 0x0501
J'avais oublié de le préciser.
0
kesakoa Messages postés 10 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 9 mars 2009
19 févr. 2009 à 01:21
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.
0
Rejoignez-nous