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

Windows Discussion :

fonctionement de GetDIBits


Sujet :

Windows

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut fonctionement de GetDIBits
    Salut à tous,

    Je suis à la recherche du moyen de lire la couleur des pixels de l'écran, simplement les lire, pas besoin de les modifier ni d'en faire une image.
    Après quelques recherches, j'ai d'abord trouvé la solution du getPixel(); facile a mettre en œuvre mais beaucoup trop lente!
    J'ai donc chercher une autre méthode, et j'ai trouvé GetDIBits();

    Et c'est la que je ne comprend plus rien... faut avouer que la syntaxe msdn n'est pas toujours très claire quand on est pas habitué (en plus l'exemple qu'ils donnent est fait pour capturer une image, pas pour la lire), j'aurais donc besoin d'un petit coup de pouce de quelqu'un ayant déjà utilisé GetDIBits.

    Pour lire connaitre le COLORREF ou code hexa (ou autre) d'un pixel, suis-je obligé de créer une nouvelle zone mémoire, ne peut on pas lire directement le contenu de l'écran sans le copier?
    comment récupérer les informations?
    comment lire ces informations?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Le problème de GetPixel est justement qu'il cherche à ne lire et convertir qu'un pixel au format COLORREF.
    Il faut bien être conscient que la mémoire vidéo, même si elle peut être mappée en mémoire est sur un périphérique distant, la carte graphique.
    Le mapping en mémoire n'est qu'une astuce pour demander à la carte graphique de nous retourner les valeurs de SA mémoire.

    GetDIBits, lui ne cherche pas a lire une zone mémoire mais à faire un snapshot. Cela permet d'utiliser l'architecture de bus des PC (PCI ou autre) optimisé pour envoyer des FLOTS de données par rafale.
    La conversion en COLORREF sur un ensemble de pixel est très facilement parallélisable via MMX, SSE2 etc., c'est même l'une des tâche principale du GDI.

    Si vous voulez vraiment lire directement dans la mémoire vidéo, la vraie, il vous suffit de faire un driver en mode kernel, de dialoguer avec le contrôleur du bus PCI pour avoir le droit de monter le potentiel électrique sur les fils du bus et que la carte graphique les lisent. En triturant ces potentiels, vous pouvez envoyer des commandes à la carte vidéo (je suis pas sûr que tous les constructeurs publient leur jeu de commande ). De récupérer le résultat de la commande. S'il a une option DMA, on peut toujours le piloté pour avoir plusieurs données récupéré en mémoire sur une commande. Avec un peu de chance, le format de la valeur n'est pas assez abscond pour interdire une conversion en RGB de base.
    Tout ça pour ce faire poutrer en performance par un simple GetDIBits qui récupère en rafale toute une zone mémoire en utilisant les fonctionnalités optimisées du driver graphique du fabriquant de la carte et les routines de conversion du GDI.

    Donc GetDIBits est là solution, à moins de revoir toute l'architecture hardware et software d'un PC.

    Une fois maitrisés les concepts utilisés par GetDIBits, vous verrez que c'est en fait très naturelle pour une personne connaissant le fonctionnement d'une machine.

    La difficulté n'est pas dans GetDIBits, mais dans vos méconnaissances. Qu'est-ce que vous ne maîtriser pas dans GetDIBits?

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    okay, ma méconnaissance c'est surtout que je n'ai jamais fait de prog windows (ou presque).

    Si vous voulez bien on vas partir de la syntaxe définie par la msdn pour que j'essaye de comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int GetDIBits(
      __in     HDC hdc,
      __in     HBITMAP hbmp,
      __in     UINT uStartScan,
      __in     UINT cScanLines,
      __out    LPVOID lpvBits,
      __inout  LPBITMAPINFO lpbi,
      __in     UINT uUsage
    );
    vous me corrigez si je me trompe

    les paramètres :

    - hdc, c'est le HDC(identifiant?) de la fenêtre/application qui fait la demande? comment l'obtenir?

    - hbmp, c'est un HBITMAP, pour l'avoir, je récupere le HDC de l'écran, puis j'utilise CreateCompatibleBitmap??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //largeur de l'écran
    int resolution_x = GetSystemMetrics(SM_CXSCREEN);
    //hauteur de l'écran
    int resolution_y = GetSystemMetrics(SM_CYSCREEN);
    //le HDC de l'ecran
    HDC hScreenDC = GetDC(NULL);
    //le HBITMAP de l'image de l'écran?
    HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, resolution_x, resolution_y);
    - uStartScan et cScanLines, la ligne de début et le nombre de ligne, GetDIBits ne fonctionne qu'avec des lignes? donc pour un écran de 800 par 600, uStartScan=0 et cScanLines=600 ( pour tout l'écran ) ???

    - lpvBits, l'adresse a laquelle seront les informations, tous les pixels de l'écran??

    - lpbi, "A pointer to a BITMAPINFO structure that specifies the desired format for the DIB data" mouai, mais à quoi ça sert concretement? comment s'en servir?

    - uUsage, permet de spécifier le format voulu, je passe DIB_RGB_COLORS pour avoir le format RGB

    la valeur de retour, c'est le nombre de lignes copiées, donc 600 si tout marche bien avec uStartScan=0 et cScanLines=600.

    Voilà pour l'utilisation de la fonction, mais qu'en est il de l'utilisation du résultat? j'imagine qu'il faut se servir de lpbi??

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    Bon, j'ai essayé 2 - 3 trucks, mais ça marche pas, voici le code :
    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
    20
    21
    22
    23
    24
    25
    26
    27
        //largeur de l'écran
        int resolution_x = GetSystemMetrics(SM_CXSCREEN);
        //hauteur de l'écran
        int resolution_y = GetSystemMetrics(SM_CYSCREEN);
    
        //le HDC de l'ecran
        HDC hdcScreen = GetDC(NULL);
        //le HDC mémoire
        HDC hdcMemory = CreateCompatibleDC(hdcScreen);
        //le HBITMAP de l'image de l'écran
        HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, resolution_x, resolution_y);
    
        //la variable qui contient les informations
        LPVOID lpvBits;
        //la structure BITMAPINFO
        BITMAPINFO lpbi;
    
        //et...
        cout << GetDIBits(hdcMemory,hbmp,0,600,&lpvBits,&lpbi,DIB_RGB_COLORS) << endl;
    
        //on supprime le HBITMAP
        DeleteObject(hbmp);
        //on libere le HDC mémoire
        DeleteDC(hdcMemory);
        //on libere le HDC de l'ecran
        ReleaseDC(NULL, hdcScreen);
    GetDIBits renvoie 0, vous auriez une piste pour avancer?

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    j'ai finalement réussi a faire fonctionner GetDIBits, voici mon code :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
        //largeur de l'écran
        int resolution_x = GetSystemMetrics(SM_CXSCREEN);
        //hauteur de l'écran
        int resolution_y = GetSystemMetrics(SM_CYSCREEN);
    
        cout << resolution_x <<" "<<resolution_y <<endl;
        //le HDC de l'ecran
        HDC hdcEcran = GetDC(NULL);
        //le HDC mémoire
        HDC hdcMemoire = CreateCompatibleDC(hdcEcran);
        //le HBITMAP de l'image de l'écran
        HBITMAP hbitmap = CreateCompatibleBitmap(hdcEcran, resolution_x, resolution_y);
        //selection de l'objet
        SelectObject(hdcMemoire, hbitmap);
    
        //copie de la surface
        BitBlt(hdcMemoire, 0, 0, resolution_x, resolution_y, hdcEcran, 0, 0, SRCCOPY);
    
        //ici on a un hbitmap valide
    
        //
        BITMAP bitmap;
        BITMAPINFO bitmapinfo;
        BYTE *lpBits;
    
        //
        GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bitmap);
    
        //initialisation de bitmapinfoheader
        bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        bitmapinfo.bmiHeader.biWidth = bitmap.bmWidth;
        bitmapinfo.bmiHeader.biHeight = bitmap.bmHeight;
        bitmapinfo.bmiHeader.biPlanes = 1;
        bitmapinfo.bmiHeader.biBitCount = 32;
        bitmapinfo.bmiHeader.biCompression = BI_RGB;
        bitmapinfo.bmiHeader.biSizeImage = 0;
        bitmapinfo.bmiHeader.biXPelsPerMeter = 0;
        bitmapinfo.bmiHeader.biYPelsPerMeter = 0;
        bitmapinfo.bmiHeader.biClrUsed = 0;
        bitmapinfo.bmiHeader.biClrImportant = 0;
    
        //allocation
        lpBits = new BYTE[bitmapinfo.bmiHeader.biWidth*bitmapinfo.bmiHeader.biHeight*4];
    
        //on récupere ls données
        if(GetDIBits(hdcEcran, hbitmap, 0, (UINT) bitmap.bmHeight, lpBits, &bitmapinfo, DIB_RGB_COLORS)){
    
        //on libere
        free(&lpBits);
    
        //on supprime le HBITMAP
        DeleteObject(hbitmap);
        //on libere le HDC mémoire
        DeleteDC(hdcMemoire);
        //on libere le HDC de l'ecran
        ReleaseDC(NULL, hdcEcran);
    y'a t'il des erreurs???
    je suis pas sur de mon coup pour la taille de l'allocation mémoire.
    comment avoir les composantes RGB d'un pixel situé a la position (p,q) (et de tout les pixels ?)

    merci d'avance

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Avec une relecture très rapide, je vois 2 problèmes.
    Pour utiliser sereinement les structure Win32, comme BITMAP et BITMAPINFO, il faut toujours initialiser leur mémoire à Zéro, même si vous initialiser tous les champs.
    Ce genre de structure à tendance à grossir avec les versions de Windows, il faut donc faire un ZeroMemory (http://msdn.microsoft.com/en-us/libr...20(VS.85).aspx) sur les structures Win32.

    La seconde remarque, ne jamais mélanger les primitives d'allocation C et C++.

    Vous avez fait une allocation avec new[] (C++) et une désallocation avec free (C).
    C'est soit:
    malloc/free
    new/delete
    new[]/delete[]

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Plutôt que ZeroMemory(), j'utiliserais BITMAP toto = {0} à la place. Le problème, c'est que si tu es sous MinGW en mode parano, tu auras un warning et gcc 3.4.2 (celui livré avec MinGW) ne reconnait pas d'option pour le désactiver. Aucun problème si tu es sous Visual, par contre.

    +1 pour le problème de désallocation. De plus, free() ou delete[] doivent se faire sur le pointeur directement, pas sur l'adresse de celui-ci...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    merci pour la remarque de new/delete, vous avez raison, je n'avais pas fait attention.

    pour le ZeroMemory suffit il de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        ZeroMemory(&bitmap,sizeof(BITMAP));
        ZeroMemory(&bitmapinfo,sizeof(BITMAPINFO));
        ZeroMemory(&lpBits,sizeof(BYTE*));
    ?

    quel avantage a utiliser ta technique Médinoc?

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ma techinique est plus rapide à taper que ZeroMemory, et initialise tous les champs à un vrai zéro, pas "all bits to zero" (même si sur la plupart des plate-formes, c'est la même chose, y compris pour les nombres à virgule flottante).

    Au passage, ZeroMemory sur un bête pointeur, c'est se casser la tête pour rien. Un simple BYTE * lpBits = NULL; suffit.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    pas faux.

    j'ai finalement réussit a lire tous les coéfficients de tous les pixels de l'écran, voici le code, ça pourrait servir à quelqu'un :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
        //largeur de l'écran
        int resolution_x = GetSystemMetrics(SM_CXSCREEN);
        //hauteur de l'écran
        int resolution_y = GetSystemMetrics(SM_CYSCREEN);
    
        //le HDC de l'ecran
        HDC hdcEcran = GetDC(NULL);
        //le HDC mémoire
        HDC hdcMemoire = CreateCompatibleDC(hdcEcran);
        //le HBITMAP de l'image de l'écran
        HBITMAP hbitmap = CreateCompatibleBitmap(hdcEcran, resolution_x, resolution_y);
        //selection de l'objet
        SelectObject(hdcMemoire, hbitmap);
    
        //copie de la surface
        BitBlt(hdcMemoire, 0, 0, resolution_x, resolution_y, hdcEcran, 0, 0, SRCCOPY);
    
        //ici on a un hbitmap valide
    
        //création des variables pour getdiblits
        BITMAP bitmap;
        BITMAPINFO bitmapinfo;
        BYTE *lpBits = NULL;
    
        //initialisation des variables
        ZeroMemory(&bitmap,sizeof(BITMAP));
        ZeroMemory(&bitmapinfo,sizeof(BITMAPINFO));
    
        //
        GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bitmap);
    
        //initialisation de bitmapinfoheader
        bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        bitmapinfo.bmiHeader.biWidth = bitmap.bmWidth;
        bitmapinfo.bmiHeader.biHeight = bitmap.bmHeight;
        bitmapinfo.bmiHeader.biPlanes = 1;
        bitmapinfo.bmiHeader.biBitCount = 32;//affichage 32 bits
        bitmapinfo.bmiHeader.biCompression = BI_RGB;
        bitmapinfo.bmiHeader.biSizeImage = 0;
        bitmapinfo.bmiHeader.biXPelsPerMeter = 0;
        bitmapinfo.bmiHeader.biYPelsPerMeter = 0;
        bitmapinfo.bmiHeader.biClrUsed = 0;
        bitmapinfo.bmiHeader.biClrImportant = 0;
    
        //allocation
        lpBits = new BYTE[bitmapinfo.bmiHeader.biWidth*bitmapinfo.bmiHeader.biHeight*4];
        
        //on récupere ls données
        if(GetDIBits(hdcEcran, hbitmap, 0, (UINT)bitmapinfo.bmiHeader.biHeight, lpBits, &bitmapinfo, DIB_RGB_COLORS)){
    
            //si GetDIBits à fonctionné
    
            //on parcoure tout les pixels
            for(int i=0; i<bitmapinfo.bmiHeader.biHeight; i++){
                for(int j=0; j<bitmapinfo.bmiHeader.biWidth; j++)
                {
    
                    //on lit chaque coef du RGB
                    int r = lpBits[4*((i*bitmapinfo.bmiHeader.biWidth)+j)+2];
                    int g = lpBits[4*((i*bitmapinfo.bmiHeader.biWidth)+j)+1];
                    int b = lpBits[4*((i*bitmapinfo.bmiHeader.biWidth)+j)];
    
                    fprintf(fichier,"r:%d,g:%d,b:%d\n",r,g,b);
    
                }
            }
    
        }
    
        //on libere
        delete(&lpBits);
    
        //on supprime le HBITMAP
        DeleteObject(hbitmap);
        //on libere le HDC mémoire
        DeleteDC(hdcMemoire);
        //on libere le HDC de l'ecran
        ReleaseDC(NULL, hdcEcran);


    merci a tous!

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    y'a t'il moyen de réaliser la même opération mais sur le pointeur de la souris?

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Que veux-tu dire par "sur le pointeur de la souris" ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    désolé, c'est vrai que ce n'est pas clair.

    au lieux de récupérer l'image de l'écran (qui ne contient pas l'image du pointeur de la souris), serait il possible de récupérer l'image du pointeur( la ptite flèche quoi )?

    je ne suis peut être pas encore assez clair.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Fonction API
    Par margilb dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/07/2002, 11h11
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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