strzata
Goto Top

Window per vbs erzeugen

Guten Abend,

Kann man per VisualBasicScript ein leeres kleines Windowsfenster erzeugen, welches sich nach ein paar Sekunden wieder selbst schliesst? Soll als Hinweis dienen, dass mein Programm geladen wird. So ne Art Splash. Habe es mit vb.net programmiert, aber bis es erscheint, vergeht nicht weniger Zeit als bis mein Hauptprogrammfenster zu sehen ist (im Schnitt 6 bis 10 Sekunden, scheinbar braucht das Framework so lange zum Laden). Das verleitet manche Anwender, das Icon nochmal zu klicken. Ein WScript.Echo sieht man sofort. Aber da stört der Boxtitel und der OK-Button. Gibt es da eine Möglichkeit?
Danke für eine Antwort.
Norbert

Content-Key: 151296

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

Printed on: April 26, 2024 at 11:04 o'clock

Member: SarekHL
SarekHL Sep 18, 2010 at 05:30:58 (UTC)
Goto Top
Kann man per VisualBasicScript ein leeres kleines Windowsfenster erzeugen, welches sich nach ein paar Sekunden wieder selbst
schliesst? Soll als Hinweis dienen, dass mein Programm geladen wird. So ne Art Splash. Habe es mit vb.net programmiert, aber bis
es erscheint, vergeht nicht weniger Zeit als bis mein Hauptprogrammfenster zu sehen ist (im Schnitt 6 bis 10 Sekunden, scheinbar
braucht das Framework so lange zum Laden).

Nein, das ist bei normalem VB ohne Framework genauso.
Wie hast Du das Fenster denn eingeblendet? Mit "Onload" des Hauptfensters?
Member: strzata
strzata Sep 18, 2010 at 07:51:44 (UTC)
Goto Top
Habe alles versucht: erste Zeile im OnLoad, in einem OnCreateControl, als VB-Splash und im MyApplication_Startup. Die beste Lösung ist, ein Fenster als eigenes Programm unabhängig von meinem Hauptfenster. Und das möglichst nicht in .Net. Das Problem ist garantiert das Framework. Und es tritt nur auf, wenn der Rechner neu hochgefahren und noch nix weiter gestartet wurde. Wenn einmal ein Programm, welches das Framework braucht, gelaufen ist, geht alles bltzschnell. Binnen 1 Sekunde ist mein Fenster oben. Nach einem Neustart dagegen vergehen bis zu 10 Sekunden. Weil ich dachte, irgendwelche Hintergrundprozesse beim Startvorgang sind die Störenfriede, habe ich den Rechner 20 Minuten in Ruhe gelassen und dann erst das VB-Programm gestartet. Da hab ich wieder die 10 Sekunden warten müssen.

Ich suche nach einer Möglichkeit, ein kleines Fenster für 5 Sekunden in der Mitte des Desktops anzuzeigen und gehe jetzt alle Programmiersprachen durch (java, delphi, php, html, hta). Irgendwie muss das doch zu machen sein.

Danke für Deine Antwort und schöne Grüße
Norbert
Mitglied: 76109
76109 Sep 18, 2010 at 08:34:28 (UTC)
Goto Top
Hallo strzata!

Ich habe mal versucht so eine Möglichkeit per VB- und Hta-Skript zu ermöglichen und scheint auch zu funktionieren.

Also das VB-Script erzeugt eine HTA-Datei, das nach der Erstellung gestartet wird und nach Ablauf der angegebenen Zeit in Sekunden wieder automatisch schließt, während das VB-Script ganz normal weiterläuft.

Hier ein VBS-Beispiel:
Option Explicit

Option Explicit

Const BoxWidth = 300
Const BoxHeight = 120

Const FontType = "Arial"  
Const FontSize = 12

'Main Beg  

    Call HtaBox("Mein Titel", "Mein Text", 2)  

    WScript.Quit

'Main End  

Private Sub HtaBox(ByRef Titel, ByRef Text, ByVal Wait)
    Dim Fso, Path, Msg, Shell

    Set Fso = CreateObject("Scripting.FileSystemObject")  
    Path = Fso.GetParentFolderName(WScript.ScriptFullName) & "\Msg.Hta"  
    Set Msg = Fso.CreateTextFile(Path)

    With Msg
        .WriteLine "<html><head><title>" & Titel & "</title>"  
        .WriteLine "<body bgcolor='buttonface' style='font-family:" & FontType & ";font-size:" & FontSize & "px'>"  
        .WriteLine "<p>" & Text & "</p>"  
        .WriteLine "</body>"  
        .WriteLine "<HTA:APPLICATION"  
        .WriteLine "ID='objMsg'"  
        .WriteLine "APPLICATIONNAME='Msg-Ausgabe'"  
        .WriteLine "SCROLL='no'"  
        .WriteLine "SINGLEINSTANCE='yes'>"  
        .WriteLine "<SCRIPT Language='VBScript'>"  
        .WriteLine "BoxLeft = (Screen.Width - " & BoxWidth & ") / 2"  
        .WriteLine "BoxTop = (Screen.Height - " & BoxHeight & ") / 2"  
        .WriteLine "Window.ResizeTo " & BoxWidth & ", " & BoxHeight  
        .WriteLine "Window.MoveTo BoxLeft, BoxTop"  
        .WriteLine "Zeit = Now + TimeSerial(0, 0, " & Wait & ")"  
        .WriteLine "Do While Zeit > Now: Loop"  
        .WriteLine "Close"  
        .WriteLine "</SCRIPT>"  
        .WriteLine "</head></html>"  
        .Close
    End With
    
    With CreateObject("Wscript.Shell")  
        .Run Path, 1, False
        .AppActivate Titel
    End With
End Sub
Wobei noch anzumerken ist, dass die Textanzeige nur funktioniert, wenn der Body-Teil an der aktuellen Position im Skript steht.

Gruß Dieter

[edit] Code geändert. Anstatt Time jetzt Now (Datum+Zeit) und Window "Mein Titel" mit Shell.AppActivate in den Vordergrund holen [/edit]
Member: strzata
strzata Sep 18, 2010 at 09:36:22 (UTC)
Goto Top
Danke vielmals Dieter,
das HTA funktioniert bestens. Warum soll ich es erst von VBS schreiben lassen? Es geht doch auch, dass ich es per Hand erstelle und als hta-Datei abspeichere, oder? Dann könnte ich eine Verknüpfung dazu auf dem Desktop anlegen und dem Anwender vorgaukeln, dass er damit mein Programm startet. Und da habe ich noch zwei Probleme:
1. beim Starten des HTA blitzt kurz ein großes Fenster auf, bevor das ResizeTo und MoveTo ausgeführt wird. Das stört etwas. Man müsste das Fenster solange verstecken (bzw. erst anzeigen), bis es am richtigen Ort sitzt.
2. In dem HTA muss ich jetzt mein Hauptprogramm aufrufen (nennen wir es jetzt mal notepad.exe). Kannst Du mir sagen, wie das geht?
Das 'Do While Zeit" ist genial. Ich habe das Schliessen-Problem schon in verschiedenen Foren beschrieben. Alle haben gesagt: das geht nicht. Und siehe: es geht doch!
Gruß Norbert
Member: strzata
strzata Sep 18, 2010 at 09:43:25 (UTC)
Goto Top
Ach ja: und das HTA sieht man nur bei freier Sicht auf den Desktop. Sind andere Fenster offen, versteckt es sich gern dahinter. Wie bekommt man es in den Vordergrund?
Mitglied: 76109
76109 Sep 18, 2010 at 11:52:37 (UTC)
Goto Top
Hallo Norbert!

Das Fenster in den Vordergrund holen, sollte per Codezeile 51 möglich sein (Code geändert).

Zu dem anderen Effekt "blitzt kurz ein großes Fenster auf" habe ich im Moment keine Idee. Bei mir tritt dieser Effekt nicht auf.

Gruß Dieter
Mitglied: 76109
76109 Sep 18, 2010 at 12:41:37 (UTC)
Goto Top
Hallo nochmal!

Mir ist gerade eingefallen, dass Du doch ein VB- und HTA-Skript brauchst, sonst funktioniert das Ganze ja nicht, weil Du ja dann in der Loop-Schleife hängen bleibst und keine nachfolgenden Anweisungen ausgeführt werden (starten, aktivieren....).

Das Hauptprogramm kannst Du im Main-Teil vor dem "Call HtaBox" per Shell.Run starten z.B.
Shell.Run "Notepad",1, False

Gruß Dieter
Member: strzata
strzata Sep 18, 2010 at 12:56:24 (UTC)
Goto Top
Du machst Dir ja eine Mühe mit mir - vielen vielen Dank.
Das Hauptprogramm kannst Du im Main-Teil vor dem "Call HtaBox" per Shell.Run starten
Da war ich gerade dabei und das wird wohl auch nicht schwer. Da wurde ich wieder durch das "Aufblitzen" gestört. Das sieht wie ein DOS-Fenster aus. Könnte es sein, dass als Default CScript.exe und nicht WScript.exe eingestellt ist? Wie bekomme ich das heraus? Auf meinem Rechner könnte ich das leicht umstellen (cscript //H:wscript). Aber was mache ich mit meinen Anwendern? Wie stelle ich die um? Das Fenster könnte aber auch ein Browserfenster sein. Man kann es nicht untersuchen. Es ist im Bruchteilt einer Sekunde wieder zu.
N.
Mitglied: 76109
76109 Sep 18, 2010 at 13:12:47 (UTC)
Goto Top
Hallo N!

Versuchs mal mit Batch:
@echo off
WScript //nologo Test.vbs

Gruß Dieter

PS. Das war natürlich Quatsch mit Soße. Keine Ahnung, was ich da wieder gedacht habe. Kein Planface-sad
Member: strzata
strzata Sep 18, 2010 at 13:26:24 (UTC)
Goto Top
Hab ne test.bat mit Deinen zwei Zeilen geschrieben. Wenn ich die doppelklicke, sehe ich erst kurz das DOS-Fenster, dann blitzt kurz das schon bekannte andere große Fenster auf und dann sehe ich das HTA. Das beste wäre schon, das HTA erst anzuzeigen, wenn es geschrumpft und an seinem Ort ist, also erst nach dem ResizeTo und MoveTo. Aber ich weiss nicht, wie man das machen könnte.
N.
Member: strzata
strzata Sep 18, 2010 at 13:38:32 (UTC)
Goto Top
Also es ist definitiv das Browserfenster (IE 8), das da aufblitzt. Hab die Hintergrundfarbe in den IE-Einstellungen verschieden gesetzt und da kann man es genau sehen.
N.
Mitglied: 76109
76109 Sep 18, 2010 at 13:58:25 (UTC)
Goto Top
Hallo N!

Sorry, wie bereits erwähnt, tritt der Effekt bei mir nicht auf (Rechner wahrscheinlich zu schnell) und habe auch leider keine Idee, wie man das verhindern kann.

Gruß Dieter
Member: strzata
strzata Sep 18, 2010 at 14:30:46 (UTC)
Goto Top
Trotzdem recht vielen Dank für Alles. Hast mir sehr geholfen.
Ganz herzliche Grüße
Norbert
Member: dog
dog Sep 19, 2010 at 00:48:37 (UTC)
Goto Top
Nein, das ist bei normalem VB ohne Framework genauso.

Nicht mit VB6 - das ist sofort da.
Diese ewige Ladezeit beim ersten Aufruf ist tatsächlich eine Seuche von .NET, die mich auch regelmäßig ärgert.
Member: Edi.Pfisterer
Edi.Pfisterer Sep 19, 2010 at 18:52:52 (UTC)
Goto Top
@ didi1954 :
man lernt nie aus!!!
den Befehl with kannte ich noch nicht, auch sonst eine sehr elegante Lösung

Danke für Deinen Beitrag!
Mitglied: 76109
76109 Sep 19, 2010 at 21:31:09 (UTC)
Goto Top
Hallo Edi!

Zitat von @Edi.Pfisterer:
@ didi1954 :
man lernt nie aus!!!
den Befehl with kannte ich noch nicht, auch sonst eine sehr elegante Lösung
Du bist ja auch schon längere Zeit Mitglied und kanntest die Anweisung With noch nicht. Kann ich kaum glaubenface-wink

Hier noch die Definition dazu:
Mit der With-Anweisung können Sie ein Objekt oder einen benutzerdefinierten Typ einmal für eine ganze Folge von Anweisungen festlegen. With-Anweisungen beschleunigen die Ausführung von Prozeduren und reduzieren wiederholte Eingaben.

Gruß Dieter
Mitglied: 76109
76109 Jan 17, 2011 at 08:20:21 (UTC)
Goto Top
Hallo zusammen!

Das letzte Skript bringt - zumindest bei mir - in Abhängigkeit von Zeitangaben > 2 Skekunden Browser-TimeOuts. Von daher, hier eine andere Methode mit Hilfe eines Timers, der nach Ablauf der Zeit die Schließ-Routine aufruft und dadurch keine Probleme bei größeren Zeitangaben auftreten:
Option Explicit

Const BoxWidth = 300
Const BoxHeight = 120

Const FontType = "Arial"  
Const FontSize = 12

'Main Beg  

    Call HtaBox("Mein Titel", "Mein Text", 5)  'Wait-Angabe in Sekunden  

    WScript.Quit

'Main End  

Private Sub HtaBox(ByRef Titel, ByRef Text, ByVal Wait)
    Dim Fso, Path, Msg, Shell

    Set Fso = CreateObject("Scripting.FileSystemObject")  
    Path = Fso.GetParentFolderName(WScript.ScriptFullName) & "\Msg.Hta"  
    Set Msg = Fso.CreateTextFile(Path)

    With Msg
        .WriteLine "<html><head><title>" & Titel & "</title>"  
        .WriteLine "<HTA:APPLICATION"  
        .WriteLine "ID='objMsg'"  
        .WriteLine "APPLICATIONNAME='Msg-Ausgabe'"  
        .WriteLine "SCROLL='no'"  
        .WriteLine "SINGLEINSTANCE='yes'/>"  
        .WriteLine "</head>"  
        .WriteLine "<SCRIPT Language='VBScript'>"  
        .WriteLine "Sub Window_OnLoad"  
        .WriteLine "Window.ResizeTo " & BoxWidth & ", " & BoxHeight  
        .WriteLine "Window.MoveTo ((Screen.Width - " & BoxWidth & ") / 2), ((Screen.Height - " & BoxHeight & ") / 2 )"  
        .WriteLine "Text.InnerHTML = ""<p>" & Text & "</p>"""  
        .WriteLine "window.setInterval ""MsgClose"", " & Wait & " * 1000"  
        .WriteLine "End Sub"  
        .WriteLine "Sub MsgClose"  
        .WriteLine "Close"  
        .WriteLine "End Sub"  
        .WriteLine "</SCRIPT>"  
        .WriteLine "<body bgcolor='buttonface' style='font-family:" & FontType & ";font-size:" & FontSize & "px'>"  
        .WriteLine "<span id='Text'></span>"  
        .WriteLine "</body></html>"  
        .Close
    End With
    
    With CreateObject("Wscript.Shell")  
        .Run Path, 1, False
        .AppActivate Titel
    End With
End Sub

Gruß Dieter