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

C++ Discussion :

OpenClipboard windows api


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut OpenClipboard windows api
    Bonjour,
    J'ai une petite question a propos du paramètre passé a la fonction OpenClipboard (hWndNewOwner [in, optional] Type: HWND), si j'ai bien compris c'est un handle sur une fenêtre d'une application et le contenu peut différer celons celui ci ? Auriez vous un exemple d'application qui a son propre presse papier (je trouve ça bizarre) ?
    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
     
    int main(void)
    {
        if(OpenClipboard(GetForegroundWindow()))
        {
            HANDLE pText = GetClipboardData(CF_TEXT);
     
                if(pText)
                {
                    char *pchData = (char*)GlobalLock(pText);
                    char *strData = pchData;
                    GlobalUnlock(pText);
                    CloseClipboard();
                    cout <<strData;
                }
        }
    }
    Merci d'avance.

  2. #2
    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
    Bonjour,
    1. Comme tu l'as toi-même copié, le paramètre est optionnel: Passe juste NULL.
    2. En fait de HANDLE, c'est supposé être un HGLOBAL (comme dit dans le commentaire en bas de la page).
    3. Ta grosse erreur, c'est de débloquer le texte avant d'avoir copié son contenu.
      La ligne char *strData = pchData; ne fait pas de copie.
      Par contre, si tu la remplace par une std::string, avec string strData(pchData);, ça copiera le texte.


    Code corrigé : 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
    #include <windows.h>
    #include <string>
    #include <iostream>
    using namespace std;
     
    int main(void)
    {
    	if(OpenClipboard(NULL))
    	{
    		HGLOBAL hText = GetClipboardData(CF_TEXT);
     
    		if(hText)
    		{
    			char *pchData = (char*)GlobalLock(hText);
    			string strData(pchData);
    			GlobalUnlock(hText);
    			CloseClipboard();
    			cout << strData;
    		}
    	}
    }
    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.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ok merci, mais est-ce suivant le handle (hglobal) passé le contenue peut être différent au même moment ?

  4. #4
    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
    Selon le paramètre passé à GetClipboardData(), tu auras des données différentes (ou NULL si le presse-papier ne contient pas de données du format en question).
    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.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Et pour OpenClipboard le contenu peut changer suivant le handle ?

  6. #6
    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
    J'ai du mal à comprendre ta question, mais un appel à OpenClipboard() fige le presse-papier jusqu'au CloseClipboard(), interdisant aux autres processus de le modifier (alors, sois sûr de toujours appeler CloseClipboard() quand tu as fini!).

    Ainsi, tu es sûr qu'aucun agent extérieur ne modifiera le presse-papier tant que tu es en train de le lire.

    Le presse-papier peut contenir des données en plusieurs formats à la fois (plus les conversions automatiques). La fonction EnumClipboardFormats, appelée en boucle, permet de voir tous les formats de données se trouvant en ce moment dans le presse-papier.

    Note: Toujours recopier les données. Le handle est à considérer comme invalide dès l'appel à CloseClipboard() (et le pointeur retourné par GlobalLock() est à considérer comme invalide dès l'appel à GlobalUnlock()).
    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.

  7. #7
    Invité
    Invité(e)
    Par défaut
    En faite je ne pense pas qu'il n'y est qu'un seul presse papier pour tout le systéme mais qu'il puisse en avoir plusieurs en fonction du hglobal passé (pas forcement différent type) par exemple avec tel hglobal au même moment j'ai un contenu cf_text qui est 'aaaaa' puis avec un autre hglobal (au même moment) 'bbbbb'

  8. #8
    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
    Je ne comprends pas ce que tu dis, à aucun moment tu ne passes un HGLOBAL pour lire le presse-papier, et OpenClipboard() ne prend pas de HGLOBAL en paramètre, seulement un HWND optionnel qui n'est même pas pris en compte quand on ne fait que lire.
    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.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Ok je pensais juste que chaque application pouvait avoir son propre presse papier merci alors

  10. #10
    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
    Le presse-papier sert à communiquer d'une application à l'autre, donc si chaque application avait son propre presse-papier ça casserait un peu le principe...
    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.

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

Discussions similaires

  1. Manipulation du registre windows [APIs]
    Par developersystem dans le forum Windows
    Réponses: 2
    Dernier message: 28/08/2007, 01h19
  2. [VBscript] Comment utiliser les windows API en vbs
    Par daniel_gre dans le forum VBScript
    Réponses: 3
    Dernier message: 21/05/2007, 18h14
  3. Windows API
    Par couet dans le forum Windows
    Réponses: 4
    Dernier message: 15/05/2006, 13h31
  4. Windows API
    Par datax dans le forum Windows
    Réponses: 1
    Dernier message: 22/08/2005, 10h58
  5. [Windows]Api win32 pour java
    Par cpanette dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 27/06/2005, 15h06

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