1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. mikexmagic

Beiträge von mikexmagic

  • Transparente Grafiken (Pfeile) über die GUI legen und wieder entfernen...

    • mikexmagic
    • 28. November 2013 um 11:37

    Danke für eure vielen Antworten. Aber für meinen Fall war es denkbar einfach: Mit _WinAPI_RedrawWindow($gui) wird die erzeugte Grafik einfach wieder übermalt/gelöscht. Klappt gut! :thumbup:

  • Transparente Grafiken (Pfeile) über die GUI legen und wieder entfernen...

    • mikexmagic
    • 26. November 2013 um 14:49

    Danke für den Tip... aber ich möchte das Tool nicht mit Videos, Animationen usw 'fett' machen...

    Aber davon abgesehen habe ich vermutlich schon ne Lösung... Teste es gerade!

  • Transparente Grafiken (Pfeile) über die GUI legen und wieder entfernen...

    • mikexmagic
    • 26. November 2013 um 14:24

    Hallo Leute,

    ich habe ein recht umfangreiches Tool geschrieben und möchte nun (um es unsere User ein bisschen zu erklären) so eine Art 'Tour' einbauen. Ich stelle mir das so vor dass bei Tourstart Pfeile und Popups erscheinen und die einzelnen Elemente erklären...

    Nun scheitere ich schon daran einen Pfeil über die GUI und die Steuerelemente zu malen... wie auch immer...
    Ich habe es mit GDI+ versucht -> Die Graphik wird zwar wie gewünscht erzeugt, lässt sich aber nicht mehr löschen.
    Ich habe es mit GUICtrlCreateGraphic versucht -> Der Rahmen ist im Vordergrund, aber die Grafik dann nicht
    Ich habe eine Transparente GUI drüber gelegt und eine GIF eingebaut -> auch alles Müll

    Das kann doch nicht so schwer sein iwie einen Pfeil zu erzeugen den man auch wieder verschwinden lassen kann ?(

    Ideen?

  • Wie ermitteln dass WMI-Abfrage via ExecQuery leer ist?

    • mikexmagic
    • 15. Oktober 2013 um 15:54

    Stimmt, dann funktioniert es auch! :thumbup:
    Danke

  • Wie ermitteln dass WMI-Abfrage via ExecQuery leer ist?

    • mikexmagic
    • 15. Oktober 2013 um 15:46

    Hier ein MinimalScript:

    [autoit]

    $wmi_node = @computername
    $wmi_obj = ObjGet('winmgmts:\\' & $wmi_node & '\root\cimv2')

    [/autoit][autoit][/autoit][autoit]

    ;findet alle NICs
    $wmi_qry = $wmi_obj.ExecQuery("SELECT * FROM Win32_NetworkAdapter", "WQL")
    ConsoleWrite($wmi_qry.count) ;<<<< Zeigt bei mir 16

    [/autoit][autoit][/autoit][autoit]

    ;Nur Wifi
    $wmi_qry = $wmi_obj.ExecQuery("SELECT * FROM Win32_NetworkAdapter WHERE ServiceName=NETwNs64", "WQL")
    ConsoleWrite($wmi_qry.count) ;<<<< Fehler

    [/autoit]
  • Wie ermitteln dass WMI-Abfrage via ExecQuery leer ist?

    • mikexmagic
    • 15. Oktober 2013 um 15:33
    Zitat von AspirinJunkie

    Es gibt extra dafür ein Count-Attribut bei den WMI-Mengen.


    Danke... Stimmt. Aber wie bereits beschrieben liefert .count NUR einen Wert wenn auch die Collection Werte enthält.
    Ist die Collection leer, bringt die Abfrage auf .count einen Fehler. Daher kommt ja erst das Problem.
    Mit meiner eigenen Zählroutine klappts jetzt ganz wunderbar.

  • Wie ermitteln dass WMI-Abfrage via ExecQuery leer ist?

    • mikexmagic
    • 15. Oktober 2013 um 10:47
    Zitat von water

    Wieso soll ObjGet falsch sein?


    Hat bei mir halt nicht funktioniert. So sollte es richtiger sein...

    [autoit]

    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\cimv2")

    [/autoit]
    Zitat von water

    Das Skript beendet daher ohne eine Ausgabe aber auch ohne Fehler.

    Zitat von water

    Da kommt kein Satz zurück. Das Skript beendet daher ohne eine Ausgabe aber auch ohne Fehler.


    Richtig: Es kommt kein Satz zurück... Und wie frage ich genau das ab? Habe es jetzt so gelöst:

    [autoit]

    $wmi_count=0
    if IsObj($wmi_qry) Then
    For $item in $wmi_qry
    $wmi_count=$wmi_count+1
    Next
    endif

    If $wmi_count>0 Then
    ....
    else
    ....
    endif

    [/autoit]
  • Wie ermitteln dass WMI-Abfrage via ExecQuery leer ist?

    • mikexmagic
    • 15. Oktober 2013 um 10:21

    Danke... aber hilft nur bedingt bis gar nicht. Mit Scriptomatic hatte ich es auch schon probiert...

    Erst einmal ist hier der GetObj() schon falsch bzw unvollständig und ob ExecQuery dann was liefert oder leer bleibt ist auch nicht gelöst... 8|
    Werde mir wohl ne Schleife zum Zählen einbauen und danach auswerten...

  • Wie ermitteln dass WMI-Abfrage via ExecQuery leer ist?

    • mikexmagic
    • 15. Oktober 2013 um 09:22

    Hallo Leute,

    ich habe nun schon viele Themen durchsucht und gelesen... Aber irgendwie ist alles Megakompliziert, am Thema vorbei oder was weiß ich....

    Eigentlich ist es ganz einfach: Ich möchte per WMI-Abfrage die MAC einer 'evtl' vorhandenen WLAN-Karte auslesen.
    Das klappt in der Regel auch einwandfrei mit

    SELECT * FROM Win32_NetworkAdapter WHERE ServiceName=NETwNs64

    [autoit]

    $wmi_obj = ObjGet('winmgmts:\\' & $wmi_node & '\' & $wmi_namespace)
    $wmi_qry = $wmi_obj.ExecQuery($wmi_query)

    [/autoit]

    Mein Problem:
    Wenn keine WLAN-Karte vorhanden ist (zB. DesktopPC), dann landen mit der Abfrage auch keine Ergebnisse in der Collection.
    Mit IsObj($wmi_qry) bekomme ich trotzdem eine '1', das kann ich also nicht als Prüfwert nehmen.
    Mit $wmi_qry.Count bekomme ich allerdings dann einen Fehler :(

    Muss ich wirklich ein komplettes ErrorHandling einbauen nur um festzustellen ob die Abfrage Ergebnisse brachte oder nicht?
    Das muss doch einfacher gehen... ?(

    Wäre toll wenn mir jemand einen Tip geben könnte! :thumbup:

    Gruß Mike

  • Eine EXE aus einem AUTOIT-Script 'als Administrator ausführen'

    • mikexmagic
    • 11. April 2013 um 10:43

    Danke Micha_he, aber ich hatte bereits kurz vorher ne Lösung gepostet. Die ist auch getestet von mir und funktioniert.

  • Eine EXE aus einem AUTOIT-Script 'als Administrator ausführen'

    • mikexmagic
    • 11. April 2013 um 10:06

    Ich versuche es nochmal zu erklären wo mein Problem ist und zeige die Unterschiede in den Lösungsansätzen auf. Meine Beispiele sind immer Win7 64bit Standarduser...

    Fall A) Klick auf Start -> 'regedit' eingeben und Enter drücken. Registry-Editor geht auf, unter HKLM\SOFTWARE ist der Unterschlüssel Wow6432Node sichtbar. Aber natürlich sind keine Änderungen unter HKLM möglich -> Es fehlen die Rechte! (soweit logisch :rolleyes: )



    Fall B) Klick auf Start -> 'regedit' eingeben -> Suchergebnisse abwarten -> Regedit.exe aus den Suchergebnissen mit rechts anklicken -> 'Als Administrator ausführen' -> UAC möchte Benutzername und Kennwort eines Admins haben -> Registry-Editor öffnet sich. Der Unterschlüssel Wow6432Node ist sichtbar UND kann bearbeitet werden. (Genau so soll es sein!  :thumbup: )


    Die Lösung: Zwei Apps/Scripte! 8)
    Script A stellt die ganz normale GUI dar, ohne #RequireAdmin! Der normale User kann das Tool ganz normal öffnen und benutzen. Beim klick auf den Button [Regedit öffnen] wird Script B gestart. Vereinfacht dargestellt::

    [autoit]

    #RequireAdmin
    RunAs("admin", "lokalerpc", "blablabla", 2 , "C:\Windows\Regedit.exe" , "C:\" )

    [/autoit]


    Die Kombination aus #RequireAdmin UND RunAs() öffnet den Registry-Editor nun so wie gewünscht: HKLM bearbeitbar und Wow6432Node sichtbar!


    Danke für Eure Ideen und Hilfe  :thumbup:


  • Eine EXE aus einem AUTOIT-Script 'als Administrator ausführen'

    • mikexmagic
    • 10. April 2013 um 13:57

    :S
    Schade, es schein doch ein Verständnis-Problem zu geben. Entweder denke ich zu kompliziert oder es geht einfach nicht...
    Ich weiß allerdings auch nicht wie ich es anders erklären soll. :wacko: 

  • Eine EXE aus einem AUTOIT-Script 'als Administrator ausführen'

    • mikexmagic
    • 10. April 2013 um 13:06
    Zitat von mikexmagic

    Ja, ich kenne RunAs()

    Zitat von mikexmagic

    mit rechts klicke und sage 'als Admin ausführen' öffnet sich die Registry anders als wenn ich das aus AUTOIT mit RunAs () mache.

    Der wichtige Unterschied: Ich sehe den Pfad HKLM\Software\Wow6432Node nur wenn ich die Regedit über den Rechtsklick öffne...

    Auch das DOS-Fenster (cmd.exe) vehält sich per Rechtsklick geöffnet anders als per RunAs()

    :rolleyes: :whistling:

  • Eine EXE aus einem AUTOIT-Script 'als Administrator ausführen'

    • mikexmagic
    • 10. April 2013 um 10:52

    Nein, eine Sicherheitslücke wäre das nicht! Ich möchte ja die UAC Sicherheitsabfrage nicht umgehen, sondern den Aufruf 'als Admin ausführen' vom Script machen lassen.

  • Eine EXE aus einem AUTOIT-Script 'als Administrator ausführen'

    • mikexmagic
    • 10. April 2013 um 10:42

    Hallo Freunde der gepflegten Programmierung 8)

    also ich fange mal mit den wichtigen Punkten an: Ja, ich habe gesucht! Ja, ich kenne #requireadmin! Ja, ich kenne RunAs()

    Die Frage ist allerdings recht banal aber auch wieder nicht: Wie kann ich aus einem Script welches eine normaler User starten darf (also klar OHNE #requireadmin) eine EXE mit 'als Administrator ausführen' aufgerufen werden? Und zwar mit aktivem UAC unter Win7...

    Beispiel: Wenn ich auf [Start] klicke und in der Suchzeile 'Regedit' eingebe (ohne ENTER!) und dann auf den Eintrag in den Suchergebnissen mit rechts klicke und sage 'als Admin ausführen' öffnet sich die Registry anders als wenn ich das aus AUTOIT mit RunAs () mache.

    Der wichtige Unterschied: Ich sehe den Pfad HKLM\Software\Wow6432Node nur wenn ich die Regedit über den Rechtsklick öffne...

    Auch das DOS-Fenster (cmd.exe) vehält sich per Rechtsklick geöffnet anders als per RunAs()

    Den einzigen Workaround den ich derzeit habe: Ich starte die kompilierte EXE meines Script mit nem Rechtsklick und 'als Admin'... Dann gehts, aber das ist nicht hilfreich für mein Problem.

    Hintergrund zum Script: Es sollen über Schaltflächen halt diverse Tools als Admin ausgeführt werden, die GUI selbst jedoch nicht. Erst beim klicken auf die Buttons soll der UAC noch den Anmeldedaten eines Admins fragen.

    Kann die Problematik nachvollzogen werden und gibt es da eine Lösung?

    Danke, Gruß Mike

  • Klick auf Button abfragen trotz While-Schleife...

    • mikexmagic
    • 22. Dezember 2011 um 08:52

    Unglaublich... Und bitte jetzt nicht hauen... :wacko:

    Da ist es mir doch glatt gelungen die Breite eines Label-Control mit 500 statt mit 50 anzugeben. Somit wurde der Button vom Label überlagert und ließ sich dadurch nicht klicken... X(

    Danke, Death, das war ein hilfreicher Hinweis. :D

  • Klick auf Button abfragen trotz While-Schleife...

    • mikexmagic
    • 21. Dezember 2011 um 14:47

    Ist das nicht das gleiche? Nur dass statt IF ein SELECT verwendet wird? Ich komme aber mit einer einfachen IF aus das es nur dieses eine Event geben kann.

  • Klick auf Button abfragen trotz While-Schleife...

    • mikexmagic
    • 21. Dezember 2011 um 13:42

    Danke für eine schnelle Antwort. Aber das Problem ist, dass der klick auf den Button überhaupt nicht registriert wird.

    Ich habe mir aber auch schon selber geholfen. Allerdings ist das bestimmt nicht die schönste Variante...

    Beim öffnen des LogGUI setze ich 'GUIOnEventMode' wieder auf NULL, also auf den MessageMode. Im laufe der WHILE-Schleife für den Log-Output frage ich dann gleichzeitig $msg ab. Klickt man nun auf den Button, wird der Prozess gestoppt und der 'GUIOnEventMode' wird wieder auf EINS gesetzt. usw usw....

    [autoit]


    AutoItSetOption ( "GUIOnEventMode", 0)
    Func RefreshLog()
    While ProcessExists($hPID)
    $msg = GUIGetMsg()
    If $msg = $lv_Stoptask Then StopTask()
    $readData = StdoutRead($hPID, 1)
    If $readData <> $oldData Then
    GUICtrlSetData($e_logoutput, @CRLF & $readData)
    _GUICtrlEdit_LineScroll($e_logoutput, 0, _GUICtrlEdit_GetLineCount($e_logoutput))
    $oldData = $readData
    EndIf
    Wend
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func StopTask()
    LogWrite("stop " & $hPID)
    ProcessClose ( $hPID)
    ProcessWaitClose ( $hPID)
    AutoItSetOption ( "GUIOnEventMode", 1)
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Klick auf Button abfragen trotz While-Schleife...

    • mikexmagic
    • 21. Dezember 2011 um 11:44

    Hallo zusammen,

    tja, wie fange ich an? Kompliziertes Problem...

    Ich bastel an einer GUI die zum Sichern von lokalen Verzeichnissen nacheinander verschiedene Kopierprozesse startet, und zwar per Robocopy.exe. Die Log-Ausgabe des Prozesses mache ich mit StdOutRead() in einem Edit-Control sichtbar.

    Spoiler anzeigen
    [autoit]

    $hPID = Run($backupshare & '\_backupscript\robocopy.exe "' & @mydocumentsdir & '" "' & $backupdestination & '\MyDocuments" /mir /R:0 /W:0',"","",6)
    While ProcessExists($hPID)
    $readData = StdoutRead($hPID, 1)
    If $readData <> $oldData Then
    GUICtrlSetData($e_logoutput, @CRLF & $readData)
    _GUICtrlEdit_LineScroll($e_logoutput, 0, _GUICtrlEdit_GetLineCount($e_logoutput))
    $oldData = $readData
    EndIf
    Wend

    [/autoit]


    So weit, so gut.
    Nun möchte ich aber folgendes realisieren: Es gibt ein MainGUI mit dem Button der die Robocopy-Prozesse nacheinander startet. Das Edit-Feld für den Log-Output habe ich aber in einem anderen GUI-Fenster. Das MainGUI wird deaktiviert und das zweite GUI wird mit @SW_SHOW geöffnet. Der Prozess läuft und im Log läuft die Ausgaben. Das klappt schonmal :rolleyes: . In dem zweiten GUI habe ich nun ein Button, welcher den laufenden Prozess abbricht um zum nächsten springt.
    Das Problem: Innerhalb der Schleife für den Output reagiert das Script aber nicht auf den klick auf den 'Cancel'-Button...
    Das GUI läuft übrigens im 'OnEventMode' weil ich dachte, dass es so gehen würde. Im 'MessageLoopMode' klappt es auch nicht...

    Verstanden? Ideen?

  • Mit Zeiten rechnen

    • mikexmagic
    • 10. Juni 2010 um 13:12

    Schnuffel

    Danke
    ich hab die Idee mal aufgegriffen und für meine Zwecke diese zwei kleinen Funktionen gebaut:

    [autoit]

    Func time2sec($t2s_time)$t2s_time_a=StringSplit($t2s_time,":")Return $t2s_time_a[1]*3600+$t2s_time_a[2]*60+$t2s_time_a[3]endfuncFunc sec2time($s2t_seconds)$s2t_seconds=Number($s2t_seconds)$_h=int($s2t_seconds/3600)$_m=int(($s2t_seconds-$_h*3600)/60)$_s=int((($s2t_seconds-$_h*3600)-$_m*60))Return $_h & ":" & Stringformat("%02d",$_m) & ":" & StringFormat("%02d",$_s)endfunc

    [/autoit]


    Einmal wird eine Zeitangabe inkl. Stunden in eine Ganzzahl Gesamtsekunden gewandelt. Damit kann man dann rechnen.
    Und die zweite Funktion wandelt eine Zahl dann in Stunden : Minuten : Sekunden um.

    PS: Wo sind meine Zeilenumbrüche hin?

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™