programmierfreund91
Goto Top

Benutzeräktivität innerhalb eines bestimmten Programmes überprüfen mit VB.Net

Ich versuche für den Betrieb meines Vaters ein Programm zu schreiben, welches ein bestimmtes Programm (z.B "notepad.exe") öffnet und es solange geöffnet lässt, bis der Benutzer mehr als eine viertel Stunde nichts mehr in diesem Programm gemacht hat. Es soll nochmal eine Nachricht geben, in der der Benutzer aufgefordert wird das Programm zu beenden oder wieder zu nutzen, da sonst alle nicht gespeicherten Daten verloren gehen werden.

Ich habe schon einen Versuch gestartet, doch leider überprüft er bei dem Programm die Aktivität im ganzen System und dies ist nicht ganz das Gewollte.
Kann mir bitte zufällig wer helfen? Komme leider selber derzeit nicht weiter, auch wenn ich meine Versuche icht aufgeben werde.

Hier ist mein Programmcode, den ich bis jetzt schon habe:
Public Class Form1

    Private Prozess As System.Diagnostics.Process
    Private Inaktiv, Meldung, Beenden As Integer

    <Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> _
    Public Structure LASTINPUTINFO
        Public cbSize As UInteger
        Public dwTime As UInteger
    End Structure

    <Runtime.InteropServices.DllImport("USER32.DLL")> _  
    Private Shared Function GetLastInputInfo(ByRef ii As LASTINPUTINFO) As Boolean
    End Function

    Public Function GetIdleTime() As Long
        Try
            Dim lastInPut As New LASTINPUTINFO()
            lastInPut.cbSize = CUInt(System.Runtime.InteropServices.Marshal.SizeOf(lastInPut))
            If GetLastInputInfo(lastInPut) Then
                Dim el As Long = lastInPut.dwTime
                Dim ui As Long = (Environment.TickCount - el)
                ' Overflow  
                If ui < 0 Then
                    ui = ui + UInteger.MaxValue + 1
                End If
                Return ui
            Else
                Throw New ApplicationException("Timespan")  
            End If
        Catch ex As Exception
            Beep()
        End Try
    End Function

    Public Function GetIdleTimeSpan() As TimeSpan
        Return New TimeSpan(GetIdleTime() * 10000)
    End Function

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If Prozess.HasExited = False Then
            Prozess.Kill()
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Interval = 100 'ms  
        Timer1.Enabled = True
        Prozess = System.Diagnostics.Process.Start("notepad.exe")  
    End Sub

    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Label1.Text = Me.GetIdleTime.ToString
        Inaktiv = Int(Label1.Text)
        Meldung = 10000
        Beenden = 20000
        If Prozess.HasExited = False Then
            If Meldung - Inaktiv = 0 Then
                MsgBox("Bitte benutzen Sie '...' wieder, da sonst das Programm ohne zu speichern in 10 Sekunden geschlossen wird. Durch diesen Vorgang gehen alle nicht gespeicherten Daten verloren! Sie werden jedesmal nach 10 Sekunden inaktivität aufgefordert, wieder Eingaben zu machen!", MsgBoxStyle.Critical)  
            ElseIf Beenden - Inaktiv <= 0 Then
                Prozess.Kill()
                Close()
            End If
        Else
            Close()
        End If
    End Sub

End Class

Content-ID: 153815

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

Ausgedruckt am: 24.11.2024 um 22:11 Uhr

91087
91087 26.10.2010 um 15:27:53 Uhr
Goto Top
ProgrammierFreund91
ProgrammierFreund91 26.10.2010 um 15:39:17 Uhr
Goto Top
Wie ich einen Prozess beende, weiß ich ja.

Es handelt sich eher um das Problem, dass Person X ein Programm von einem Betriebserver gestartet hat, aber es eigentlich nicht mehr brauch. Nun hat er das Programme jedoch selber noch nicht geschlossen und verbraucht somit Arbeitsspeicher von Server, der nicht verbraucht werden müsste. Nun ist die Frage, wie VB erkennen kann, dass genau dieses Programm nicht mehr genutzt wird.

In meinem Beispiel ist es nun halt ein Editor und zudem wird halt eben dummerweise noch die Aktivität des Users systemweit auf dem Rechner von Person X überprüft.

Nun möchte ich gerne die Überprüfung der Aktivität des Users nur auf den Editor beziehen, damit sich dieser automatisch ohne zu speicher schließt, wenn der User eine gewisse Zeit das Programm nicht mehr genutzt hat.

Daher die Frage: Wie bekomme ich es hin, dass nur die Aktivität in dem Editor abgefragt wird?

P.S. Dein Link ist für die VisualBasic 5 und 6, also bringt es mir eh nichts, da ich VB.Net (bzw. VB 2008) nutze.
ProgrammierFreund91
ProgrammierFreund91 28.10.2010 um 10:13:10 Uhr
Goto Top
Leider haben meine Versuche bisher nichts gebracht.
Würde mich also sehr freuen, wenn jemand einen Ansatzlösung hätte.

Was meines erachtens auch gehen würde und vielleicht einfacher umzusetzen ist, dass das gewünschte Programmfenster immer im Vordergrung und immer Maximiert ist.

Also wenn wer etwas in diese Richtung hat, das würde ich auch als provesorische Lösung nehmen.

Danke schonmal im Vorraus für eure Hilfe und einen netten Gruß

Jens
ProgrammierFreund91
ProgrammierFreund91 29.10.2010 um 12:40:24 Uhr
Goto Top
Ich habe endlich eine Lösung gefunden. Zwar etwas anders als eigentlich von mir vorgesehen,
doch es reicht für die Ansprüche, die mir für das Programm gestellt wurden.