Zwischenablage auslesen



  • Hi, kann mir jemand bitte einen Code geben, der die Zwischenablage in einer Schleife ausliest? Ich habe folgenden Code, aber er funtioniert nicht richtig.

    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    int main()
    {
    
        HGLOBAL hGlobal,hglbcpy;
        PTSTR pText;
        PTSTR pGlobal;
    
        while(true)
        {
        OpenClipboard(0);
        hGlobal = GetClipboardData(CF_TEXT);
        pGlobal = (TCHAR*)GlobalLock(hGlobal);
    
        if(pText)
        {
            free(pText);
            pText = NULL;
        }
    
        pText = (TCHAR*)malloc(GlobalSize(hGlobal));
        lstrcpy(pText,pGlobal);
    
        cout << "Inhalt Zwischenablage:\n\n" << pText << "\n\n";
    
        GlobalUnlock(hGlobal);
        CloseClipboard();
    
        cin.get();
        }
    
        return 0;
    }
    

  • Mod

    Und was geht nicht?
    Was sagt der Debugger?

    Kann es sein, das Dein Projekt in Unicode kompiliert wird? Dann kann es nicht gehen.



  • Wie Martin Richter schon gesagt hat ist das einzige Problem dass PTSTR unterschiedliche Typen darstellt, je nach dem welcher Zeichensatz eingestellt ist. Und wenn du bei der Ausgabe dann den falschen Typ hast kommt Matsch raus. Wenn du ihn dort "pText" wieder in den richtigen Typ casten würdest, würde es wieder gehen. Oder du baust das Programm so um dass die generischen Makros rausfallen:

    int main() 
    { 
    
        HGLOBAL hGlobal,hglbcpy; 
        LPSTR pText = NULL; 
        LPSTR pGlobal; 
    
        while(true) 
        { 
    		OpenClipboard(0); 
    		hGlobal = GetClipboardData(CF_TEXT); 
    		pGlobal = (LPSTR)GlobalLock(hGlobal); 
    
    		 if(pText) 
    		{ 
    			free(pText); 
    			pText = NULL; 
    		} 
    
    		pText = (LPSTR)malloc(GlobalSize(hGlobal)); 
    		lstrcpyA(pText,pGlobal); 
    
    		cout << "Inhalt Zwischenablage:\n\n" << pText << "\n\n"; 
    
    		GlobalUnlock(hGlobal); 
    		CloseClipboard(); 
    
    		cin.get(); 
        } 
    
        return 0; 
    }
    


  • Danke, jetzt ist es so, wenn dieses Programm läuft ist die Zwischenablage gesperrt und mann kann nichts mehr kopieren.Wie kann ich das verhindern?


  • Mod

    Ist doch klar. Dieses Programm läuft ja unentwegt und gibt anderen Programm doch gar keine Chance die Zwischenablage zu verwenden.

    Wenn sich das Clipboard ändert dann wird eine Nachricht versendet wenn Du Dich registrierst.
    Lies die Doku zu AddClipboardFormatListener.

    Dazu benötigst Du aber eine Messaage-Loop.



  • @ehauser
    Tut mir Leid, dieses verhalten lässt sich bei mir nicht reproduzieren, bei mir geht das.

    @Martin Richter
    Wie meinst du das ? Das Programm öffnet doch die Zwischenablage nur kurz und schließt sie danach wieder. Wenn der Thread dann bei cin.get() pausiert, ist die Zwischenablage durch das Programm nicht mehr beeinflusst, alle Locks sind wieder freigegeben. Insofern lässt sie sich natürlich auch verwenden.


  • Mod

    DarkShadow44 schrieb:

    Wenn der Thread dann bei cin.get() pausiert, ist die Zwischenablage durch das Programm nicht mehr beeinflusst, alle Locks sind wieder freigegeben. Insofern lässt sie sich natürlich auch verwenden.

    Sorry. Das stimmt! Ich habe das cin.get übersehen!


Log in to reply