C++ Ausgabe in Zwischenablage kopieren.

iJerkface

Lieutenant
Registriert
März 2012
Beiträge
665
Hi Leute ,
ich habe ein Programm programmiert (für nen Gameserver , um Gutscheincodes zu registrieren und zu vergleichen) mit dem eben diese Gutscheincodes im Wert von 5 , 10 oder 15 € generiert werden.

Was ich aber machen möchte :

Der Code der mir ausgegeben wird , soll automatisch in die Zwischenablage kopiert werden , also als ob ich den Code markiert und STRG+C gedrükt hätte.

" Aber iJerkface , du könntest doch einfach den Code per Mauszeiger kopieren und gut is? ".
Ne , is nicht. Ist ja ne Consolenanwendung in der ich per Mauszeiger eben nichts kopieren kann. :/ .

Nunja , hat jemand ne Lösung?

Code poste ich auf Wunsch auch hier im Thread.
 
Hier mal ein Anfang:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms649048(v=vs.85).aspx
Und hier sogar C-Code, wie du es anstellen kannst:
http://msdn.microsoft.com/en-us/lib...x#_win32_Copying_Information_to_the_Clipboard
Und die relevanten Teile sind grob:
Code:
if (!OpenClipboard(hwndMain)) 
        return FALSE; 
    EmptyClipboard(); 
hglbCopy = GlobalAlloc(GMEM_MOVEABLE, 
            (cch + 1) * sizeof(TCHAR)); 
        if (hglbCopy == NULL) 
        { 
            CloseClipboard(); 
            return FALSE; 
        } 
 
        // Lock the handle and copy the text to the buffer. 
 
        lptstrCopy = GlobalLock(hglbCopy); 
        memcpy(lptstrCopy, &pbox->atchLabel[ich1], 
            cch * sizeof(TCHAR)); 
        lptstrCopy[cch] = (TCHAR) 0;    // null character 
        GlobalUnlock(hglbCopy); 
 
        // Place the handle on the clipboard. 
 
        SetClipboardData(CF_TEXT, hglbCopy); 
CloseClipboard(); 
 
    return TRUE;
 
Bahnhof.
 
Du wolltest wissen wie du Daten in die Zwischenablage kopieren kannst, wir haben dir die Funktion(en) geliefert. Anwenden musst du es schon allein.
 
Code:
#include <cstdlib>
#include <iostream>

using namespace std;
void Zufall1 () // für den 5€ Code.
{
cout << " " << endl;
cout << " IL-" ; // IL- Vor den ersten Zahlenpaaren wird ausgegeben.
for (unsigned u = 0; u < 2; u++) 
{
cout << 1 + rand() % 9 ; 
}   
cout << "-" ;
for (unsigned u = 0; u < 2; u++) 
{
cout << 1 + rand() % 9 ; 
}
cout << "-" ;
for (unsigned u = 0; u < 2; u++) 
{
cout << 1 + rand() % 9 ; 
}
cout << "-" ;
for (unsigned u = 0; u < 3; u++) 
{
cout << 1 + rand() % 9 ; 
}    
cout << "-5 " << endl;
cout << " " << endl;
cout << " Programmiert und entworfen von Daniel Siegel , 2012 " << endl ;
}

void Zufall2 () // für den 10€ Code.

{
cout << " " << endl;
cout << " IL-" ;
for (unsigned u = 0; u < 2; u++) 
{
cout << 1 + rand() % 9 ; 
}   
cout << "-" ;
for (unsigned u = 0; u < 2; u++) 
{
cout << 1 + rand() % 9 ; 
}
cout << "-" ;
for (unsigned u = 0; u < 2; u++) 
{
cout << 1 + rand() % 9 ; 
}
cout << "-" ;
for (unsigned u = 0; u < 3; u++) 
{
cout << 1 + rand() % 9 ; 
}    
cout << "-10 " << endl;
cout << " " << endl;
cout << " Programmiert und entworfen von Daniel Siegel , 2012 " << endl ;
}

void Zufall3 () // für den 15€ Code.

{
cout << " " << endl;
cout << " IL-" ;
for (unsigned u = 0; u < 2; u++) 
{
cout << 1 + rand() % 9 ; 
}   
cout << "-" ;
for (unsigned u = 0; u < 2; u++) 
{
cout << 1 + rand() % 9 ; 
}
cout << "-" ;
for (unsigned u = 0; u < 2; u++) 
{
cout << 1 + rand() % 9 ; 
}
cout << "-" ;
for (unsigned u = 0; u < 3; u++) 
{
cout << 1 + rand() % 9 ; 
}    
cout << "-10 " << endl;
cout << " " << endl;
cout << " Programmiert und entworfen von Daniel Siegel , 2012 " << endl ;   // Infos zum Programm.  
}
void ChuckNorris () // CHUCK NORRIS !!
{
for (int i = 0; i<666; i++)
{
    cout << " Chuck Norris ! " << endl; // Chuck Norris wird 666mal Ausgegeben.
}     
}
    
int main(int argc, char *argv[])
{ 
    std::srand(time(0)); // Nimm als Generatorgrundlage für die Codes die derzeitige Systemzeit.
    int modus ;
 cout << " Waehlen sie\n 1 fuer  5Euro \n 2 fuer 10Euro \n 3 fuer 15Euro " << endl;
 cin >> modus ;
 if (modus == 1 ) Zufall1(); // Wählt die 5€ Funktion aus
 if (modus == 2 ) Zufall2(); // Wählt die 10€ Funktion aus.
 if (modus == 3 ) Zufall3(); // Wählt die 15€ Funktion aus.
 if (modus == 666 ) ChuckNorris(); // CHUCK NORRIS!

    system("PAUSE");
    return EXIT_SUCCESS;
}

So. Die Codes der 5€ , 10€ und 15€ Funktion sollten in die Zwischenablage kopiert werden.
Jedoch werden die Codes ja nicht komplett , sondern als Einzelstücke ausgegeben , erscheinen aber nur komplett in einer Zeile in der Console ,weil ich das <<endl; weglasse.

Wie schaff ich es diese Codes dann in die Zwischenablage zu bekommen? :(
 
Zuletzt bearbeitet:
Hi,

ich glaub für die Windows API ist noch etws zu früh, du solltes erstmal versuchen dein Code etwas kompakter zu gestalten. du machst fast alle 3 Zeilen das gleiche.
Schon mal überlegt deine Zahlen erstmal in ein Array oder std.vector zu generieren, und dann später mit einmal auszugeben.

sollte dir der Weg über die WinAPI zu schwer erscheinen könnte man noch die Daten temporär in eine Datei schreiben und bei Bedarf wieder einlesen. gehört aber nicht unbedingt zum guten Stil.

Wenn ich aber dein Code so sehe, empfehle ich dir erstmal noch weitere Bücher zu lesen.
Das mußt du jetzt aber nicht böse auffassen, wir haben alle mal angefangen.

mfg Martem
 
Also um mal Tipps zu geben:
1. Typofehler: Zufall3 hat ne 10 am Ende wie Zufall2 (du willst sicherlich 15 schreiben)
2. Wie wärs mit
Code:
std::string Zufall(int wert)
{
std::stringstream ret="";
ret<<"IL-";
for(int i=0;i<9;++i)
{
ret<<(1+rand()%9);
if(i==1||i==3||i==5)
ret<<"-";
}
ret<<"-"<<wert;
return ret.str();
}
 
@Martem , ja , dies ist mir auch aufgefallen. Den Code hab ich mittlerweile auch etwas kürzer gefasst.
Welche Bücher ich lesen soll und was genau sie mir bringen sollen -> Keine Ahnung :D
Ergänzung ()

@ Hancock , bin ja noch in den Anfängen meines Lernstadiums , verstehe also nicht ganz wie ich den Code den du oben gepostet hast benutzen soll , da mir beispielsweise das :
Code:
ret<<(1+rand()%9);
if(i==1||i==3||i==5)

Nicht weiterhilft , weil unverständlich. randfunktion ist drin , ok.
Aber was soll dieses ->
Code:
ret<<"-";
ret heißen?
 
rand() % x gibt dir eine Zufallszahl im Bereich 0 bis x - 1. % ist der Modulo-Operator, d.h. er gibt dir den Rest einer Division zurück.

4 % 3 ist 1 Rest 1 (1 bekommst du zurück)
5 % 3 ist 1 Rest 2 (2 bekommst du zurück)
6 % 3 ist 2 Rest 0 (0 bekommst du zurück)
usw.

Du bekommst also einen Wert zwischen 1 + (Zufall() % 9 = [0;8]) zurück, ergo einen Wert zwischen [1;9]. Wenn nun also i in {1,3,5} ist, gibt er dir zusätzlich zur Zahl einen Bindestrich mit in den String.
 
hi,


std::stringstream ret=""; //wird als leer initialisiert
ret<<"IL-"; //die Zeichenkette IL- wird am Ende hinzugefügt


ret ist hier der Variablenname vom Typ std::stringstream
Stringstreams

ret<<(1+rand()%9); // hier wird eine deiner Zufallszahlen am Ende hinzugefügt
if(i==1||i==3||i==5)ret<<"-"; // wenn eine der Bedingungen erfüllt ist gibst noch zusätzlich ein Bindestrich hinter deiner Zahl

nach der Schleife müßte es in ret jetzt folgendermaßen aussehen
IL-xx-xx-xx-xxx , wobei x eine deiner Zufallszahlen ist


ret<<"-"<<wert; // jetzt wird ret noch ein Bindestrich und den WERT der Variable wert hinzugefügt, der in deinem Fall 5, 10 oder 15 seien kann
return ret.str(); // ret wird wie in der Function deklariert als std::string zurückgegeben

In ret sieht es jetzt so aus IL-xx-xx-xx-xxx-wert

mfg Martem
 
Code:
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{ int wert ;
   
              std::string Zufall(int wert);
   
              cout << " Gib deinen Wert der Gutscheinkarte an" << endl;
              cin >> wert ;
    
    std::stringstream ret="";
    ret<<"IL-";
    for(int i=0;i<9;++i)
    {
    ret<<(1+rand()%9);
    if(i==1||i==3||i==5)
    ret<<"-";
    }
    ret<<"-"<<wert;
    return ret.str();
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}
Richtig angewendet?

Bekomme nen Fehler in der Zeile std::stringstream ret ="";
Ergänzung ()

variable std::stringstream ist Intialisiert , hat jedoch einen unvollständigen Type.?
 
Code:
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <sstream>
#include <string>
#include <ctime>

using namespace std;

//Vorwärtsdeklarationen
std::string GetCouponCode(int wert);
int			GetRandom( int min, int max);


int main(int argc, _TCHAR* argv[])
{
	int tInput = -1;
	std::srand(time(0)); 
	
	while(tInput != 0)
	{
		if( tInput < 0 || tInput > 3 ) cout <<endl <<"Eingabe (0) zum beenden, (1) 5 Euro, (2) 10 Euro (3), 15 Euro"<< endl<<endl;
		cout <<"deine Eingabe :";
		cin >>tInput;	
		if( tInput > 0 && tInput < 4 )	cout<<"dein Code     :" <<GetCouponCode( tInput*5 )<<endl<<endl;
	}
	return 0;
}

//leicht angepast und Name geändert
std::string GetCouponCode(int wert)
{
	std::stringstream ret;
	ret.clear();
	ret<<"IL-";
	
	for(int i=0; i<9; ++i)
	{
		ret<<GetRandom(1,9); //(1+rand()%9);
		if(i==1||i==3||i==5)	ret<<"-";
	}
	ret<<"-"<<wert;
	return ret.str();
}

//dieser algorithmus erzeugt bessere gleichverteielte zuffalszahlen als mit dem Modulo-Operator (%)
int GetRandom( int min, int max)
{
    double r = max - min + 1;
    return min + (int)(r * rand()/(RAND_MAX+1.0));
}

hier mal eine mögliche KomplettLösung die den Vorschlag von Hancock etwas abgewandelt mit einbezieht. Zum Lernen gibts auch noch genügent Internetseiten. Google spuckt da ne Menge raus.
Wozu brauchts du eigentlich die Zwischenablage?

[edit]
und schon hat sich der Bugteufel eingeschlichen, Die Eingabe sollte noch vor unerlaubten Eingaben abgesichert werden, sonst gibts ne böse Überraschung.


mfg Martem
 
Zuletzt bearbeitet: (wie angegeben)
@Martem. Ich brauchs in die Zwischenablage weil ich zu faul bin den Code abzuschreiben :D
 
zu der std::stringstream ret=""; Zeile:
Hab am Anfang mit std::string arbeiten wollen, was m.M. nach unpraktischer ist, da hab ich dann vergessen, das ="" wegzumachen. Du kannst die std::xxx eigentlich immer unitinitalisiert lassen, da sie eig. immer einen default-Kontruktor haben, wodurch diese dann einen definierten Zustand (leer) haben.
Daher @martem ist das ret.clear() nicht notwendig.

Zu dem unverständlichen if:
Ich will die Bindestriche an bestimmten Positionen einbauen, also lass ich mit diesem if bei jeden Schleifendurchlauf prüfen, ob ein Bindestrich notwendig ist, also "Position = 1 oder 3 oder 5" und füge ihn dann an.
 
@Hancock , achso , danke.
@ Yuuri , willst du konstruktive Posts abliefern oder nerven?
Ergänzung ()

Jo , dann hab ich mein Programm. Kann geclosed werden.
 
Zurück
Oben