1 votes

définir le texte GLOBAL du presse-papiers dans Windows, en c++ natif

J'ai une chaîne de caractères ASCII (un tableau de caractères à terminaison nulle) dans une application console.

Je veux juste faire en sorte que mon application mette cette chaîne dans le "presse-papier global". de sorte qu'après l'avoir exécutée, je puisse faire ctrl+v dans n'importe quelle application standard (dans ce cas, Visual Studio) et ma chaîne sera collée !

comment faire ?

Je l'ai fait :

void SetClipboardText(char* txt)
{
    if(!OpenClipboard(NULL))
    {
        __asm int 3;
    }

    int l = PIstrlen(txt);
    HLOCAL la = GlobalAlloc(LMEM_MOVEABLE,l+1);
    void* dest = GlobalLock(la);
    PImemcpy(dest,txt,l+1);
    GlobalUnlock(la);
    if(!SetClipboardData(CF_OEMTEXT,la))
    {
        __asm int 3;
    }
    CloseClipboard();
}

J'ai essayé CF_TEXT, CF_OEMTEXT, CF_UNICODE, j'ai essayé NULL et GetDesktopWindow() lors de l'ouverture du presse-papiers.

rien ne semble fonctionner. Modifier : le code ci-dessus "fonctionne" toujours, il n'y a jamais d'erreur, mais il ne fait jamais ce que je veux !

6voto

Kasma Points 679

Comment définir le texte dans le presse-papiers

CString source; 
//put your text in source
if(OpenClipboard())
{
    HGLOBAL clipbuffer;
    char * buffer;
    EmptyClipboard();
    clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);
    buffer = (char*)GlobalLock(clipbuffer);
    strcpy(buffer, LPCSTR(source));
    GlobalUnlock(clipbuffer);
    SetClipboardData(CF_TEXT,clipbuffer);
    CloseClipboard();
}

Comment récupérer du texte dans le presse-papiers

char * buffer;
if(OpenClipboard())
{

    buffer = (char*)GetClipboardData(CF_TEXT);
    //do something with buffer here 
    //before it goes out of scope

}

CloseClipboard();

3voto

jeffamaphone Points 31732

Tu devrais juste essayer d'utiliser la méthode de Raymond fonction d'aide pour SetClipboardData .

Une partie du problème pourrait être que vous utilisez LMEM_MOVEABLE avec GlobalAlloc alors que vous devriez utiliser GMEM_MOVEABLE mais je ne l'ai pas vérifié.

0voto

matt Points 1675

Je devais d'abord vider le presse-papiers en appelant EmptyClipboard()

Je pense que c'est parce que, parmi tous les CF_XXX que j'ai essayés, je n'ai pas choisi celui qui était le plus "par défaut" pour le texte.

l'idée étant que vous pouvez copier une image, puis copier du texte, et les deux sont placés dans le presse-papiers, de sorte que vous pouvez ensuite aller dans un programme d'image, taper coller, et il collera l'image, puis aller dans un programme de texte, taper coller, et il collera le texte.

Je pense donc que mon problème était que je ne choisissais pas un format de texte " par défaut ", il était juste ajouté au presse-papiers derrière quelque chose dans le format plus " par défaut " et donc, lorsque vous appuyez sur coller dans un programme, il choisissait le format plus " par défaut " à coller.

Donc oui, ma solution pas tout à fait idéale a été d'ajouter EmptyClipboard() après OpenClipboard(), ce qui fait que tout est supprimé du presse-papiers, et que les programmes collent par défaut mon format de texte pas tout à fait par défaut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X