begin process at 2012 05 30 18:52:05
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

GUI

 > 

Travailler sur un fenetre inactive


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Travailler sur un fenetre inactive

vendredi 13 février 2009 à 17:33:24 | Travailler sur un fenetre inactive

kesakoa

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?


vendredi 13 février 2009 à 22:52:31 | Re : Travailler sur un fenetre inactive

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
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.


samedi 14 février 2009 à 22:32:14 | Re : Travailler sur un fenetre inactive

racpp

Administrateur CodeS-SourceS
Réponse acceptée !
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.
dimanche 15 février 2009 à 10:14:47 | Re : Travailler sur un fenetre inactive

kesakoa

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.
lundi 16 février 2009 à 11:01:45 | Re : Travailler sur un fenetre inactive

kesakoa

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é...
lundi 16 février 2009 à 11:33:21 | Re : Travailler sur un fenetre inactive

kesakoa

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).
lundi 16 février 2009 à 17:55:30 | Re : Travailler sur un fenetre inactive

racpp

Administrateur CodeS-SourceS
Pour que ton compilateur reconnaisse PrintWindow() mets ceci avant tes includes:
#define  _WIN32_WINNT 0x0501
J'avais oublié de le préciser.
jeudi 19 février 2009 à 01:21:02 | Re : Travailler sur un fenetre inactive

kesakoa

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.


Cette discussion est classée dans : plan, application, internet, fenetre, travailler


Répondre à ce message

Sujets en rapport avec ce message

Fermeture d'une fenetre [ par mindark ] Bonjour, j'aimerais que mon programme ferme une fenetre (un popup de Internet Explorer) automatiquement..J'ai essaye un faisant un FindWindow (NULL, " Quelle API pour mettre en premier plan une autre fenetre ? [ par Kheo ] Afin d'eviter d'avoir plusieurs instance de mon soft en memoire au tout debut j'effectue un FindWindow sur le titre de mon soft. S'il ne trouve rien j zoomer une dilog based application [ par Jean-luc ] bonjour à tous,je commence à peine en CPP et je voudrais savoir comment puis je rendre le fenetre de mon application en pleine ecran ?j'utilise une fe changer la fenetre de demarrge d'un application sous visual c++ [ par bobnet42 ] bonjour,j'ai creer un petit programme avec plusieurs fenetres mais je n'arrive pas a changer la fenetre sur laquel le programme doi se lancer ,i l se Probleme de fenetrage avec MFC VC++ [ par MaDC ] Salut tlm!J'dois faire une fenetre (identification) qui s'ouvre a l'initialisation de mon application MFC dans le constructeur de mon appliView. Pour Inserer image d'internet dans application c++ builder 6 [ par Vincman87 ] Bonjour a tousJe cherche le moyen d'inserer une image (JPG) stokée sur internet dans mon application C++. Je suis sous C++ Builder 6 de Borland si ca [win32] forcer une fenetre a rester en premier plan [ par tcok ] bonjour a tous,voila mon probleme, je developpe une application qui protege l'ordinateur sur lequel elle tourne, pendant l'absence de l'utilisateur, e Application windows sans fenetre [ par LordDaedalus ] BonjourJe cherche à faire une application windows en Visual CPP qui n'apparait pas à l'écran ni dans la barre de tache.Bref une appli Windows sans fen application en arriere plan [ par flatmax ] salutje viens de faire une application (dos) et j'aimerais que cette appli tourne en arriere-plan, sans avoir besoin d'etre active.je m'explique, j'ai fenetre internet dans fenetre c++ [ par chouanseb ] Je voudrais afficher une page internet dans une partie précise de ma fenetre c++, à des coordonées précises de ma fenetre c++.


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,484 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales