Benutzer mit den meisten Antworten
Programm bei inaktivität sperren ?

Frage
-
Hallo,
ich will, daß der User nach 5min Inaktivität (Mouse-/Tastaturbewegung) aus dem Programm ausgeloggt wird. Dies klappt wunderbar, im Ereignis MouseMove setze ich den Timer zurück bei Mousebewegung.
Ich weiß es nicht alle 30Sec springt er autom. in diesem Ereignis und setzt den Timer zurück (MouseCourser ändert sich kurzzeitig auf Sanduhr und wieder zurück) nur wenn ich den Mousezeiger über das Programm habe sonst setzt er nicht den Timer zurück, obwohl ich einfach ohne Bewegung und Tun alles beobachte.
Frage: woran es liegen könnte ?
MFG
Antworten
Alle Antworten
-
Hallo,
meine Erste Idee ist, das dein Programm kurzzeitig etwas mehr Hintegrundarbeit zu tun hat und deswegen sich der Cursor ändert. Dadurch wird Windows vielleicht vorgespielt, das sich die Maus bewegt hat.Du könntest beispielsweise eine gewisse Differenz einbauen. Du speicherst also den Punkt der Maus und beim MouseMove gleichst du die neue Position mit der alten Ab. Bei einer änderung von bspws. 3 Pixeln brichst du das zählen ab.
Wenn du allerdings auch Systemweit abfragen kannst/darfst, ist das hier vielleicht das richtige für dich.
<Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite | Code Beispiele | Facebook | Twitter | Snippets C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Also an die globalen Maus- und Tastatur-Events kommst du nur über einen Hook heran. Das ist aber für diesen Fall etwas übertrieben, wie ich finde.
Die Methode GetLastInputInfo (siehe Codeproject) liefert dir Angaben darüber, wie lange der Benutzer keine Eingaben mehr gemacht hat. Nun könntest du diese Funktion, mithlfe eines Timers, alle 10 Sekunden aufrufen und so heraus bekommen wie lange der Bentuzer Systemweit nichts gemacht hat.Beim einbauen einer gewissen Toleranz, meinte ich das so, das du bei jedem MouseMove die neuen Koordinaten abspeicherst. Beim nächsten MouseMove kannst du dann die X- und Y-Koordinaten vergleichen, um heraus zu bekommen, ob sich die Maus wirklich bewegt hat.
<Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite | Code Beispiele | Facebook | Twitter | Snippets C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Hallo,
nun habe ich was im Internet gefunden (http://www.codeproject.com/Articles/28064/Global-Mouse-and-Keyboard-Library?fid=1518257&fr=1&df=90&mpp=25&noise=3&prof=False&sort=Position&view=Quick&spc=Relaxed#xx0xx) und eingebunden, aber er reagiert leider gar nicht auf MouseMove und andere.
Instance gebildet und gestartet.
was mache ich falsch ?
MFG
-
Hast du dir mal das Beispielprojekt (HookSampleApplication, .NET 3.5) dazu angesehen? Dieses funktioniert bei mir.
<Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite | Code Beispiele | Facebook | Twitter | Snippets C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Hallo,
dies funktioniert auch bei mir. Soweit ich in mein Appl einbinde ohne Wirkung.
Brauche ich unbedingt Simulation oder es geht auch ohne ?
Meine Schwierigkeit ist, daß ich nicht weiß wo ich ihn einbinde, damit er auf die Ereignisse reagieren soll, obwohl ich die Ereignisse schon wie auf der Seite angegeben ohne Fehlermeldung eingebunden ?
Für ein Bspl Code wäre ich dankbar.
MFG
- Bearbeitet ati.sah Freitag, 23. August 2013 13:15
-
Ich habe einfach mal ein neues WinForms Projekt erstellt und einen Verweis auf MouseKeyboardLibrary gesetzt. Danach habe ich folgenden Code eingebaut:
MouseHook mh = new MouseHook(); KeyboardHook kbh = new KeyboardHook(); private void Form1_Load(object sender, EventArgs e) { mh.MouseDown += mh_MouseDown; mh.MouseMove += mh_MouseMove; mh.MouseWheel += mh_MouseWheel; kbh.KeyDown += kbh_KeyDown; mh.Start(); kbh.Start(); } void mh_MouseWheel(object sender, MouseEventArgs e) { textBox1.Text = "Letzte Eingabe: " + DateTime.Now; } void kbh_KeyDown(object sender, KeyEventArgs e) { textBox1.Text = "Letzte Eingabe: " + DateTime.Now; } void mh_MouseMove(object sender, MouseEventArgs e) { textBox1.Text = "Letzte Eingabe: " + DateTime.Now; } void mh_MouseDown(object sender, MouseEventArgs e) { textBox1.Text = "Letzte Eingabe: " + DateTime.Now; }
Es haben alle funktioniert. Es kamen immer die korrekten Ausgaben.
Getestet habe ich es unter .NET 3.5 und 4.5 mit der Bibliothek aus dem 3.5er (VS 2008) Projekt.
Die beiden Hook-Klassen solltest du direkt in die Fenster (Form)-Klasse packen.
<Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite | Code Beispiele | Facebook | Twitter | Snippets C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.
- Bearbeitet Tom Lambert (Koopakiller)Moderator Freitag, 23. August 2013 14:36
-
Hallo,
wie folgt sieht mein Code aus aber es klappt nicht ?
using MouseKeyboardLibrary;
namespace Test
{
public partial class frmMain : Form
{
MouseHook MH = new MouseHook();
KeyboardHook KH = new KeyboardHook();public frmMain()
{
InitializeComponent();
}private void frmMain_Load(object sender, EventArgs e)
{
// GlobaleMouseTastaturStarten
MH.MouseMove += new MouseEventHandler(mouseHook_MouseMove);
KH.KeyDown += new KeyEventHandler(keyboardHook_KeyDown);
MH.Start();
KH.Start();
}void keyboardHook_KeyDown(object sender, KeyEventArgs e)
{
textBox1.Text = "Letzte Eingabe: " + DateTime.Now;
}void mouseHook_MouseMove(object sender, MouseEventArgs e)
{
textBox1.Text = "Letzte Eingabe: " + DateTime.Now;
}
}
}- Bearbeitet ati.sah Montag, 26. August 2013 05:42
-
Hallo,
probier´s doch mit einem IMessageFilter.
http://stackoverflow.com/questions/6697306/c-sharp-capture-main-form-keyboard-events
Die Konstanten für MouseMove und Tastatur:
Const WM_KEYDOWN As Integer = &H100 Const WM_MOUSEMOVE As Integer = &H200
Grüße -
IMessageFilter arbeitet nur Fensterweit. Darum gibt es außerhalb keine Events.
Ich habe gerade nochmal den Code von ati.sah getestet. Bei mir gab es keine Probleme.
Hast du mal einen Breakpoint beim Load-Eventhandler gesetzt? Für den Fall, das das nicht ausgeführt wird. (Designerbug etc.)
Starte das Programm zum Test mal als Admin. Temporär solltest du auch mal den Virenscanner ausschalten.
(ähnlichen Code braucht man für einen Keylogger)Sonst gehen mir jetzt endgültig die Ideen zu dem Problem aus. Eine Alternative wäre vielleicht immer noch GetLastInputInfo.
<Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite | Code Beispiele | Facebook | Twitter | Snippets C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Hi,
Ich habe selbst auch schon mit global hooks experimentiert und kann dir bloß diese Bibliothek empfehlen:
http://globalmousekeyhook.codeplex.com/releases/view/73244
Damit geht es kinderleicht. Verwendet wird sie ziemlich genau wie die andere bloß hatte ich damit programmweit keine Probleme.
verwenden in etwa so:
gh = new GlobalHooker(); mh = new MouseHookListener(gh); kh = new KeyboardHookListener(gh); mh.MouseClick += OnMouseClick; kh.KeyDown += OnKeyDown;
Weiterhin hatte ich bei simulierten Eingaben das Problem, dass sie nicht kamen, die Ursache dafür war das Active Window, hier zu mal: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633539%28v=vs.85%29.aspx
mfg Simon
- Bearbeitet Adun.SG Freitag, 30. August 2013 14:12 tippfehler gefixt
-
Am einfachsten über skydrive.live.com.
Einfach per Drag'n'Drop drauf ziehen, Rechtsklick auf die hochgeladene Datei und über "Teilen" einen link abrufen.
Hochladen musst du das Projekt als ZIP-Datei o.ä.
<Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite | Code Beispiele | Facebook | Twitter | Snippets C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.