Zwischenspeicher abfangen



  • Ich hab ein programm was den zwischenspeicher ausliest. Das programm soll im hintergrund laufen und immer wenn sich der zwischenspeicher ändert, soll es diesen auslesen. Ich bin mir ziemlich sicher das ich dazu hooks verwenden soll weiss aber nicht wirklich wo ich anfangen soll. Hab jetzt schon tausende tutorials ueber hooks gelesen und schon ueber 10 dll erstellt die alle funktionieren nur das dazugehoerige programm funzt nicht, da es entweder in einem anderem Compiler geschrieben wurde oder ganz einfach nicht funktioniert. Ich benutzte Microsoft Visual C++ 6.





  • oh man ich glaubs nicht ;/. Ich hab jetzt seit einigen tagen gesucht und endlich das mit den Hooks kapiert und hab eine funktion geschrieben die den zwischenspeicher bei jedem mausklick ueberprueft.
    GRR
    Naja big thx so geht das alles viel einfacher (habs noch nicht probiert aber ich denks mal)



  • hmm ich bin irgendwie zu dumm fuer die MSDN, hab sie auch auf meinem computer, aber ist fuer mich irgendwie nur Fachchinesisch, obwohl mein Englisch eigendlich ganz gut ist.
    Also wie ist die Message für die veränderung des Zwischenspeichers? und muss ich irgendwas vorher machen damit das programm die nachricht bekommt?



  • die Registrierung und Verarbeitung:

    1. dein Fenster muss in die Zwischenablagen-Sicht-Kette (Clipboard View Chain) aufgenommen werden:
    nextClipboardViewer=SetClipboardViewer(hwnd); // nextClipboardViewer ist das nächste Fenster, dass auch über die Zwischenablage bescheid wissen will
    

    wichtig hierbei ist, dass du den Rückgabewert irgendwo speicherst (z.B. static in der WndProc oder global), den brauchst du später noch

    1. bei einer Änderung der o.g. Kette kriegst du die Nachricht WM_CHANGECBCHAIN hier hat sich evtl. das nächste Fenster in der Kette geändert:
    case WM_CHANGECBCHAIN:
    	if(nextClipboardViewer==(HWND)wParam){ // hat sich unser nächstes Fenster geändert?
    		nextClipboardViewer=(HWND)lParam; // dann kommt jetzt dieses nach uns
    		return 0;
    	}
    	else SendMessage(nextClipboardViewer, WM_CHANGECBCHAIN, wParam, lParam); // war nicht unser nächstes, die Nachricht in der Kette weiterreichen
    	return 0;
    
    1. bei einer Änderung des Inhalts in der Zwischenablage empfägst du WM_DRAWCLIPBOARD:
    case WM_DRAWCLIPBOARD:
    	SendMessage(nextClipboardViewer, WM_DRAWCLIPBOARD, wParam, lParam); // die anderen Viewer wollen das auch wissen
    	// hier kannst du jetzt z.B. die Anzeige des Inhalts aus der Zwischenablage aktualisieren
    	return 0;
    
    1. deine Anwendung wird beendet:
    case WM_DESTROY:
    	ChangeClipboardChain(hwnd, nextClipboardViewer); // nimm dein Fenster aus der Kette heraus
    	return 0;
    

    der Zugriff:

    1. ist der Inhalt in der ZA (Zwischenablage) in einem für uns verständlichen Format:
    IsClipboardFormatAvailable(CF_TEXT); // z.B. im Clipboard Format - Text
    IsClipboardFormatAvailable(CF_BITMAP); // oder ein Bild
    
    1. an die eigentlichen Daten rankommen (na endlich):
    HANDLE hData;
    	LPVOID pData;
    	if(!IsClipboardFormatAvailable(CF_TEXT)){ // können wir auch wirklich was mit den Daten anfangen?
    		MessageBeep(0);
    		return 0;
    	}
    	if(OpenClipboard(hwnd)){ // zur Synchronisation mit dem Rest der Welt
    		hData=GetClipboardData(CF_TEXT); // Handle auf die Daten holen
    		pData=GlobalLock(hData); // Zeiger auf die Daten holen
    		MessageBox(hwnd, static_cast<char*>(pData), "Der Inhalt in der ZA:", 0); // hier erfolgt der eigendliche Zugriff auf die Daten
    		GlobalUnlock(hData); // den Zugriff auf den Globalen Speicher wieder freigeben
    		CloseClipboard(); // Clipboard schließen, wichtig nicht vergessen, sonst hat keiner mehr Zugriff auf die ZA
    	}
    

    natürlich kann man noch mehr Sachen mit der ZA machen, siehe MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/dataexchange/clipboard.asp


Anmelden zum Antworten