IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

GetPixel appliqué à une fenetre cachée et/ou minimisée.


Sujet :

MFC

  1. #1
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Par défaut GetPixel appliqué à une fenetre cachée et/ou minimisée.
    Bonjour, voilà j'aimerai prendre la capture d'une zone d'une fenetre windows que je creer avec mon application même si celle ci est cachée par une autre ou minimisée.

    Principe:
    Je crée ma fenetre principale via createwindow....
    celle ci retourne donc un handle =hWnd ici.

    Si je veux prendre le pixe en position 5,5 je fait simplement:

    hwnd_DC=GetDC(hWnd); // pour obtenir le Device Context.
    couleur = Getpixel(hwnd_DC,5,5);

    Ensuite, je fait ca pour une certaine surface.
    Cela marche j'ai mon image capturée dans un tableau. Que je réaffiche
    juste a coté dans la meme fenetre.
    Donc une simple copie dune zone sur une autre dans la meme fenetre.

    Problème:
    Maintenant j'ouvre par exemple une fenetre d'un autre programme je la deplace sur mon application courant (ou il ya mon getpixel...) je n'ai plus ce qui se trouve dans ma fenetre de mon programme mais une genre d'ombre(en rouge) de l'application courante . de meme si je minimise mon application principale et que j'enregistre dans un fichier BMP, je n'ai plus rien il faut donc impérativement que ma fenetre soi ouverte et active.

    *Mais pourtant dans getpixel on défini le handleDC qui correspond au DC de la fenetre courante de l'application elle meme.

    J'aimerai pouvoir réaliser cela sur une fenetre non active (en background) ou meme minimisée.
    J'utilise cela avec une capture d'une webcam.
    Et je dois impérativement copier la capture dans un tableau.

    J'ai essayer avec la fonction GetDIBits, cela est pareil sauf que là je voi carrément une copie de la fenetre encour au lieu de son ombre en rouge.


    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    si la fenetre est cachée, je ne pense pas que ce soit possible.
    Désolé, je t'aide pas là ...

  3. #3
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    GetPixel récupère le pixel tel qu'il est. S'il est pas dessiné / visible ben...
    Toi tu veux dessiner la fenêtre ofscreen en fait. Je crois que tu peux y arriver avec WM_PRINT, sinon voir PrintWindow mais à partir de XP seulement...

  4. #4
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    GetPixel récupère le pixel tel qu'il est. S'il est pas dessiné / visible ben...
    Toi tu veux dessiner la fenêtre ofscreen en fait. Je crois que tu peux y arriver avec WM_PRINT, sinon voir PrintWindow mais à partir de XP seulement...
    Je vais voir, ca me pose pas de problèmes si je suis obligé d'implémenter autre chose que getpixel.

    MErci pr ton aide.

  5. #5
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    GetPixel récupère le pixel tel qu'il est. S'il est pas dessiné / visible ben...
    Toi tu veux dessiner la fenêtre ofscreen en fait. Je crois que tu peux y arriver avec WM_PRINT, sinon voir PrintWindow mais à partir de XP seulement...
    Merci oui mais ce que je comprend pas c'est que get pixel ce rapporte au DC de la fenetreX de notre application donc en théo ca serai bien que ca se raporte a la fenetreX et pas a ce qui surimprime la fenetreX.

    Je cherche après d'autres fonctions mais ca faisait 4 jours que je cherche sur le net avec getpixel sans trouver donc jme suis dis de poster .

    Merci encore jcontinue mais sans du getpixel .

  6. #6
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Par défaut
    Citation Envoyé par mikevador02
    Citation Envoyé par Aurelien.Regat-Barrel
    GetPixel récupère le pixel tel qu'il est. S'il est pas dessiné / visible ben...
    Toi tu veux dessiner la fenêtre ofscreen en fait. Je crois que tu peux y arriver avec WM_PRINT, sinon voir PrintWindow mais à partir de XP seulement...
    Merci oui mais ce que je comprend pas c'est que get pixel ce rapporte au DC de la fenetreX de notre application donc en théo ca serai bien que ca se raporte a la fenetreX et pas a ce qui surimprime la fenetreX.

    Je cherche après d'autres fonctions mais ca faisait 4 jours que je cherche sur le net avec getpixel sans trouver donc jme suis dis de poster .

    Merci encore jcontinue mais sans du getpixel .
    Encore une question, je dois implémenter une sendmessage(WM_PRINT..)
    dans ma boucle principale (winmain=> while(){sendmessage... ..} ) ?

    Et dans la procédure events -> case : WM_PRINT : un appel a la fonction de capture getpixel... ?

  7. #7
    Membre chevronné
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Par défaut
    Je sais pas si ça peut t'aider, mais moi, pour récupérer une bitmap d'une fenetre, je crée un CDC mémoire, j'y attache une bitmap de la taille de la fenetre et je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ::SendMessage(WM_PAINT, hDCMem, NULL);
    comme ça tu récupère la fenêtre même si il y as qqchose par dessus.

    J'ai pas essayé pour le minimise, c'est à vérifier...

  8. #8
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Par défaut
    Citation Envoyé par matazz
    Je sais pas si ça peut t'aider, mais moi, pour récupérer une bitmap d'une fenetre, je crée un CDC mémoire, j'y attache une bitmap de la taille de la fenetre et je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ::SendMessage(WM_PAINT, hDCMem, NULL);
    comme ça tu récupère la fenêtre même si il y as qqchose par dessus.

    J'ai pas essayé pour le minimise, c'est à vérifier...
    Je creer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    hdc = CreateCompatibleDC(hWnd_DC)) // j'attache un DC a ma fenetre principale
     
    mBMP=CreateBibSection.... //je creer mon dib
     
    SelectObject(hdc, mBMP); //ici je suppose qu'on les atatchent
     
    ensuite je test : ::SendMessage(WM_PAINT, hDCMem, NULL,NULL);
     
    BitBlt(hdc, 0, 0, 320, 240, hWnd_DC, 0, 0, SRCCOPY);

    j'ai toujours le meme probleme je vois la fenetre qui surimprimme ds la copie temps reel que je fait.
    J'ai essayer en mettant le sendmessage avant et après aussi.

  9. #9
    Membre chevronné
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Par défaut
    Citation Envoyé par mikevador02
    ...
    j'ai toujours le meme probleme je vois la fenetre qui surimprimme ds la copie temps reel que je fait.
    J'ai essayer en mettant le sendmessage avant et après aussi.
    comme mon code était incomplet, confirme moi que tu fais bien ceci :
    Avec tes variables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ::SendMessage(hWnd_DC, WM_PAINT,  hdc , NULL);
    Par contre je vois pas pourquoi tu fais un BitBlt (hdc avec le hWnd_DC) car tu reécrase ton DC mémoire (que tu as appelé hdc) avec le DC de ta fenêtre ?
    D'après la MSDN c'est la destination qui est passé en premier paramêtre...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    BOOL BitBlt(
      HDC hdcDest, // handle to destination device context
      int nXDest,  // x-coordinate of destination rectangle's upper-left 
                   // corner
      int nYDest,  // y-coordinate of destination rectangle's upper-left 
                   // corner
      int nWidth,  // width of destination rectangle
      int nHeight, // height of destination rectangle
      HDC hdcSrc,  // handle to source device context
      int nXSrc,   // x-coordinate of source rectangle's upper-left 
                   // corner
      int nYSrc,   // y-coordinate of source rectangle's upper-left 
                   // corner
      DWORD dwRop  // raster operation code
    );
    écrit une bitmap sur le Disque à partir de ton mBMP, ou fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ::BitBlt(TestDC, 0, 0, 320, 240, hdc, 0, 0, SRCCOPY);
    ou TestDC est un DC d'une autre dialog

  10. #10
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Par défaut
    Citation Envoyé par matazz
    Citation Envoyé par mikevador02
    ...
    j'ai toujours le meme probleme je vois la fenetre qui surimprimme ds la copie temps reel que je fait.
    J'ai essayer en mettant le sendmessage avant et après aussi.
    comme mon code était incomplet, confirme moi que tu fais bien ceci :
    Avec tes variables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ::SendMessage(hWnd_DC, WM_PAINT,  hdc , NULL);
    Par contre je vois pas pourquoi tu fais un BitBlt (hdc avec le hWnd_DC) car tu reécrase ton DC mémoire (que tu as appelé hdc) avec le DC de ta fenêtre ?
    D'après la MSDN c'est la destination qui est passé en premier paramêtre...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    BOOL BitBlt(
      HDC hdcDest, // handle to destination device context
      int nXDest,  // x-coordinate of destination rectangle's upper-left 
                   // corner
      int nYDest,  // y-coordinate of destination rectangle's upper-left 
                   // corner
      int nWidth,  // width of destination rectangle
      int nHeight, // height of destination rectangle
      HDC hdcSrc,  // handle to source device context
      int nXSrc,   // x-coordinate of source rectangle's upper-left 
                   // corner
      int nYSrc,   // y-coordinate of source rectangle's upper-left 
                   // corner
      DWORD dwRop  // raster operation code
    );
    écrit une bitmap sur le Disque à partir de ton mBMP, ou fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ::BitBlt(TestDC, 0, 0, 320, 240, hdc, 0, 0, SRCCOPY);
    ou TestDC est un DC d'une autre dialog

    oui BitBlt contient bien un autre DC temporaire pour la copie dans un tableau je ne veux pas dans un premier temps enregistré dans un bitmap mais dans un tableau.
    Ce tableau je le réaffiche sur ma feneteprcinicpale .

    rien a faire j'ai toujours le meme problème lol
    je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SelectObject(hdc, mBMP); // memdc = hdc ici
    SendMessage(hWnd_DC, WM_PAINT,  hdc , NULL);
    //suite...
    Aparament le premier paramètre dois obligatoirement etre un hwnd et pas un DC, et le 3ieme paramètre ne peu pas etre hwnd ou DC mais un parametre copatibvle lParam.

    J'ai essayer donc encore avec d'autres valeurs mais toujours impossible.

    J'ai scrutter le net pour trouver des aides avec du offscreen je ne trouve pas vraimment d'aide.

    Merci encore .

  11. #11
    Membre chevronné
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Par défaut
    C'est bizarre, je vais faire un essais...

  12. #12
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Par défaut
    Citation Envoyé par matazz
    C'est bizarre, je vais faire un essais...
    Merci beaucoup pour ton aide

  13. #13
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Les paramètres de SendMessage et WM_PAINT:
    http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/sendmessage.asp
    http://msdn.microsoft.com/library/en-us/gdi/pantdraw_88ac.asp
    y'a pas de paramètre à WM_PAINT. La fenêtre va utiliser BeginPaint et donc créer son propre DC. C'est pour ça qu'il faut utiliser WM_PRINT (ou WM_PRINTCLIENT) qui elle permet de filer le DC sur lequel dessiner.

  14. #14
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Les paramètres de SendMessage et WM_PAINT:
    http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/sendmessage.asp
    http://msdn.microsoft.com/library/en-us/gdi/pantdraw_88ac.asp
    y'a pas de paramètre à WM_PAINT. La fenêtre va utiliser BeginPaint et donc créer son propre DC. C'est pour ça qu'il faut utiliser WM_PRINT (ou WM_PRINTCLIENT) qui elle permet de filer le DC sur lequel dessiner.
    Merci pour ton aide,

    voilà j'ai donc changer la fonction sendmessage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ::SendMessage(hwnd,WM_PRINT,NULL,NULL);
    Si je place dans le 3ieme parametres un hdc provenant de

    Il affiche une erreur:


    error C2664: 'SendMessageA' : cannot convert parameter 3 from 'struct HDC__ *' to 'unsigned int'

    avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ::SendMessage(hwnd,WM_PRINT,hdc,NULL);
    J'ai aussi dans le WinProc un case WM_PAINT je suppose que là je dois mettre ma fonction de recuperation de la fenetre (getpixel).

    Merci encore pour votre aide .

  15. #15
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    C'est juste un probleme de cast:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    HDC hdc = ::GetDC(hwnd);
    ::SendMessage(hwnd,WM_PRINT, (WPARAM)hdc,NULL); 
    ::ReleaseDC(hwnd, hdc);

  16. #16
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    C'est juste un probleme de cast:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    HDC hdc = ::GetDC(hwnd);
    ::SendMessage(hwnd,WM_PRINT, (WPARAM)hdc,NULL); 
    ::ReleaseDC(hwnd, hdc);
    Merci je n'ai plus de problèmes de compilation.

    Voilà je suppose que je dois placer ma fonction de capture dans le WM_PRINT de la fonction WinProc?

    J'ai testé mais alors il se pose un probleme avec les déclarations des hwnd et hdc que la fonction de recuperation des pixels recreer en local pour elle meme donc si je la place dans la boucle main je ne peu passer en paramètre cele de la fenetres creer, mais dans ce cas la j'obitent rien.


    donc dois-je faire comme ceci? donc case WM_PRINT ne contient rien
    dans le WinProc.
    Dans ce cas j'ai toujours le meme problème .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    WinMain..
    while
    {...
    GETDC
    SendMessage(WMprint...);
    GetPixel(hDC_WC, j, i)......?
    ReleaseDC
    }
    où bien --> ici je n'ai rien récuperer comme si il n'executait pas le" case WM_PRINT"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    ********************
    WinMain
    while
    {....
    GetDC
    SendMessage(WM_Print....)
    ReleaseDC
    }
    ********************
    **************************
    WinProc
    ....
    while....
    {
    Case  WM_PRINT:
         GetPixel(hDC_WC, j, i)....?
    }
    **************************
    La gestion des évenement fonctionne parce que j'ai des évenements qui sont executé lors de l'appuie sur des boutons.

    Merci encore pr toute cette aide.

  17. #17
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Je crois que tu n'as pas tout compris. Toi tu ne gères pas WM_PRINT. C'est un message que tu envois à la fenêtre dont tu veux faire un GetPixel. Pour récupérer le titre d'une fenêtre tu lui envoies WM_GETTEXT. Pour qu'elle se dessine dans un HDC tu lui envois WM_PRINT. A aucun moment tu répond à ces messages : c'est la fenêtre cible qui te répond.
    Tu dois avoir créer un HDC comme il faut (un bitmap) car la fenêtre cible va s'en servir pour se dessiner dedans (seulement si elle le veut bien, là est la limitation du procédé...).
    Pour vraiment forcer la fenêtre à se dessiner même si elle n'est pas conçue pour, faut se relever les manches et passer au niveau supérieur:
    http://www.fengyuan.com/article/wmprint.html

Discussions similaires

  1. [Débutant] Comment appliquer une fenetre de fenêtre de hamming ?
    Par Artinuin dans le forum Images
    Réponses: 10
    Dernier message: 30/05/2010, 11h18
  2. restaurer une fenetre minimisée
    Par martsigo dans le forum Delphi
    Réponses: 9
    Dernier message: 03/10/2006, 00h08
  3. Aggrandir une fenetre minimisée
    Par arasium dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 18/07/2006, 11h44
  4. mettre a jour un champ caché d'une fenetre parente
    Par le-stagiaire dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2005, 14h06
  5. Minimiser une fenetre
    Par billyboy dans le forum Windows
    Réponses: 2
    Dernier message: 13/06/2003, 10h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo