Accéder au presse papier

Accéder au presse papier - C - Programmation

Marsh Posté le 25-08-2007 à 00:11:55    

Bonjour,
 
Je voudrais pouvoir récupérer les données d'une copie d'écran (pour récupérer l'image dans un tableau avec les couleurs de chaque pixel)
J'ai trouvé dans la msdn la fonction GetClipboardData() (http://msdn2.microsoft.com/en-us/library/ms649039.aspx) mais il n'y a pas d'exemple fournis et je n'en trouve pas non plus sur internet. Je ne sais donc pas comment m'en servir... donc si quelqu'un pouvait m'éclairer :) (ou peut-être une autre façon de récupérer cette image...)
 
Merci d'avance

Reply

Marsh Posté le 25-08-2007 à 00:11:55   

Reply

Marsh Posté le 25-08-2007 à 11:59:32    

bizu53 a écrit :

...et je n'en trouve pas non plus sur internet....


Ouaip. Je me demande de quelle façon tu cherches. Je rappelle que le site cretin.fr n'est pas un moteur de recherche...
http://www.developpez.net/forums/a [...] 48079.html
http://www.cppfrance.com/infomsg_F [...] 09029.aspx
http://www.purebasic.com/french/do [...] ddata.html
http://forum.hardware.fr/hfr/Progr [...] 3199_1.htm (tu remarques que ce lien est situé sur ce fofo !!!)
http://www.codeppc.com/forum/viewtopic.php?t=9955
 
Oh et puis sors-toi les doigts du luc => http://www.google.fr/search?hl=fr& [...] DcountryFR


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 25-08-2007 à 14:26:33    

Bin j'ai fait rechercher sur google (je ne cherche jamais ailleur) en tapant le nom de la fonction comme je fais habituellement. D'habitude je tombe toujours sur des pages l'utilisant (exemples, forum etc) mais pour celle-là on ne tombe pas sur ça. Et concernant le lien qui est sur ce forum, il ne correspond pas à ce que je veux car je récupère une image du presse papier et non du texte (donc il ne suffit pas d'un simple char *text= ...).
 
Merci quand même, je vais voir ça
 
ps: concernant le dernier lien jne comprends pas pourquoi ce ne sont pas les même résultats que moi pour la même recherche, c'est curieux

Message cité 2 fois
Message édité par bizu53 le 25-08-2007 à 14:30:01
Reply

Marsh Posté le 25-08-2007 à 22:41:58    

bizu53 a écrit :

Et concernant le lien qui est sur ce forum, il ne correspond pas à ce que je veux car je récupère une image du presse papier et non du texte (donc il ne suffit pas d'un simple char *text= ...)


Faut pas confondre "char*" et "texte". Une suite d'octets c'est du "char*". Si t'as une image codée en bmp, t'auras en final tout un tas d'octets donc du char*. Ce sera à toi de regrouper ces octets 3 par 3 pour retrouver les gradients des couleurs RVB pour reconstituer l'image. Bon, il est probable qu'il existe des librairies qui le font à ta place mais le principe est là. Que tu chopes une image, un fichier excel ou le dernier Harry Potter, t'auras en final que des octets !!!
 

bizu53 a écrit :

concernant le dernier lien jne comprends pas pourquoi ce ne sont pas les même résultats que moi pour la même recherche, c'est curieux


J'ai coché l'option "français" qui n'y est pas par défaut...


Message édité par Sve@r le 25-08-2007 à 22:45:56

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 26-08-2007 à 00:58:52    

bizu53 a écrit :

Bin j'ai fait rechercher sur google (je ne cherche jamais ailleur)


Je crois que tu n'as pas compris le principe... Il n'y a pas d'ailleurs, et Google n'est pas un 'endroit'.

 

Il y a un seul endroit, c'est le web, qui est composé de milliers de serveurs reliés entre eux. Celui-ci est indexé par des dizaines de moteurs de recherches dont Google. Il faut donc dire : "j'ai fait une recherche avec Google (je ne cherche jamais avec autre chose)", sinon, tu donnes l'impression de ne pas savoir ce que tu fais...

Message cité 1 fois
Message édité par Emmanuel Delahaye le 26-08-2007 à 00:59:46

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-08-2007 à 02:05:07    

Ah oui en effet. (Je n'ai pas pour habitude de faire mes recherches seulement dans les pages françaises)
 
Emmanuel : Je suis entièrement d'accord mais je ne chipote pas sur les mots =P (c'est comme : on peut très bien dire "aller sur un site" sans pour autant que cela soit un endroit...) et puis tant qu'à chipoter, au passage, j'aurais très bien pu faire une recherche en bibliothèque dans des bouquins qui est bien un deuxième endroit ;-)
 
ps: Dans une communication le but premier est d'être compris et non pas de chercher la petite bête. N'importe qui m'aurait compris, c'est suffisant.

Message cité 1 fois
Message édité par bizu53 le 26-08-2007 à 02:07:13
Reply

Marsh Posté le 27-08-2007 à 15:17:44    

Bonjour
 
Je n'arrive pas bien à comprendre comment fonctionne les handle
Ce bout de code pour récupérer du texte depuis le presse papier fonctionne très bien :

Code :
  1. char *data;
  2. int i;
  3. OpenClipboard(NULL);
  4. data = (char*)GetClipboardData(CF_TEXT);
  5. if(data)
  6.     for(i = 0 ; i < strlen(data) ; i++)
  7.         printf("%c", data[i]);
  8. CloseClipboard();


 
Mais quand je passe à une image, je ne comprends pas comment ça marche, soit data est vide, soit le programme plante à l'éxécution.
Et je ne trouve rien sur internet, seulement du code qui n'est pas expliqué, ou alors au contraire une explication bien trop succinte.
Avec tout ce que j'ai vu je pense devoir utiliser une fonction au lieu de simplement caster, mais je ne trouve pas... les quelques fonctions que j'ai trouvées dans des codes ne passent pas quand je compile.
Quelqu'un pourrait me donner un petit coup de pouce ?
 
Merci

Reply

Marsh Posté le 27-08-2007 à 16:49:26    

bizu53 a écrit :

Bonjour
 
Je n'arrive pas bien à comprendre comment fonctionne les handle
Ce bout de code pour récupérer du texte depuis le presse papier fonctionne très bien :

Code :
  1. char *data;
  2. int i;
  3. OpenClipboard(NULL);
  4. data = (char*)GetClipboardData(CF_TEXT);
  5. if(data)
  6.     for(i = 0 ; i < strlen(data) ; i++)
  7.         printf("%c", data[i]);
  8. CloseClipboard();


 
Mais quand je passe à une image, je ne comprends pas comment ça marche, soit data est vide, soit le programme plante à l'éxécution.
Et je ne trouve rien sur internet, seulement du code qui n'est pas expliqué, ou alors au contraire une explication bien trop succinte.
Avec tout ce que j'ai vu je pense devoir utiliser une fonction au lieu de simplement caster, mais je ne trouve pas... les quelques fonctions que j'ai trouvées dans des codes ne passent pas quand je compile.
Quelqu'un pourrait me donner un petit coup de pouce ?


 
J'utilise pas cette fonction donc mon aide sera très succinte. Mais il me semble que si tu passes le paramètre "CF_TEXT" cela indique à la fonction qu'elle doit choper du texte alors que tu veux traiter une image.
A mon avis, il doit faloir mettre le paramètre "CF_BINARY" (ou un truc dans ce goût là)...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 27-08-2007 à 17:53:53    

Il y a tout plein de CF_machin mais je ne les comprends pas tous bien (cf http://msdn2.microsoft.com/en-us/library/ms649013.aspx pour la liste). Je pense que CF_BITMAP conviendrait mais je n'arrive pas à "m'en servir" j'ai essayé en castant en char* et char** au cas où mais ni l'un ni l'autre ne passe. Je n'ai pas l'impression qu'il y ait de "clipboard format" du genre binary (ou alors c'est que je n'ai rien compris concernant la bonne), ce qui me conviendrait pour prendre les données brut mais ils paraissent tous bien spécifiques.
 
(Tu dis que tu n'utilises pas cette fonction, c'est parce que tu n'as jamais eu à le faire? ou qu'il y a un autre moyen de le faire?)

Reply

Marsh Posté le 27-08-2007 à 20:17:05    

bizu53 a écrit :

Il y a tout plein de CF_machin mais je ne les comprends pas tous bien (cf http://msdn2.microsoft.com/en-us/library/ms649013.aspx pour la liste). Je pense que CF_BITMAP conviendrait mais je n'arrive pas à "m'en servir" j'ai essayé en castant en char* et char** au cas où mais ni l'un ni l'autre ne passe. Je n'ai pas l'impression qu'il y ait de "clipboard format" du genre binary (ou alors c'est que je n'ai rien compris concernant la bonne), ce qui me conviendrait pour prendre les données brut mais ils paraissent tous bien spécifiques.


Oui, je vois ça...
 

bizu53 a écrit :

(Tu dis que tu n'utilises pas cette fonction, c'est parce que tu n'as jamais eu à le faire? ou qu'il y a un autre moyen de le faire?)


Parce que 1) je programme sous Unix/Linux et 2) je n'ai jamais eu besoin de récupérer le contenu du presse papier mais si j'avais eu à le faire, je serais passé par Qt...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 27-08-2007 à 20:17:05   

Reply

Marsh Posté le 27-08-2007 à 21:30:44    

Aujourd'hui, c'est mon jour de bonté et d'envie de frimer. Voici donc la solution :

// But : Remplir DBits avec des groupe les pixels d'une image prise dans le presse-papier
// chaque pixel est codé sur 4 octets : Red, Green, Blue, + octect bidon (ou peut-être B, G, R, me souviens plus)
BYTE *DIBits;
HGLOBAL hDIBits; // handle associé à DIBits
HBITMAP hbmp1;
UINT picture_width, picture_height;
 
int paste_bmp(HWND hwnd)
{
   HGLOBAL hglb; HBITMAP hbm;
   HDC hdc_mem; HDC hdc;
   SIZE hbm_size;
   BITMAPINFO bi;
   BYTE *new_DIBits;
   HGLOBAL new_hDIBits;
   UINT new_picture_width, new_picture_height;
 
   if (!OpenClipboard(hwnd)) {
      MessageBox(hwnd, "Cannot open the clipboard.", "Error", MB_OK);
      return -1;
   }
 
   hglb = GetClipboardData(CF_BITMAP);
   if (hglb == NULL) {
      MessageBox(hwnd, "No bitmap found in the clipboard.", "Error", MB_OK);
      CloseClipboard();
      return -2;
   }
 
   hdc = GetDC(hwnd);
   hdc_mem = CreateCompatibleDC(hdc);
   if (hdc_mem == NULL) {
      MessageBox(hwnd, "Cannot create a memory DC.", "Error", MB_OK);
      ReleaseDC(hwnd, hdc);
      CloseClipboard();
      return -3;
   }
 
   hDIBits = NULL;
   DIBits = NULL;
 
   hbm = (HBITMAP) hglb;
   SelectObject(hdc_mem, hbm);
   GetBitmapDimensionEx(hbm, &hbm_size);
   new_picture_width = (UINT) hbm_size.cx;
   new_picture_height = (UINT) hbm_size.cy;
   if (new_picture_width == 0 || new_picture_height == 0) {
      BITMAP bm;
      if (GetObject(hbm, sizeof(BITMAP), (LPSTR)&bm) != 0) {
         new_picture_width = (UINT) bm.bmWidth;
         new_picture_height = (UINT) bm.bmHeight;
      }
   }
   /*{char s[500];
    sprintf(s, "nx=%d, ny=%d.", (int)new_picture_width, (int) new_picture_height);
      MessageBox(hwnd, s, "Error", MB_OK);
   }*/
 
   bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
   bi.bmiHeader.biWidth = new_picture_width;
   bi.bmiHeader.biHeight = - new_picture_height;
   bi.bmiHeader.biPlanes = 1;
   bi.bmiHeader.biBitCount = 32; // 32 bit so no padding of the horizontal lines is required
   bi.bmiHeader.biCompression = BI_RGB;
   bi.bmiHeader.biSizeImage = bi.bmiHeader.biWidth * 4 * bi.bmiHeader.biHeight * -1 * sizeof(unsigned char);
   bi.bmiHeader.biClrUsed = 0;
   bi.bmiHeader.biClrImportant = 0;
 
   // Allocate a buffer for the pixels
   new_hDIBits = GlobalAlloc(GHND, bi.bmiHeader.biSizeImage);
   if (new_hDIBits == NULL) {
      MessageBox(hwnd, "Cannot allocate memory.", "Error", MB_OK);
      ReleaseDC(hwnd, hdc);
      DeleteDC(hdc_mem);
      CloseClipboard();
      return -4;
   }
   new_DIBits = (BYTE *)GlobalLock(new_hDIBits);
   memset(new_DIBits, 255, bi.bmiHeader.biSizeImage); // Initiailize with white pixels
 
   // Get RGBquads
   if (!GetDIBits(hdc_mem, hbm, 0, new_picture_height, new_DIBits, &bi, DIB_RGB_COLORS)) {
      GlobalUnlock(new_hDIBits); GlobalFree(new_hDIBits);
      MessageBox(hwnd, "Cannot get DIBitmap.", "Error", MB_OK);
      ReleaseDC(hwnd, hdc);
      DeleteDC(hdc_mem);
      CloseClipboard();
      return -5;
   }
 
   // Create a new global bitmap, and copy the bits of the clipboard in it,
   // because the bitmap of the clipboad might soon be used for something else
   DIBits = new_DIBits;
   hDIBits = new_hDIBits;
   hbmp1 = CreateDIBitmap(hdc, &bi.bmiHeader, CBM_INIT,
                          DIBits, &bi, DIB_RGB_COLORS);
 
   picture_width = new_picture_width;
   picture_height = new_picture_height;
 
   DeleteDC(hdc_mem);
   ReleaseDC(hwnd, hdc);
   InvalidateRect(hwnd, NULL, TRUE);
 
   CloseClipboard();
 
   return TRUE;
}

Voilà, mais il faudrait quand même mettre deux minutes le nez dans un livre pour apprendre ce qu'est un display context, etc. Ce n'est pas compliqué. Il faut juste un peu de courage.
 
EDIT : J'ai posté trop vite mon code, sans m'apercevoir qu'il manquait quelques variables globales. Désolé.
Il y a peut-être plus simple aussi, mais c'est du code que j'ai testé et que j'emploie tous les jours.


Message édité par olivthill le 27-08-2007 à 22:49:12
Reply

Marsh Posté le 27-08-2007 à 22:14:19    

wa merci beaucoup  :) je vais voir ça et essayer de comprendre comment il marche pour pouvoir m'en servir.

Reply

Marsh Posté le 27-08-2007 à 23:01:46    

oui j'ai remarqué mais comme ce ne sont de simple "=" j'en ai deviné le type des quelques variables dont le type manquait. Mais je n'arrive pas à comprendre où se trouve l'image au final, dans hbmp1 si j'ai bien compris. Mais quand je regarde avec l'espion ce qu'il contient il me dit "erreur : impossible d'évaluer l'expression" (pourtant la fonction se termine bien comme il faut). Les 2 fonctions release_bitmaps() et init_bitmap() ne sont pas connues, alors pour voir ce qui se fait je les ai mis en commentaire, mais je pense que ça doit être du à ça. Mais le fait qu'elles n'aient pas de paramètre m'intrigue. Ce sont des fonctions qui sont dans une bibliothèque particulière ou à toi?
 
EDIT : Oublie ma dernière question je viens de remarquer que tu as modifier un peu le code ;-)


Message édité par bizu53 le 27-08-2007 à 23:04:21
Reply

Marsh Posté le 28-08-2007 à 00:00:04    

Je ne comprends pas bien ce qu'il faut passer en paramètre (hwnd), j'ai cherché un peu sur internet et apparemment si j'ai bien compris c'est si ça dépend d'une fenêtre, mais moi non puisque je voudrais simplement récupérer un screenshot, alors j'ai mis NULL. Mais du coup (enfin, je ne sais pas si c'est lié) certaines variables (hdc, hdc_mem et hbmp1) sont erronées selon mes espions. Et l'image semble n'être que d'un pixel alors que les dimensions 1280 par 1024 apparaissent bien. Je ne sais pas si je suis bien clair alors j'ai fait un petit screenshot si ça peut aider à comprendre :
 
http://img211.imageshack.us/img211/3540/screenshotlx7.jpg
 
Je me demande du coup si ça ne vient pas du NULL que j'ai mis en paramètre puisque j'ai vu que plusieurs choses dépendent de lui. Je ne comprends pas bien son rôle.

Reply

Marsh Posté le 28-08-2007 à 10:38:58    

hwnd est un handle de fenêtre.
C'est vraiment la base à connaître quand on programme sous Windows en C sans MFC.
Lire un livre sur Windows avant de se lancer dans la programmation est assez utile. Je recommande le Charles Petzold. Ou au moins lire quelques tutoriaux sur la programmation sous Windows.

Reply

Marsh Posté le 28-08-2007 à 13:58:10    

olivthill a écrit :

C'est vraiment la base à connaître quand on programme sous Windows en C sans MFC.


Ça dépend ce qu'on appelle "la base à connaître".. ça fait déjà 2.5ans maintenant que je programme en C et on n'a encore jamais vu ça en cours (plutôt tous les trucs du genre fichiers, listes chaînées, arbres, algos de compression et de plus court chemin...) peut-être l'an prochain je verrai bien.

olivthill a écrit :

hwnd est un handle de fenêtre.


C'est ce que j'ai bien trouvé partout sur internet mais ça ne m'explique pas comment on s'en sert ici, je demande simplement ça rien de plus. Je ne vois pas de quelle fenêtre je devrais filé un handle puisqu'il n'y en a aucune (bon, à part la console mais dont je ne m'occupe pas puisque, je n'ai rien à lui faire afficher concernant cette partie) à moins que l'écran tout entier compte comme une...
(Est-ce que toute la faute [de l'image erronée en mémoire] vient bien uniquement de ça?)

Reply

Marsh Posté le 28-08-2007 à 14:12:47    

bizu53 a écrit :

C'est ce que j'ai bien trouvé partout sur internet mais ça ne m'explique pas comment on s'en sert ici, je demande simplement ça rien de plus. Je ne vois pas de quelle fenêtre je devrais filé un handle puisqu'il n'y en a aucune (bon, à part la console mais dont je ne m'occupe pas puisque, je n'ai rien à lui faire afficher concernant cette partie) à moins que l'écran tout entier compte comme une...


Il t'a été très justement conseillé, pour pouvoir faire ce genre d'application, d'apprendre la programmation Windows GUI. Ca n'a rien à voir avec la programmation C que tu connais. On y parle handles, fenêtres, évènements...

 

Alors cesse de faire le kéké et suit le bons conseils que tu as reçu. Si tu ne veux pas les suivre, c'est simple, ne fait pas programmation Windows GUI.

 



Message édité par Emmanuel Delahaye le 28-08-2007 à 14:13:58

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-08-2007 à 14:56:21    

Je ne pense pas faire le kéké.. je suis tout à fait pour les suivre. Je sais que ça n'a rien à voir, c'est pour ça que je cherche à aller plus loin que ce qu'on apprend (parce que c'est vraiment bidon..). Je demandais de l'aide sur ce sujet car ça ne me paraît pas d'une difficulté extrème, c'est simplement que je n'avais encore jamais utilisé d'handle dans mes programmes. Je veux bien creuser ça.  
 
"On y parle handles, fenêtres, évènements..." => justement je ne comprends pas l'intérêt dans ce cas.
Je demande simplement un petit dernier chouillat d'aide pour simplement me dire l'intérêt de passer un handle de fenêtre, que je comprenne ce que comment ça fonctionne car je n'en vois pas l'intérêt. Je voudrais simplement récupérer un tableau de pixel donc je ne vois pas ce que viennent faire les fenêtre ici. (C'est comme si on me disait un itinéraire à prendre, que je me pomme, et qu'on ne veuille pas me dire par où aller en me disant que je n'ai qu'à acheter une carte). Je remercie olivthill de m'avoir filé ce bout de code mais si c'est pour me laisser me démerder avec et sans le comprendre ça ne sert pas trop à grand chose.. je ne demande pas à ce qu'on m'explique tout le code, j'ai à peu près compris comment ça marche (sans pour autant être en mesure de pouvoir le refaire) mais je demande simplement l'intérêt d'un handle de fenêtre pour comprendre ce que je fais.. c'est tout

Reply

Marsh Posté le 28-08-2007 à 15:39:36    

bizu53 a écrit :

Je ne pense pas faire le kéké.. je suis tout à fait pour les suivre. Je sais que ça n'a rien à voir, c'est pour ça que je cherche à aller plus loin que ce qu'on apprend (parce que c'est vraiment bidon..). Je demandais de l'aide sur ce sujet car ça ne me paraît pas d'une difficulté extrème, c'est simplement que je n'avais encore jamais utilisé d'handle dans mes programmes. Je veux bien creuser ça.  


La programmation Windows, c'est un métier.
 
http://bob.developpez.com/tutapiwin/


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-08-2007 à 18:49:10    

"La programmation Windows, c'est un métier."
Ce n'est pas parce qu'on n'est pas pâtissier qu'on ne peut pas faire de gâteau... Et je ne cherche pas à être le meilleur pâtissier de france, simplement faire un petit gâteau.

 

C'est bon j'oublie (une éventuelle réponse sur ce forum je veux dire, pas pour ce que je veux faire)... c'est si dur que ça de SIMPLEMENT répondre à : quel intérêt d'avoir un handle de fenêtre puisque je ne m'occupe pas de la fenêtre ? Je pensais que c'était un forum d'entraide, je sais bien que c'est sur un sujet que je ne connais pas, mais ici, je ne demande qu'une seule chose à ce sujet. Filer un bout de code et laisser se démerder après, c'est à se demander si c'était vraiment par "bonté" que ça a été fait ou simplement pour se débarasser de ma question en espérant que je ne dise plus rien. Bien sûr qu'il faut bien que le sujet soit résolu un jour.. mais si c'est pour ça, ça n'a aucun intérêt. Je ne demande pas à ce qu'on m'explique ce code (puisque je vois comment il marche, j'ai recherché chaque fonction), simplement pourquoi un handle de fenêtre !

 

(au cas où... je regarderai quand même si vous avez eu la force d'écrire 20-30mots pour me dire l'utilité du handle de fenêtre, mais je n'espère plus maintenant)

 

bye

 

ps:vous pouvez en profiter pour vous lacher si vous vous reteniez de dire des choses sur moi.. je ne réagirai pas (c'est limite si je vais me désinscrire)
j'en profite moi pour dire une chose : c'est facile de rabaisser quelqu'un qui est moins bon que vous, mais c'est pas pour autant qu'il faut le prendre pour un con.. 2 parmi tant d'autres :
Concernant "Faut pas confondre "char*" et "texte"" => je n'ai jamais rien dit qui pouvait laisser supposer une confusion, quand je disais "car je récupère une image du presse papier et non du texte" c'était en connaissance de cause, ce que renvoit la fonction GetClipboardData peut être casté en char* si c'est du texte mais ça ne fonctionne pas s'il s'agit d'une image, c'est ce que je voulais dire.
Et depuis mon problème avec le hwnd, c'est "va voir ailleurs".."on peut te répondre mais on n'a pas que ça à faire ya plein de sites et de bouquins" quel intérêt au forum si c'est pour être d'une sorte de google? une aide à la recherche plutôt qu'une aide pour UNE seule petite question..

 

dernier ps: c'est clairement écrit (sur le dernier lien) que "Si on spécifie un paramètre NULL, la fonction retourne un contexte d'affichage sur la totalité de l'écran." concernant la fonction GetDC. Mais alors je ne comprends pas pourquoi ça ne fonctionne pas correctement en lui passant NULL en paramètre.

Message cité 1 fois
Message édité par bizu53 le 28-08-2007 à 19:18:34
Reply

Marsh Posté le 28-08-2007 à 20:13:03    

bizu53 a écrit :

"La programmation Windows, c'est un métier."
Ce n'est pas parce qu'on n'est pas pâtissier qu'on ne peut pas faire de gâteau... Et je ne cherche pas à être le meilleur pâtissier de france, simplement faire un petit gâteau.


Ce qu'on essaye de te faire comprendre, c'est

 

1 - Que ta question ne concerne pas la langage C.
2 - Que ta question concerne la programmation Windows
3 - Que la programmation Windows, c'est compliqué et que ça met en oeuvre un tas de notions assez complexes qu'il faut le prendre le temps d'étudier (On t'a indiqué un auteur et un site. Que faire de plus ?).
4 - Qu'il est impossible de te faire une réponse sérieuse en quelques mots.

 

Corolaires :

 

1 - Si tu ne comprends pas ça, on ne peut rien pour toi.
2 - Si ça t'amuse de jouer les martyrs, libre à toi, ça ne nous concerne pas.

 

Quand à "quel intérêt d'avoir un handle de fenêtre puisque je ne m'occupe pas de la fenêtre ? ". Disons que quand un système d'exploitation s'appelle 'Windows', ce n'est pas très surprenant que l'objet de base soit la fenêtre, même si elle prend tout l'écran... Un peu de bon sens...

 

Enfin, le but d'un forum consacré au langage C n'est pas de faire un cours sur la programmation Windows. Il est donc parfaitement logique qu'on t'ai indiqué où aller chercher l'information. Quoi de plus naturel ? Tu aurais préféré "Va te faire foutre ?"

 

Et pour conclure, j'ai un peu du mal à supporter les gens comme toi à qui tout est dû... On dirait que plus on fourni d'aide et d'outils de recherche, plus les gens comme toi se croient tout permis, y compris d'exiger tout et n'importe quoi. Ben désolé, mais c'est pas comme ça que ça marche. Et ne te plains pas, parce que quand on a commencé l'informatique dans les années 80, il n'y avait aucune aide. Uniquement quelques rares bouquins qu'on a passé du temps à lire...


Message édité par Emmanuel Delahaye le 28-08-2007 à 20:22:55

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-08-2007 à 20:17:39    

Dans mon bout de code, le handle de fenêtre est donné en paramètre à la fonction OpenClipboard(). Je ne sais pas pourquoi il faut lui donner le handle, mais il est indiqué dans la documentation qu'il faut le donner, et il n'est pas indiqué que l'on pouvait donner une valeur nulle. Il faut donc fournir un handle de fenêtre valide.
 
Où aller trouver un handle de fenêtre valide ?
Le handle est un numéro qui est généré par Windows quand une fenêtre est créée. Ce handle est fourni par Windows en paramètre de la fonction callback qui traite les messages.
Au pire, si on ne connait pas le numéro de la fenêtre active, on peut l'obtenir par GetActiveWindow()
 
Il y a beaucoup de fonctions Windows (API) qui ont besoin d'un hwnd valide. C'est un peu un moyen de dire à Windows qui l'on est, qui est-ce qui lui cause.
 
J'utilise aussi le handle de fenêtre un peu plus bas dans le programme en paramètre à d'autres fonctions.
Par exemple, je demande un display context par hdc = GetDC(hwnd);
 
Pourquoi faut-il fournir un hwnd pour avoir le hdc ? Parce que je voudrais le hdc associé à ma fenêtre. Il y a des display context qui peuvent être très différents d'une fenêtre à un autre.
 
Pourquoi aller chercher un display context ?
Parce que les programmeurs de Microsoft ont décidé que les bitmaps seraient associés à des display context, et je souhaite utiliser un bitmap. Mais avant d'aller travailler sur le bitmap, je crée un display context compatible que je ne garderai que temporairement. Je ne souhaite pas polluer le display context de ma fenêtre, je préfère travailler avec un autre.
 
Pour travailler avec le bitmap du presse passier, je le sélectionne dans un display context. Pourquoi ? Parce que j'ai vu des exemples où les gens font comme ça. Je ne sais pas si c'est obligatoire, mais en tout cas ça donne le résultat voulu avec cette méthode.
 
Puis j'obtiens les dimensions du bitmap, ce qui va me permettre de créer un bitmap vierge de la bonne taille en mémoire globale pour y copier le bitmap éphémère du clipboard.
 
etc. etc. C'est déjà une longue explication qui n'explique qu'un tout petit bout, mais un forum n'est pas un livre ni un tutoriel.

Reply

Marsh Posté le 28-08-2007 à 20:26:02    

olivthill a écrit :

<23 lignes d'explications...>
etc. etc. C'est déjà une longue explication qui n'explique qu'un tout petit bout, mais un forum n'est pas un livre ni un tutoriel.


Je me cite :

Citation :

4 - Qu'il est impossible de te faire une réponse sérieuse en quelques mots.


 :)


Message édité par Emmanuel Delahaye le 28-08-2007 à 20:26:16

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-08-2007 à 21:47:33    

Merci olivthill pour un petit passage qui m'a permis de comprendre quelques choses. Mais concernant le reste, je ne demandais pas d'explication du bout de code car c'est bien ce que j'avais compris  :)

 

J'avais dit que je ne réagirai pas, ce n'est pas une réaction, mais une simple précision, je crois que ma question (la 2ème, suite au hwnd) a mal été comprise : Je demandais simplement une petite question pour un petit problème et non pas à savoir gérer toutes les fonctions de la programmation Windows..(donc je n'ai pas pris le forum ni pour un livre ni pour un tutoriel..). Emmanuel tu dois avoir une définition bien particulière de l'aide parce que "plus on fourni d'aide" justement je n'en ai pas eu concernant le hwnd, c'est "voilà le code, et démerde-toi si tu as des pb avec", et dans ce que l'on trouve sur les sites de tutoriels, c'est clairement écrit qu'il faut NULL pour l'écran entier, j'avais donc essayé, et ça n'a pas fonctionné, j'ai demandé pourquoi mais aucune réponse (je n'ai jamais demandé de solution)... enfin bref, je vais attendre 2 semaines pour demander à mon prof d'info, au moins ça fonctionnera et je saurai pourquoi ça ne fonctionnait pas (c'est ça que j'appelle de l'aide, non pas une solution)

 

ps:je voudrais juste ajouter quand même que je ne joue pas les martyrs[mais si tu le vois comme ça ça m'est égal à vrai dire], et que ce que j'ai dit là pour moi, on le retrouve dans d'autres de vos posts dans d'autres sujets avec d'autres personnes, et que je suis loin d'être le seul à avoir cet avis, c'est tout. Je ne dis rien sur le reste. (Au passage je n'ai jamais rien exigé, désolé d'avoir peut-être donné l'impression)

 

Ce n'était qu'une idée tout à l'heure, et maintenant plus j'y pense plus ça me semble inutile de rester sur ce forum alors autant me désincrire (on sera tous contents :) vous parce que je ne serai plus là, et moi aussi :))

 

bye


Message édité par bizu53 le 28-08-2007 à 21:48:57
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed