chis0710
Goto Top

Powershell GUI automatisch aktualisieren und trotzdem Eingaben ermöglichen

Hallo zusammen,

ich bin gerade dabei, mir Powershell etwas besser beizubringen und habe mir deshalb als Ziel gesetzt, ein Programm zu schreiben, das den DAX Kurs abrufen und in einer GUI ausgeben kann. Das Ganze funktioniert soweit auch schon, aber mein nächstes Ziel ist es, dass sich der DAX Kurs in regelmäßigen Abständen automatisch updatet (wenn der Button aktiviert ist), ich jedoch auch weiterhin die Buttons noch drücken kann (um das Ganze wieder zu deaktivieren) oder auch manuell upzudaten. Mein Problem ist, wenn ich ein start-sleep einfüge, dann schläft Powershell ja wirklich die Zeit und es kann nichts in die GUI eingefügt werden.

Mein Code sieht aktuell so aus:

# Konsole ein und ausblenden
	Add-Type -Name Window -Namespace Console -MemberDefinition '  
	[DllImport("Kernel32.dll")]  
	public static extern IntPtr GetConsoleWindow();
	 
	[DllImport("user32.dll")]  
	public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
	'  
	function Show-Console {
	   $consolePtr = [Console.Window]::GetConsoleWindow()
	  #5 show
	 [Console.Window]::ShowWindow($consolePtr, 5)
	}
	function Hide-Console {
    $consolePtr = [Console.Window]::GetConsoleWindow()
  #0 hide
 [Console.Window]::ShowWindow($consolePtr, 0)
}

Function DaxKurs{
	# Startzeit
	$Startzeit = Get-date

	# Neues Web Client Objekt erstllen
		$webClient = New-Object System.Net.WebClient

	# Daten herunterladen
		$StringWeb = $webClient.DownloadString('http://www.finanzen.net/index/Dax')  

	# Wichtige Daten in String suchen
		$IntStart = $StringWeb.IndexOf("ISIN: DE0008469008")  
		$StringAusgang = $StringWeb.Substring($IntStart,285)

	# Kurs berechnen
		$IntStartKurs = $StringAusgang.IndexOf("quoteBox") + 18  
		$IntEndeKurs = $StringAusgang.IndexOf("<span>PKT</span>")  
		$StringKurs = $StringAusgang.Substring($IntStartKurs, $IntEndeKurs-$IntStartKurs)

	# Veränderung berechnen
		$StringAusgang = $StringAusgang.SubString($IntEndeKurs + 16)
		$IntEndeVeraenderung = $StringAusgang.IndexOf("<span>PKT</span>")  
		$StringVeraenderung = $StringAusgang.Substring($IntEndeVeraenderung - 10,10)
		$StringVeraenderung = $StringVeraenderung -replace '"',"" -replace ">","" -replace "a","" -replace "b","" -replace "c","" -replace "d","" -replace "e","" -replace "f","" -replace "g","" -replace "h","" -replace "i","" -replace "j","" -replace "k","" -replace "l","" -replace "m","" -replace "n","" -replace "o","" -replace "p","" -replace "q","" -replace "r","" -replace "s","" -replace "t","" -replace "u","" -replace "v","" -replace "w","" -replace "x","" -replace "y","" -replace "z",""  
		
	# Prozentuale Veränderung berechnen
		$IntEndeProzentual = $StringAusgang.IndexOf("<span>%</span>")  
		$StringProzentual = $StringAusgang.Substring($IntEndeProzentual - 10,10)
		$StringProzentual = $StringProzentual -replace '"',"" -replace ">","" -replace "a","" -replace "b","" -replace "c","" -replace "d","" -replace "e","" -replace "f","" -replace "g","" -replace "h","" -replace "i","" -replace "j","" -replace "k","" -replace "l","" -replace "m","" -replace "n","" -replace "o","" -replace "p","" -replace "q","" -replace "r","" -replace "s","" -replace "t","" -replace "u","" -replace "v","" -replace "w","" -replace "x","" -replace "y","" -replace "z",""  

	# Uhrzeit
		$IntStartUhrzeit = $StringAusgang.IndexOf("timeSlot") + 10  
		$StringUhrzeit = $StringAusgang.Substring($IntStartUhrzeit,12)
		
	# Endzeit
		$Endzeit = get-date
		
	# Dauer berechnen
		$Dauer = NEW-TIMESPAN –Start $StartzeitEnd $Endzeit
		
		
	clear
	
	write-host Kurs vom $StringUhrzeit
	write-host $StringKurs Punkte
	write-host $StringVeraenderung Punkte
	write-host $StringProzentual Prozent
	
	$global:Uhrzeit = $StringUhrzeit
	$global:Kurs = $StringKurs + " Punkte"  
	$global:Veraenderung = $StringVeraenderung + " Punkte"  
	$global:Prozentual = $StringProzentual + " %"  
	

	
}

Function GUI{

	# Variable ob Auto Update eingeschaltet ist
		$global:AutoUpdate = 0
	
	<#
		.Size(Breite,Höhe)
	#>
	# Die ersten beiden Befehle holen sich die .NET-Erweiterungen (sog. Assemblys) für die grafische Gestaltung in den RAM.
		[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")   
		[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")   
		[System.Windows.Forms.Application]::EnableVisualStyles();
	# Die nächste Zeile erstellt aus der Formsbibliothek das Fensterobjekt.
		$objFenster = New-Object System.Windows.Forms.Form
		$objFenster.AutoScroll = $True

	# Fenster Parameter bestimmem 
		$objFenster.StartPosition = "CenterScreen"  
		$objFenster.Size = New-Object System.Drawing.Size(350,250)
		$objFenster.Text = "DAX-Kurs"  
	
	# Label für Bezeichnungen
		# Letzte Aktualisierung
			$LabelBezUhrzeit = New-Object System.Windows.Forms.Label
			$LabelBezUhrzeit.Location = New-Object System.Drawing.Size(10,45) 
			$LabelBezUhrzeit.Size = New-Object System.Drawing.Size(150,20) 
			$LabelBezUhrzeit.Text = "Letzte Aktualisierung:"  
			$LabelBezUhrzeit.Name = "BezUhrzeit"  
			$objFenster.Controls.Add($LabelBezUhrzeit)
		
		# aktueller Kurs
			$LabelBezKurs = New-Object System.Windows.Forms.Label
			$LabelBezKurs.Location = New-Object System.Drawing.Size(10,65) 
			$LabelBezKurs.Size = New-Object System.Drawing.Size(150,20) 
			$LabelBezKurs.Text = "Aktueller Kurs:"  
			$LabelBezKurs.Name = "BezKurs"  
			$objFenster.Controls.Add($LabelBezKurs)
			
		# aktuelle Veränderung
			$LabelBezVeraenderung = New-Object System.Windows.Forms.Label
			$LabelBezVeraenderung.Location = New-Object System.Drawing.Size(10,85) 
			$LabelBezVeraenderung.Size = New-Object System.Drawing.Size(150,20) 
			$LabelBezVeraenderung.Text = "Aktuelle Veränderung:"  
			$LabelBezVeraenderung.Name = "BezVeraenderung"  
			$objFenster.Controls.Add($LabelBezVeraenderung)
			
		# aktuelle Veränderung [%]
			$LabelBezProzent = New-Object System.Windows.Forms.Label
			$LabelBezProzent.Location = New-Object System.Drawing.Size(10,105) 
			$LabelBezProzent.Size = New-Object System.Drawing.Size(150,20) 
			$LabelBezProzent.Text = "Aktuelle Veränderung [%]:"  
			$LabelBezProzent.Name = "BezProzent"  
			$objFenster.Controls.Add($LabelBezProzent)
			
		# Automatisches Update aktivieren
			$LabelBezUpdate = New-Object System.Windows.Forms.Label
			$LabelBezUpdate.Location = New-Object System.Drawing.Size(10,128) 
			$LabelBezUpdate.Size = New-Object System.Drawing.Size(150,20) 
			$LabelBezUpdate.Text = "Automatisches Update:"  
			$LabelBezUpdate.Name = "BezAutoUpdate"  
			$objFenster.Controls.Add($LabelBezUpdate)
			
		# Automatisches Update Häufigkeit
			$LabelBezHaeufigkeit = New-Object System.Windows.Forms.Label
			$LabelBezHaeufigkeit.Location = New-Object System.Drawing.Size(10,158) 
			$LabelBezHaeufigkeit.Size = New-Object System.Drawing.Size(150,20) 
			$LabelBezHaeufigkeit.Text = "Update Häufigkeit [min]:"  
			$LabelBezHaeufigkeit.Name = "BezAutoUpdate"  
			$objFenster.Controls.Add($LabelBezHaeufigkeit)
	
	# Label für Werte
		# Label für Uhrzeit
			$LabelUhrzeit = New-Object System.Windows.Forms.Label
			$LabelUhrzeit.Location = New-Object System.Drawing.Size(160,45) 
			$LabelUhrzeit.Size = New-Object System.Drawing.Size(100,20) 
			$LabelUhrzeit.Text = "10:30:00 Uhr"  
			$LabelUhrzeit.Name = "Uhrzeit"  
			$objFenster.Controls.Add($LabelUhrzeit)
			
		# Label für Kurs
			$LabelKurs = New-Object System.Windows.Forms.Label
			$LabelKurs.Location = New-Object System.Drawing.Size(160,65) 
			$LabelKurs.Size = New-Object System.Drawing.Size(200,20) 
			$LabelKurs.Text = "Kurs"  
			$LabelKurs.Name = "Kurs"  
			$objFenster.Controls.Add($LabelKurs)	
			
		# Label für Veränderung
			$LabelVeraenderung = New-Object System.Windows.Forms.Label
			$LabelVeraenderung.Location = New-Object System.Drawing.Size(160,85) 
			$LabelVeraenderung.Size = New-Object System.Drawing.Size(200,20) 
			$LabelVeraenderung.Text = "Veränderung"  
			$LabelVeraenderung.Name = "Veraenderung"  
			$objFenster.Controls.Add($LabelVeraenderung)	
			
		# Label für Veränderung
			$LabelProzent = New-Object System.Windows.Forms.Label
			$LabelProzent.Location = New-Object System.Drawing.Size(160,105) 
			$LabelProzent.Size = New-Object System.Drawing.Size(200,20) 
			$LabelProzent.Text = "Prozent"  
			$LabelProzent.Name = "Prozent"  
			$objFenster.Controls.Add($LabelProzent)	
		
	# Button für Aktualisierung
		$ButtonUpdate = New-Object System.Windows.Forms.Button
		$ButtonUpdate.Location = New-Object System.Drawing.Size(10,10)
		$ButtonUpdate.Size = New-Object System.Drawing.Size(80,23)
		$ButtonUpdate.Text = "aktualisieren"  
		$ButtonUpdate.Name = "Aktualisieren"  
		$ButtonUpdate.DialogResult = "None"  
		$ButtonUpdate.Add_Click({
			DaxKurs
			$LabelUhrzeit.Text = $Uhrzeit
			$LabelKurs.Text = $Kurs
			$LabelVeraenderung.Text = $Veraenderung
			$LabelProzent.Text = $Prozentual
		})
		$objFenster.Controls.Add($ButtonUpdate)
		
	# Button automatisch Aktualisierung an/aus
		$ButtonAutoUpdate = New-Object System.Windows.Forms.Button
		$ButtonAutoUpdate.Location = New-Object System.Drawing.Size(160,125)
		$ButtonAutoUpdate.Size = New-Object System.Drawing.Size(80,23)
		$ButtonAutoUpdate.Text = "aktivieren"  
		$ButtonAutoUpdate.Name = "Aktualisieren"  
		$ButtonAutoUpdate.DialogResult = "None"  
		$ButtonAutoUpdate.Add_Click({
			if($AutoUpdate -eq 0){
				$AutoUpdate = 1
				$ButtonAutoUpdate.Text = "deaktivieren"	  
			} else {
				$AutoUpdate = 0
				$ButtonAutoUpdate.Text = "aktivieren"	  
			}
		})
		$objFenster.Controls.Add($ButtonAutoUpdate)
		
	# Textfeld für Update Häufigkeit
		$TextboxHaeufigkeit = New-Object System.Windows.Forms.TextBox 
		$TextboxHaeufigkeit.Location = New-Object System.Drawing.Size(160,155) 
		$TextboxHaeufigkeit.Size = New-Object System.Drawing.Size(30,20) 
		$TextboxHaeufigkeit.Text = 60
		$objFenster.Controls.Add($TextboxHaeufigkeit)
		
	# Button automatisch Aktualisierung an/aus
		$ButtonHaufigkeitOK = New-Object System.Windows.Forms.Button
		$ButtonHaufigkeitOK.Location = New-Object System.Drawing.Size(195,155)
		$ButtonHaufigkeitOK.Size = New-Object System.Drawing.Size(30,19)
		$ButtonHaufigkeitOK.Text = "OK"  
		$ButtonHaufigkeitOK.Name = "Aktualisieren"  
		$ButtonHaufigkeitOK.DialogResult = "None"  
		$ButtonHaufigkeitOK.Add_Click({
			$global:Haeufigkeit = $TextboxHaeufigkeit.Text
			write-host $Haeufigkeit
		})
		$objFenster.Controls.Add($ButtonHaufigkeitOK)
		
	# Die letzte Zeile sorgt dafür, dass unser Fensterobjekt auf dem Bildschirm angezeigt wird. Das muss immer am Ende stehen.
		[void] $objFenster.ShowDialog()	
}

GUI

Gibt es jetzt eine Möglichkeit, für $ButtonAutoUpdate.Add_Click etwas zu schreiben, das alle 30 Minuten (oder wie auch immer) automatisch die Function GUI ausführt, aber nicht das Ganze GUI zum erliegen bringt? Ich habe schon ein paar Stunden mit der Suche verbracht und auch hoffnungsvolle Ansätze gefunden, die sich aber dann irgendwie wieder in Luft aufgelöst haben.

Vielen Dank schon mal face-smile

Content-Key: 275643

Url: https://administrator.de/contentid/275643

Printed on: April 19, 2024 at 04:04 o'clock

Mitglied: 114757
Solution 114757 Jun 25, 2015, updated at Jun 28, 2015 at 07:49:00 (UTC)
Goto Top
Moin,
wurde hier schon mal besprochen inkl. Beispiel. Stichwort MultiThreading

For beginners: Simple Variante mit Timer (System.Windows.Forms.Timer)
For the advanced users, mit Runspaces:

Gruß jodel32

p.s. Bitte nutze Code-Tags für deinen Programm-Code. Das lässt sich auch nachträglich noch nachholen.
Member: Chis0710
Chis0710 Jun 26, 2015 at 08:15:13 (UTC)
Goto Top
Hallo,

vielen Dank für die Antwort. Mit den Themen habe ich es geschafft meinen Code so anzupassen.

VG
Mitglied: 114757
114757 Jun 26, 2015 at 16:51:20 (UTC)
Goto Top
Schön das du es geschafft hast.

Wenns das dann war, den Beitrag bitte noch auf gelöst setzen.

Danke und schönes Wochenende.