Windows Dienste verwalten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 35 Antworten in diesem Thema. Der letzte Beitrag () ist von RISSN.

    Wenn ich nur einen Button verwende, dann geht es. Ich denke schon, dass es am Timer liegt. Genau dort wird es mehrfach ausgeführt. Wenn ich aber abfrage, wie der Status vom Dienst ist, dann macht das Programm einfach nichts und ich weiß nicht warum. Leider ist das nicht das einzige Problem. Mein Wert für GetIdle() läuft über wenn Windows zu lange läuft, auch dafür habe ich noch keine Lösung. Habe jetzt erstmal in Sekunden umgerechnet, dass macht es aber nicht besser.
    Ich habe auch noch keine Ahnung wie ich es in einer Flanke auswerten kann, also nur einmal und dann warten auf Aktivität und dann wieder nur 1x starten

    Visual Basic-Quellcode

    1. Public Function GetIdle() As UInteger
    2. Try
    3. Dim lii As New LASTINPUTINFO()
    4. lii.cbSize = Convert.ToUInt32(Runtime.InteropServices.Marshal.SizeOf(lii))
    5. GetLastInputInfo(lii)
    6. Return Convert.ToUInt32(Environment.TickCount / 1000) - lii.dwTime / 1000
    7. Catch
    8. End Try
    9. End Function

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RISSN“ ()

    @RISSN Ich wiederhole mich ungern:

    RodFromGermany schrieb:

    Und: Option Strict On :!:


    Wenn Du der Meinung bist, Du kannst und weißt eh alles besser, dann mach es allein.
    Ich bin dann mal draußen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RISSN schrieb:

    Wenn ich aber abfrage, wie der Status vom Dienst ist, dann macht das Programm einfach nichts und ich weiß nicht warum.
    Aha! Also arbeitet der Code doch anders, also Du dachtest! Dann probier es also doch mit ner BooleanVariable bzw. nem Flag wie meine vorgeschlagene ServiceGetsStarted.

    RISSN schrieb:

    wie ich es in einer Flanke auswerten kann
    Was'n für ne Flanke?

    btw: Bitte korrekte CodeTags verwenden. wenn Du manuell [VB] in Deinen Text schreibst, wär das falsch, das ist für VB6 vorgesehen. Nutze [vbnet], siehe hier: CodeTags verwenden
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vollzitat eines Vorposts durch Anredefunktion ersetzt ~VaporiZed
    @RodFromGermany
    Oh, ich entschuldige mich. Es waren ein paar Einträge mehr, deswegen habe ich es aus dem Augen verloren, tut mir wirklich leid, nein, ich kann es nicht besser. Genau, ich habe diese Option aus.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    RISSN schrieb:

    Genau, ich habe diese Option aus.
    Dann ändere das ganz schnell.
    An sonsten wirst Du hier im Forum keine Freunde finden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Naja, Überlauf heißt ja wohl, dass da ne größere Zahl entsteht als der Funktionsrückgabetyp UInteger zulässt. Es gibt da 2 Möglichkeiten: Den Rückgabetyp anpassen oder etwas größenmäßig passendes berechnen. Deine Rechnung scheint ja etwas über das Ziel hinauszuschießen, wenn ich mir überlege, was Environment.GetTickCount zurückgibt …
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Unterlass bitte Vollzitate, sonst gibt's n Rüffel von den Moderatoren (von mir z.B.). Nutze stattdessen die Anredefunktion: @'NameDesBenutzers', wenn Du Dich nicht auf den direkten Vorpost beziehst.

    Damit Du weißt, wie es trotz des Nichtfunktionierens weitergeht: die empfohlenen VS-Einstellungen.
    Sie zeigen implizite Fehler auf, die ohne Option Strict On verschluckt werden. Sonst wundert man sich, warum das Programm sich komisch verhält.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @RISSN So was z.B.:

    VB.NET-Quellcode

    1. <StructLayout(LayoutKind.Sequential)>
    2. Structure LASTINPUTINFO
    3. <MarshalAs(UnmanagedType.U4)>
    4. Public cbSize As Integer
    5. <MarshalAs(UnmanagedType.U4)>
    6. Public dwTime As Integer
    7. End Structure
    8. Public Function GetIdle() As Integer
    9. Dim lii As New LASTINPUTINFO()
    10. lii.cbSize = Convert.ToInt32(Marshal.SizeOf(lii))
    11. GetLastInputInfo(lii)
    12. Return Convert.ToInt32(Environment.TickCount - lii.dwTime) \ 1000
    13. End Function
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Welchen denn? Also, nicht bei mir.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    RISSN schrieb:

    Sorry, ich hatte noch UInteger als Type und nicht integer.
    Das ist egal, es muss nur alles zusammenpassen:

    VB.NET-Quellcode

    1. <StructLayout(LayoutKind.Sequential)>
    2. Structure LASTINPUTINFO
    3. <MarshalAs(UnmanagedType.U4)>
    4. Public cbSize As UInteger
    5. <MarshalAs(UnmanagedType.U4)>
    6. Public dwTime As UInteger
    7. End Structure
    8. Public Function GetIdle() As UInteger
    9. Dim lii As New LASTINPUTINFO()
    10. lii.cbSize = Convert.ToUInt32(Marshal.SizeOf(lii))
    11. GetLastInputInfo(lii)
    12. Return Convert.ToUInt32((Environment.TickCount - lii.dwTime) \ 1000)
    13. End Function
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Übrigens kann ein Forms.Timer nicht "mehrfach" aufgerufen werden. Wenn der Code in der Prozedur länger dauert als der Timerintervall, passiert nichts.
    Der Timer läuft synchron im GUI Thread. Das Betriebssystem schickt zum Fenster eine Message im (ca) festgelegtem Intervall. Ist der Thread allerdings noch beschäftigt,
    kann die Message nicht verarbeitet werden. Sobald der Thread die Ausführung der Timer Prozedur abgeschlossen hat, wird dann die nächste Nachricht in der Message-Loop des Fensters ausgelesen und bearbeitet.

    Da die Messages gepuffert werden, kann es passieren, dass nachdem Aufruf von Timer.Stop() noch ein paar Messages einflattern und die Prozedur nochmal ausgeführt wird. Es kann aber niemals passieren, dass sie mehrfach (also parallel) ausgeführt wird.