auch, wenn das Programm schon läuft? wie komm ich da dran, bitte?
habe eben festgestellt, das es nicht reicht, nur die EXE umzubenennen.
Wie die Exe heist ist egal.
Der Name in der Kopfzeile, den ich im Text des Forms eintrage wird benötigt.
Habe ich eine Chance, in der laufenden Anwendung den Text der Kopfzeile der Windows-Form zu ändern?
Die Klasse "Form1" hat so keine ".Text", auf die ich zugreifen könnte.
Da gibt es doch bestimmt einen "Umweg"?
ok, also "Dumm.exe" erstellen, diese dann umbenennen und dann starten.
ich möchte einfach einen Eintrag in der Taskmanger-Liste der laufenden Prozesse/task erreichen. der soll nicht mal was machen, einfach nur "da sein".
Ich übe das noch und gucke, wie ich was erreichen kann.
Den Unterschied Task/Thread gucke ich mir an. Danke für den Hinweis.
Ich möchte als Test und zum spielen mit c# (Microsoft Visual Studio Community 2019)
folgendes erreichen:
Eine Windows-Form soll eine Textbox haben, dort soll man einen Text eingeben können.
Wenn man dann auf den Button "Start" klickt, wird ein (Dummy)-Task erzeugt, der den Namen hat, der in der Textbox steht.
Der muss nichts weiter machen. als nur in der Taskliste (Taskmanager) mit dem spez. Namen zu erscheinen.
Wie bekomme ich es hin, das ich eine Variable mit dem Inhalt der Textbox als Namen für den Task nutze (hier fest "taskname2")?
Task t = Task.Run(new Action(taskname2));
Console.WriteLine("läuft") ;
Und wie "kille" ich dann diesen wieder?
Wenn ich das aber richtig verstanden habe, gibt es (im Gegensatz zu "Kill") diese Art der "Pause" für einen Prozess nicht in c#?
Habe mal versucht mir was anzulesen.
https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide
oder auch
http://openbook.rheinwerk-verlag.de/visual_csharp/visual_csharp_09_001.htm
Wie bekomme ich von der erzeugten "Engine" einen Aufruf hin und kann als Parameter das Output-Device und den Titel übergeben?
Wenn ich "engine" in anderen Methode aufrufe, wissen die nicht was damit gemeint ist und sagen mit dann: > Fehlermeldung:
The name 'engine' does not exist in the current context
Und wenn ich das alles wie zuvor in einem "Rutsch" mache, dann hab ich das "GUI blockerit"-Thema.
Hab nun versucht alles Funktionen zu "bauen".
eine zum sound abspielen, 2 zum buttontext anpassen.
Nun habe ich das Problem, das ich die Variablen nicht in die Funktion bekomme, bzw wenn ich im neuen Thread auf die Werte der Combobox zugreife eine Exeption bekomme.
(Komischerweise mit deutschem Fehlertext, obwohl VS auf englisch steht.)
$exception {"Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement comboBox1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."} System.InvalidOperationException.
Ich versuche gerade ein Thema zu finden, das die Übergabe von Werten an den Thread beahndelt.
Das muss, soweit ich herausgefunen habe, beim "new Thread" mit übergeben werden.
Doof, das ich die Engine im neuen Thread erzeuge, und in anderen Funktionen drauf zugreife mag.....
(suche noch)...
der Code sieht nun so aus:
void soundausgeben ()
{
var song = textBox1.Text;
int output = comboBox1.SelectedIndex;
ISoundDeviceList sndDev = new ISoundDeviceList(SoundDeviceListType.PlaybackDevice);
ISoundEngine engine = new ISoundEngine(SoundOutputDriver.AutoDetect, SoundEngineOptionFlag.DefaultOptions, sndDev.getDeviceID(output));
try
{
engine.Play2D(song, false);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
engine.RemoveSoundSource(song);
this.Invoke((Action)buttonplaysetzten);
}
void buttonplaysetzten()
{
button1.Text = "play";
textBox1.Enabled = true;
comboBox1.Enabled = true;
engine.currentlyPlayingSound.Stop();
engine.RemoveSoundSource(song);
MessageBox.Show("Stop by buttonplaysetzten"); //zum testen
}
void buttonstopsetzen ()
{
button1.Text = "stop";
textBox1.Enabled = false;
comboBox1.Enabled = false;
}
private void button1_Click_1(object sender, EventArgs e)
{
if (button1.Text == "play")
{
buttonstopsetzen ();
new Thread(soundausgeben).Start () ;
}
else if (button1.Text == "stop")
{
buttonplaysetzten();
}
}
}
auch wenn es nicht "sauber" ist, hier mal der komplette Code vom Button1:
private void button1_Click_1(object sender, EventArgs e)
{
if (button1.Text == "play")
{
button1.Text = "stop"; // und DAS passiert nicht sofort, sondern erst wenn der Sound fertig ist!
textBox1.Enabled = false;
comboBox1.Enabled = false;
var song = textBox1.Text;
int output = comboBox1.SelectedIndex;
ISoundDeviceList sndDev = new ISoundDeviceList(SoundDeviceListType.PlaybackDevice);
ISoundEngine engine = new ISoundEngine(SoundOutputDriver.AutoDetect, SoundEngineOptionFlag.DefaultOptions, sndDev.getDeviceID(output));
try
{
engine.Play2D(song, false);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
while (engine.IsCurrentlyPlaying(song) == true)
{
Thread.Sleep(500);
}
engine.RemoveSoundSource(song);
// button1.Text = "play"; // ist zu schnell erledigt, da der Song zu erst gespielt wird - optisch sieht man das nie.
textBox1.Enabled = true;
comboBox1.Enabled = true;
}
else if (button1.Text == "stop")
{
//engine.currentlyPlayingSound.Stop();
//engine.RemoveSoundSource(song);
MessageBox.Show("Stop by stop");
button1.Text = "play";
}
Das Thema mit "sauber" programmieren werde ich dann gerne mal lernen und das kleine Projekt hier dazu nutzen um Eure Vorschläge umzusetzen.
Danke schon mal für die Unterstützung und die Geduld mit mir.
wenn ich alles auskommentiere, und nur das "text = "xxx" nutze, dann geht da auch.
Ich gucke mir das Thema mit dem blockierten GUI mal an und versuche das umzusetzen.
hallo, und danke für die Antworten.
Hallo,
ich möchte den vorhandenen Text des Buttons von "play" auf "stop" setzten, wenn dieser gedrückt wurde.
dazu habe ich folgendes eingebaut:
Windows-Form-Anwendung unter VS2017:
private void button1_Click_1(object sender, EventArgs e)
{
if (button1.Text == "play")
{
textBox1.Enabled = false;
comboBox1.Enabled = false;
button1.Text = "stop";
......noch mehr code.......
In der Initalisierung und in den Properties ist der Text des Buttons auf "play" gesetzt worden.
Nehme ich ein frisches Projekt und mache dort das gleiche, dann funktioniert das.
Auch funktionieren alle anderen beiden Anweisungen im Beispiel oben.
Nehme ich alle Funktionen - bis auf die Zeile "button1.text = "xxx";" raus, ändert sich der Text komischer weise. Auch wenn es die erste Zeile wird.
Wo kann ich nun weiter suchen, warum der Text nicht geändert wird?
nein, ich wunder mich nicht.
Habe aber durch das Beispiel oben das hier gefunden, was ich nun austeste.
Ja, mir fehlen Grundlagen der Programmierung.
Bin kein Student mehr, habe einen Job, Kind, Frau, Haus - und bastel in der noch verbleibenden Freizeit was rum...
int output = comboBox1.SelectedIndex;
ISoundDeviceList sndDev = new ISoundDeviceList(SoundDeviceListType.PlaybackDevice);
ISoundEngine engine = new ISoundEngine(SoundOutputDriver.AutoDetect, SoundEngineOptionFlag.DefaultOptions, sndDev.getDeviceID(output));
Das geht wie erwartet und ädnert das Device.
Ändere ich dann in der Combobox einen Eintrag, ändert sich auch die Ausgabe auf das andere Device.
Obwohl:
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//
}
Das da leer ist.... grübel
Nun finde ich Code-Beispile für das Wählen des Output-Device, aber das scheint nur c++ zu sein.
Auch verstehe ich nicht, was da passiert.
https://www.ambiera.com/irrklang/docu/index.html#enumeratingDevices
Fragen dazu:
* was macht das ""(Strenchen) hinter "ISoundEngine"?
* was macht "createIrrKlangDevice()? Oder wie bekomme ich das in meinem Beispiel hin?
Wenn ich das via copy&paste in meinen Code einbaue hagelt es logischerweise Fehler.
Ich versuch mal weiter.....
Vielen Dank für diesen Hinweis.
Das kopieren der ikpMP3.dll in den bin\Debug-Ordner brachte Abhilfe.
Ich höre nun den Sound!
Infos zur Idee, das Thema "Sound (hier: mp3) auf Record-(ausgabe)-Device".
Welche Alternative schaue ich mir denn nun am besten mal an?
Andere Frage:
gerne guck ich mir da was an. aber "was" . gefunden habe ich "MCI" (finde heir aber nur C++-Beispiele auf der MSDN-Seite)
und "Bass.net" von radio42.
Lese mich grade mal in Bass.Net ein.... (scheint aber kein frei verfügbares Produkt zu sein...)
Nur die Tiefe habe ich noch nicht, ob meine Anforderungen da umsetzbar sind.
Das Auskommentrieen hat keinerlei Auswirkung.
Ich höre weiterhin nichts, ein Fehler kommt nicht, die "Ende"-Meldung kommt wie erwartet.
Ich versuche ein Paralel-Porjekt mit einer Testausgabe.
Ja, im Ordner sind Beispiele, auch genau für .NET.
Daran habe ich mich auch gehalten.
Im Beispiel "Hello World" ist im "Class1.cs" beschrieben wie es geht.
Instanz erzeugen: "ISoundEngine engine = new ISoundEngine();"
und dann
Sound abspielen: "engine.Play2D("../../media/getout.ogg", true);" (hier "looped").
Ich habe mich für IrrKlang entschieden, da hier die Ausgabe auch auf mehrere Devices möglich ist/sein soll.
Was Alternativen so können hab ich noch nicht untersucht.
Wenn die gefundenen Links nicht auf ungültige Seiten zeigen, guck ich da gerne mal.
So.. da bin ich wieder.
Hatte was gedauert, aber ich habe mir Eure Ratschläge angesehen und hoffentlich gelernt.
* Mein VS ist nun auf "english", Sprache wurde nach installiert.
* Die Combobox 1 aus dem Beispiel von IrrKlang habe ich als Ziel für das Erstellen der Deviceliste raus genommen und
mit unter die "InitializeComponent();" gepackt.
Ergebnis: Die Combobox ist zum Start gefüllt, und ich lasse mit "comboBox1.SelectedIndex = 0;"
das erste Device auswählen.
Ziel: Bei "comboBox1_SelectedIndexChanged" möchte ich ein anderes, schon vorhandenes Device wählen und benutzten.
Was ich bei IrrKlang im Forum finde sind Beispiele in "c++" und dort wird beschrieben, das man das Device irgendwie an die Instanz von "ISoundEngine" üebrgeben muss.
ISoundEngine* engine = createIrrKlangDevice(irrklang::ESOD_AUTO_DETECT,
irrklang::ESEO_DEFAULT_OPTIONS,
deviceID);
Alle vorhandenen Devices habe ich ja schon, muss ich also nicht neu einlesen.
Diese würde ich, so mein Verständnis, als Index der Combobox1 finden.
Die Combobox lass ich jetzt erst mal in Ruhe und widme mich dem Abspielen.
Dazu habe ich einen Button gebaut:
private void button1_Click(object sender, EventArgs e)
{
var song = textBox1.Text;
var output = comboBox1.SelectedItem;
ISoundEngine engine = new ISoundEngine();
try
{
engine.Play2D(song, false);
engine.Play2D("d:\\1.mp3");
}
catch (Exception)
{
MessageBox.Show("fehler");
}
engine.RemoveSoundSource(song);
MessageBox.Show("ende");
}
In Textbox1 ist der komplette Pfad zu einer MP3-Datei angegeben, die Datei "d:\1.mp3" ist auch vorhanden und diese lassen sich beide mit normal abspielen.
Soweit der Stand.
Und bevor ich das mit dem Device machen, möchte ich erst mal überhaupt ein MP3 abgespielt bekommen.
Ah ok, danke.
Hier ein Beispiel, das ich im Netz gefunden habe, um das Output-Device zu bestimmen.
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//Get the list of installed sound devices.
var sdl = new IrrKlang.ISoundDeviceList(IrrKlang.SoundDeviceListType.PlaybackDevice);
//Add each device to a combo box.
for (int i = 0; i < sdl.DeviceCount; i++)
{
comboBox1.Items.Add(sdl.getDeviceDescription(i) + "\n");
}
}
Das habe ich so bei mir eingebaut, der Code gibt keinen Fehler, aber die Cobobox bleibt leer.
Erwartet hätte ich hier die Auflistung meiner Devices.
Das "var" vor dem ersten "sdl" habe ich eingebaut und weiche damit vom Beispiel schon ab, gibt aber sonst eine Fehlermeldung "sdl im aktuellen Konterxt nicht gefunden".
Ja, das habe ich schon gesehen. Die Beispiele dort drehen sich aber um eine Consolenausgabe.
In den Beispielen klappt das auch immer wunderbar, aber nicht, wenn ich das in mein Projekt einbaue.
Meine Anfänger-Probleme sind dann, die gesehenen Beispiele auf meine Anwendung umzusetzen und die Warnings und Fehler aus zu bügeln. Zumal die Beispiele alle auf englisch sind, meine VS2012 auf Deutsch ist und die Übersetzung auch nicht immer so einfach ist.
Was wäre denn eine gutes "Austauschforum für Anfänger", in dem man seine Code-Beispiele posten und diskutieren kann?
Ah! Danke. Meine Versuche waren immer auf die "IrrKlang.DLL" gerichtet.
Nun habe ich die "irrKlang.NET4.dll" genommen und das klappt!
Danke dafür!
Der Fehler ist um weg, dafür steht nun dafür ein Warning:> Fehlermeldung:
Warnung 1 Konflikt zwischen Prozessorarchitektur des Projekts "MSIL", das erstellt wird, und der Prozessorarchitektur des Verweises, "irrKlang.NET4", "AMD64". Dieser Konflikt kann zu Laufzeitfehlern führen. Ändern Sie ggf. mithilfe des Konfigurations-Managers die als Ziel angegebene Prozessorarchitektur Ihres Projekts so, dass die Prozessorarchitekturen zwischen Ihrem Projekt und den Verweisen ausgerichtet werden, oder wählen Sie eine Abhängigkeit von Verweisen mit einer Prozessorarchitektur, die der als Ziel angegebene Prozessorarchitektur Ihres Projekts entspricht.
Unter den Projekt-Eigenschaften versuche ich die .net-Version (akt. 4.5) zu ändern (auf 4.0) aber das bringt nix. Der Fehler > Fehlermeldung:
Namespace nicht gefunden erscheint wieder und dazu ein Warnung: > Fehlermeldung:
Warnung 2 Der primäre Verweis "irrKlang.NET4" konnte nicht aufgelöst werden, da er anhand des ".NETFramework,Version=v4.5"-Frameworks erstellt wurde. Dabei handelt es sich um eine höhere Version als das aktuelle Zielframework ".NETFramework,Version=v4.0". Soundbar
-
Also stell ich wieder auf 4.5 zurück. Bei "Erstellen" und "Zielplatform" CPU-Type habe ich "any" und "32 bit bevorzugen" aktiv.
Unter "Verweispfade" ist nichts mehr eingetragen.
-
Wo guck ich nun weiter?
bin ich dann als "Anfänger" hier falsch?
Ich befolge die in den FAQ und Forum angegebenen Hinweise, die LIB und INCLUDE Ordner der IrrKlang-Sachen in den Eigenschaften des Projektes mit an zu geben, ich denke mal, das hier die Verweispfade gemeint sind.... (org: "You only need to add the include path to your options and link with the irrklang.lib "
Hallo und danke für die rasche Antwort.
Das ist alles bestimmt gut und brauchbar, aber auch für mich als Anfänger nicht umsetzbar.
Ebenso wie IrrKlang kann ich auch diese Pakete nicht in mein Projekt einbinden.
Was muss sich machen, damit ich IrrKlang im Projekt nutzen kann?
Dort habe ich die Verweispfade auf die Ordner "lib" und "include" von IrrKlang gesetzt.
Was fehlt?
Ziel: MP§'s als Ressource mit in die EXE zu packen und auf einen Button-Click abzuspielen. Simple "Soundleiste" a la "Stefan Raab"
Hallo,
Frage zur Irrklang.
Ich bin (als Anfänger) dabei zu lernen und bei der Suche nach Möglichkeiten, die Soundausgabe auf ein "wählbares" Device zu legen, auch auf IrrKlang gestoßen.
Bei mir scheitert es aber schon daran, das ich in meinem Projekt in den Eigenschaften die "Verweispfade" für das LIB und INCLUDE von Irrklang angegeben habe, aber trotzdem ein simples "using Irrklang" einen Fehler wirft mit :> Fehlermeldung:
Der Typ- oder Namespacename "Irrklang" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)"
Using mache ich ja, wo stelle ich ggf. was um wegen dem "Assemblyverweis"?
Ich nutze VS2012 auf Win10 und habe irrKlang-64bit-1.6.0 entpackt in einem Ordner - paralell zu meinem Projekte-Ordner liegen.
Ziel soll es sein, eine "EXE" zu erstellen, die ohne Installation oder zusätzliche DLL lauffähig ist.
Daher wollte ich alles in das Projekt rein verlinken.
Das Programm soll eine Windows-Form werden und in eine Combox haben, die alle Sounddevices auflistet und mindestens eins davon ausgewählt ist.
Wenn möglich soll man dort (in V2.0) auch ein weiteres Ausgabe-Device wählen.
Aber im ersten Schritt soll erst mal nur das Ausgabe-Device auswählbar sein (so es denn mehrere gibt).
Die Seite von https://www.ambiera.com habe ich im FAQ und Forum schon durch sucht, aber als Neuling ist das alles nicht so einfach zu verstehen.
Ggf. kann mir Hier jemand für solche "Basics" kurz erklären, was ich da anders machen muss.
So - ich hoffe, ich habe genug Infos geliefert - und den richtigen Thread gefunden.
Danke schon mal.
Hallo,
mein Testing-Projekt schreitet voran und ich habe ein kl. Windows-Form geschrieben, das via WebClient auswählbar (ComboBox) 3 versch. Testdateien von einem Server lädt. Dabei wird Dateigröße und die Downloadrate gemessen. Funktioniert soweit wie gewünscht.
Nun hätte ich gerne eine Option im Programm, das man nicht nur die diversen einzelnen Test-Daten auswählt und runter lädt, sondern zusätzlich auch die Möglichkeit hat, 500 1k Dateien zum testen zu laden. Das wäre dann eine zusätzliche Option in der ComboBox.
Der Quell- und Ziel-Ort und die Dateinamen sind bekannt.
Wie kann ich nun eine Progress-Bar erzeugen, die über den kompletten Download geht und nicht nur die einzelnen Dateien betrachtet. Wichtig ist nachher zu wissen, wie schnell die Dateien in Summe ankommen, nicht jede einzeln.
Ich würde in einer Schleife starten und mit einer Stoppuhr die Start- und Endezeit nehmen. Aber wie mach ich das mit der Progressbar?
Hab es angepasst. Ich habe eine Windows-Form-Anwendung.
Danke für Deine Antwort, ich versuche das mal da irgendwie einzubauen, das der Proxy benutzt wird.
Ich habe mal zum testen folgendes eingefügt:
webClient.Proxy = WebRequest.GetSystemWebProxy();
string proxyadr = webClient.Proxy.ToString();
MessageBox.Show(proxyadr);
Die Info zeigte dann:
System.Net.WebRequest+WebProxyWrapperOpaque
Was mir aber nix sagt. Eine Suche dazu erfolgte, aber eine Lösung dazu habe ich noch nciht gefunden.
Hallo,
als "Frischling" eine Frage: Ich habe ein
webClient.DownloadFileAsync(URL, location);
das funktioniert in einer Umgebung ohne Proxy auch so wie es soll.
Nun bekomme ich aber hier in der Umgebung, in der es benutzt werden soll zu einem 401, weil eine Proxy-Benutzung Pflicht ist.
Der normale Benutzer hat keine Reche, die Systemeinstellungen für den Proxy zu konfigurieren oder die Einstellungen zu sehen.
Bei den Netzwerkeinstellungen seht nur die Adresse zu einem Script, das die Einstellung macht.
Es ist auch keine pers. Anmeldung am Proxy erfordelich usw.
Im MSDN habe ich zwar die WebProxy-Klasse gefunden, aber dort wird - so ich das verstehe - zwingend eine Adresse für den Proxy benötigt.
Wie gehe ich damit am besten um und kann z.b. die Proxy-Default-Settings des Systems nutzen oder so? Für Anregungen dankbar.
Hallo und danke für die richtige Richtung.
Den Inhalt des Projektes habe ich mir mal angesehen, aber es übersteigt meine Fähigkeiten stark.
So ist es mir nicht möglich zu identifizieren, wo und wie ich das in ein bestehendes Projekt integrieren könnte.
Mein Programm hat noch ein K.O.-Kriterium zu erfüllen. Es darf keinen Installer o.ä. haben, da es auf Windows-Umgebungen mit stark beschränkten Rechten eingesetzt wird.
So bekommt der Benutzer nur eine ZIP-Datei mit der EXE darin. Mehr nicht.
Das mit dem Mausklick wäre eine feine Erweiterung, aber ohne "Mentor" oder einen Grundkurs an der VHS werde ich das nicht leisten können.
Für eine Stoppuhr (Windows-Form-Anwendung, Framework 4.5, VS2012) in der es einen Button gibt, mit dem man die Stoppuhr startet sowie nach dem Starten auch wieder stoppen kann, möchte ich eine Erweiterung einfügen.
Es soll ein neuer Button (oder eine Möglichkeit) eingebaut werden, der die Stoppuhr "scharf" schaltet.
Wenn das Scharfschalten erfolgt ist, soll auf den nächsten Mausklick hin, der in einem anderen Fenster (z.B. webbrowser) erfolgt, soll diese dann loslaufen.
Das Stoppen kann durch einen Klick auf den Button erfolgen, mit dem das gestartet wurde. Die Stoppuhr hat die Möglichkeit immer im Vordergrund zu bleiben.
Nur kenne ich mich als Beginner nicht aus mit den Möglichkeiten so ein Maus-Event abzufangen und als Starttrigger für eine Funktion in meinem Programm zu nutzen.
Es gibt da doch bestimmt auch Sicherheits-Probleme, die es zu überwinden gilt.
Windows lässt das nicht so einfach zu - oder?
Für Anregungen dankbar.
Hallo "Gemeinde",
vielen Dank für die doch motivierenden Worte. 👍
Mein Timer-Problem habe ich lösen können. Es lag an einer Zeile, die nicht in der Datei des codes sondern in der designer.cs lag.
Ein "this.timer1 = new System.Windows.Forms.Timer(this.components);" und der Timer funktioniert nun auch im neuen Projekt.
Meine anderen Fragen werde ich dann mal in der angesprochenen Ecke stellen.
Danke Euch!
Hallo,
als kleine Erklärung. C# und VS nutze ich in der Freizeit um kleine Tools zu bauen.
Meist Sachen (wie meine Stoppuhr), die es schon irgendwie gibt, aber das eine oder andere fehlt.
Angefangen habe ich mit solchen kleinen Sachen mit Delphi. Das ist aber schon ewig her.
Nun hatte ich ein Projekt in VS2010 und hab es nach VS2012 migriert.
Funktioniert auch alles soweit, aber es scheint Unterschiede zu geben, die sich mir nicht sofort eröffnen.
In meiner Stoppuhr gibt es einen timer und ich habe eine Textbox, in der ich das Datum und die Uhrzeit anzeigen möchte. Im alten Projekt hat das funktioniert, im neuen bleibt das Fenster leer.
Wenn ich doch hier schreiben kann, dann bitte: wo?
Danke.