Clipboard



  • Wenn die Funktion fehlt schlägt, ist entweder nichts oder kein einfacher String in der Zwischenablage - sicher, dass ein String drin ist?

    MfG SideWinder



  • ich glaub das ich die funktion falsch aufrufe.
    wie würde ein richtiger aufruf lauten?

    sry. wenn das total falsch ist, aber ich weiß es wirklich nicht:
    (es geht jedenfalls nicht)
    char str[100] = getStringFromClipboard();



  • ok die frage is wohl sehr dämlich da keiner mehr was sagt 😉
    aber ich versteh nicht wie ich die funktion aufrufe, irgendwas mach ich mit dem pointer falsch. muss ich noch eine * dazu schreiben oder & ?

    ich hab hier im forum jede menge beiträge dazu gefunden, aber entweder sie funktionieren nicht, oder sie gehen nicht für konsolen anwendungen oder ich verstehe sie nicht. 😞



  • hab zwar keine ahnung vom clipboard, aber von c, und da die funktion n char* zurückgibt, musst du den dann benutzen:

    char *zeichenkette=malloc(100*sizeof(char));
    zeichenkette=getStringFromClipboard();
    printf("%s",zeichenkette);
    

    wenn die kette in der zwischenablage (bis zu) 99 zeichen groß ist.



  • danke, aber es haut leider noch nicht hin:

    #include <windows.h>
    #include <stdio.h>
    
    int main(int argc, char* argv[])
    {
    
    char *zeichenkette=malloc(100*sizeof(char)); 
    zeichenkette=getStringFromClipboard(); 
    printf("%s",zeichenkette); 
    
    	return 0;
    }
    
    char * getStringFromClipboard()
    {
       int ok = OpenClipboard(NULL);
       char * cBuffer = NULL;
    
       if (!ok) return NULL;
    
       HANDLE hClipData = GetClipboardData( CF_TEXT );
       cBuffer = (char*)GlobalLock( hClipData );
       GlobalUnlock( hClipData );
       CloseClipboard();
       return cBuffer;
    }
    


  • Wenns so nicht funktioniert verschieb ich dich besser ins WinAPI-Forum da du hier eindeutig auf die WinAPI zugreifen musst 🙂

    @mata: Nein daran liegts nicht, weil Speicher schon in der Funktion bereit gestellt wird, nur freigeben muss er ihn noch (und das soll er laut MSDN gar nicht afaik)

    MfG SideWinder



  • Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ok, mal schauen ob hier mir jemand helfen kann. 🙂



  • du musst die daten natürlich auch irgendwo hinkopieren. 😉
    allerdings wäre das bei deiner funktion nur möglich in eine globale variable denn wenn du den scope verlässt zerstörst du cBuffer und einen pointer zurückgeben der auf eine globale variabele zurückgeben macht keinen sinn.

    kleiner denkanstoss, hab ich einfach mal so aus dem stehgreif geschrieben.
    ist nicht getestet. müsste aber funzen.

    bool GetStringFromClipboard(char *pBuffer)
    {
        if(!IsClipboardFormatAvailable(CF_TEXT)) return false; 
    
        if(!(OpenClipboard(NULL))) return false;
    
        char *pTemp = (char*)GetClipboardData(CF_TEXT);
    
        // TODO: darauf achten das der buffer gross genug ist
        // evtl. noch zusätzlichen parameter mit maximaler grösser
        // und fehlerabfangung
    
        memcpy(pBuffer, pTemp, strlen(pTemp));
    
        CloseClipboard();
    }
    
    int main(int argc, char* argv[])
    {
        char szText[512];
    
        if(getStringFromClipboard(szBuffer))
            printf("%s\n", szTemp);
        else
            printf("fehler\n");
    
        return 0;
    }
    


  • danke, hast dir ja extra arbeit gemacht 🙂

    ich bekomme leider noch eine fehlermeldung: " getStringFromClipboard' : nichtdeklarierter Bezeichner" zurück. 😕



  • wie gesagt nicht getestet. 😃 aber das lässt sich lösen 😉
    [cpp]
    if(GetStringFromClipboard(szBuffer))
    [/cpp]



  • oh, das hätte ich sogar merken müssen. 😮

    jetzt kreidet er mir noch szTemp und szBuffer als nichtdeklarierter Bezeichner an, gibts da auch so eine leichte lösung? 😋



  • wieder an fünftausend dinge gedacht beim schreiben

    [cpp]
    int main(int argc, char* argv[])
    {
    char szText[512];

    if(GetStringFromClipboard(szText))
    printf("%s\n", szText);
    else
    printf("fehler\n");

    return 0;
    }[/cpp]



  • jaaaaaa! jetzt gehts! vielen dank du hast mir echt geholfen!!!!!!! 👍

    eine kl. frage hätte ich noch: ich bekomme die warnung: GetStringFromClipboard' : Nicht alle Steuerelementpfade geben einen Wert zurück

    was heißt das?



  • miller_m muss man nicht GlobalLock auf das Handle von GetClipboardData aufrufen um an die Daten zu kommen?



  • Noir schrieb:

    eine kl. frage hätte ich noch: ich bekomme die warnung: GetStringFromClipboard' : Nicht alle Steuerelementpfade geben einen Wert zurück
    was heißt das?

    das nach closeclipboard noch nen "return true;" kommen müsste.

    GlobalLocker schrieb:

    miller_m muss man nicht GlobalLock auf das Handle von GetClipboardData aufrufen um an die Daten zu kommen?

    warum? mit GetClipboardData komme ich doch doch dran. hab keinen sinn darin gesehen.



  • Na ja, hab das bis jetzt bei allen Beispielen im Internet mit GlobalLock gesehen. Vielleicht geht es ja nur zufällig. 😉



  • noch ne frage 🙂

    benötige ich hier memcpy überhaupt, damit kopiere ich doch einen Speicherbereich? aber man kann das hier weglassen und es geht noch.



  • aber man kann das hier weglassen und es geht noch.

    glaube ich nicht. 😮 😮 😮



  • stimmt sorry war blödsinn, ich hab nach dem entfernen die falsche exe gestartet. mit der ging es noch. 😮


Anmelden zum Antworten