Laden...

Programm reagiert nach einer Zeit nicht mehr auf Tastatureingaben

Erstellt von Red_Wraith vor 17 Jahren Letzter Beitrag vor 13 Jahren 16.331 Views
R
Red_Wraith Themenstarter:in
150 Beiträge seit 2006
vor 17 Jahren
Programm reagiert nach einer Zeit nicht mehr auf Tastatureingaben

Ich habe ein Programm geschrieben, das eine bestimmte Operation ausführt, wenn ich F12 drücke. Da das Programm auch auf die F12-Taste reagieren soll, wenn es minimiert ist, oder gerade nicht angewählt ist, benutze ich den UserActivityHook bzw. Globalhook (den gibts hier: http://www.codeproject.com/csharp/globalhook.asp).

Das funktioniert zunächst einwandfrei, also auch wenn das Programm minimiert oder verdeckt ist, reagiert es auf die F12-Taste und führt die Operation aus. Wenn ich mehrmals F12 drücke, führt das Programm die Operation mehrmals aus, so wie es auch soll.
Wenn ich nun aber mehrere Minuten warte und z.B. im Internet surfe oder ein Spiel spiele, reagiert das Programm nicht mehr auf die F12-Taste, auch wenn ich alles bis auf mein Programm schließe und das Programm mit der Maus anwähle. Da kann ich dann so oft F12 drücken wie ich will, es reagiert einfach nicht mehr. Erst wenn ich mit Hilfe eines Buttons den Befehl Application.Restart() ausführe, reagiert das Programm wieder auf die F12-Taste.

Es scheint also so, dass das C# das Programm automatisch nach einer Zeit in einen Art Ruhezustand versetzt. Wenn ich mit Hilfe eines Buttons Application.DoEvents() ausführe, ändert dies nichts (dachte zuerst, das könnte das Problem vielleicht beheben).

Ich habe mir schon überlegt, meinen Code so anzupassen, dass jede Minute Application.Restart() ausgeführt wird. Jedoch scheint mir diese Lösung sehr unelegant. Da muss es noch eine bessere Lösung geben.

Kann mir bitte jemand weiterhelfen?

6.862 Beiträge seit 2003
vor 17 Jahren

Könnts nicht auch sein dass sich irgend nen anderes Programm dass du benutzt auch globale Tastaturhooks einrichtet und du deshalb die Probleme mit deinem hast? Tritt das verhalten auch auf wenn du dein Programm startest und einfach mal minutenlang nichts machst?

Baka wa shinanakya naoranai.

Mein XING Profil.

I
1.739 Beiträge seit 2005
vor 17 Jahren

Schliess mich Talla an. (Mutmassung)
Kannst du ne Kleinversion deines Prgs posten(relevante Teile)?
------ weit hergeholt, könnte der Rest einem DeadLock(unwahrscheinlich lt. Beschreibung) zum Opfer gefallen sein.(verdammt weit).
Sonst seh ich nur nen Implementationsfehler des Beispiels.
Ach ja, bitte nich den ganzen Code(wenn möglich) das könnte sonst in Arbeit ausarten 😉

R
Red_Wraith Themenstarter:in
150 Beiträge seit 2006
vor 17 Jahren

Schon mal danke für die ersten Antworten.

Ich habe jetzt das Programm gestartet und 10 min gewartet, ohne etwas zu tun. Danach funktionierte das Programm noch einwandfrei. Dann habe ich firefox gestartet. Dann ging es immer noch. Dann bin ich mit firefox auf google gegangen, dann ging es immer noch. Dann bin ich firefox noch in ein Forum gegangen und plötzlich reagiert mein Programm nicht mehr auf das F12.

Also mein Programm besteht aus folgenden Teilen:

  1. UserActivityHook.cs (unverändert)

  2. Program.cs (in SaveEdit() erhält das letzte Byte einer Datei den Wert 255):

using System;
using System.IO;
using System.Windows.Forms;

namespace Bla {
	public class Program {

		static void Main() {
			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);
			Application.Run(new MainFrm());
		}
		
		public static void SaveEdit() {
			try {
				string input = "C:\\Test.dat";
				FileInfo fInfoInput = new FileInfo(input);
				FileStream fs = new FileStream(input, FileMode.Open, FileAccess.Write);
				BinaryWriter r = new BinaryWriter(fs);
				int inputFileSize = (int)fInfoInput.Length;
				fs.Position = inputFileSize - 1;
				byte val = 255;
				r.Write(val);
				fs.Close();
				r.Close();
				Console.Beep(2000, 150);
			} catch (Exception) {
				Console.Beep(37, 400);
			}
		}
	}
}
  1. MainFrm.cs:
using System;
using System.Windows.Forms;

namespace Bla {
	public partial class MainFrm : Form {

		public MainFrm() {
			InitializeComponent();
		}

		public void MainFrm_Load(object sender, EventArgs e) { 
			UserActivityHook actHook = new UserActivityHook();
			actHook.KeyUp += new KeyEventHandler(this.Key_Up);
		}

		public void Key_Up(object sender, KeyEventArgs e) {
			if (e.KeyData == Keys.F12) {
				Program.SaveEdit();
			}
		}

		private void reloadBtn_Click(object sender, EventArgs e) {
			Application.Restart();
		}
	}
}
  1. MainFrm.Designer.cs. Hier sind wahrscheinlich nur die folgenden 3 Zeilen von Interesse:
this.reloadBtn.Click += new System.EventHandler(this.reloadBtn_Click);
this.KeyPreview = true;
this.Load += new System.EventHandler(this.MainFrm_Load);

MainFrm enthält neben dem reloadBtn nur noch ein Label.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Red_Wraith,

ich will ja den Teufel nicht an die Wand malen, aber im schlimmsten Fall hast du dir ein Trojanisches Pferd (Trojaner müssten ja eigentlich die Benutzer heißen, die sich so ein Pferd in den Computer geholt haben) eingefangen, der den UserInput protokolliert.

R
Red_Wraith Themenstarter:in
150 Beiträge seit 2006
vor 17 Jahren

Original von herbivore
ich will ja den Teufel nicht an die Wand malen, aber im schlimmsten Fall hast du dir ein Trojanisches Pferd (Trojaner müssten ja eigentlich die Benutzer heißen, die sich so ein Pferd in den Computer geholt haben) eingefangen, der den UserInput protokolliert.

Danke erstmal für den Ratschlag.
Ich habe jetzt 2 Spyware-Scanner mit den aktuellsten Updates durchlaufen lassen, und die haben auch was gefunden und gelöscht. Danach bestand das Problem mit meinem Programm aber noch immer. Danach habe einen guten Virenscanner durchlaufen lassen mit den aktuellsten Updates. Dieser hat zwar einen Trojaner gefunden und gelöscht, danach bestand das Problem mit meinem Programm aber weiterhin. Schließlich habe ich mit dem Taskmananger alle von Windows nicht benötigten Prozesse geschlossen und dann mein Programm ausprobiert. Wieder die selbe Pleite.

Es muss wohl doch irgendein Problem mit meinem Code, dem Code des Hooks oder mit C# an sich sein. Kann mir bitte jemand weiterhelfen? Ich verzweifle langsam, weil ichs einfach nicht verstehe, warum die F12-Taste zunächst einwandfrei erkannt wird und wenn ich ein bisschen was am Computer mach, plötzlich nicht mehr.

Gibt es vielleicht irgendeine Möglichkeit, dem C#-Programm einen Vorrangstatus vor anderen Prozessen einzuräumen, oder das Programm automatisch "wiederzubeleben", wenn es nicht mehr auf F12 reagiert?

PS: Wenn ich if (e.KeyData == Keys.F12) rauskommentiere, ändert dies auch nichts an meinem Problem. Es liegt also nicht an der F12-Taste selbst. Er kommt ja nicht einmal mehr so weit bis zu der if-Abfrage, wenn das Programm wieder "schlafen" gegangen ist.

PPS: Gibt es vielleicht ein automatischen Sleepmodus für C#-Programme? Oder vielleicht pfuscht mir die automatische Garbagecollection ins Handwerk?

PPPS: Ich gebe doch einmal den ganzen Code aus MainFrm.Designer.cs an. Vielleicht ist ja da irgendwo das Problem versteckt:


using System;
using System.Windows.Forms;

namespace Bla {
	partial class MainFrm {
		/// <summary>
		/// Erforderliche Designervariable.
		/// </summary>
		private System.ComponentModel.IContainer components = null;

		/// <summary>
		/// Verwendete Ressourcen bereinigen.
		/// </summary>
		/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
		protected override void Dispose(bool disposing) {
			if (disposing && (components != null)) {
				components.Dispose();
			}
			base.Dispose(disposing);
		}

		#region Vom Windows Form-Designer generierter Code

		/// <summary>
		/// Erforderliche Methode für die Designerunterstützung.
		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
		/// </summary>
		private void InitializeComponent() {
			this.label1 = new System.Windows.Forms.Label();
			this.reloadBtn = new System.Windows.Forms.Button();
			this.SuspendLayout();
			// 
			// label1
			// 
			this.label1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
			this.label1.Font = new System.Drawing.Font("Arial", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
			this.label1.Location = new System.Drawing.Point(19, 23);
			this.label1.Name = "label1";
			this.label1.Size = new System.Drawing.Size(170, 79);
			this.label1.TabIndex = 0;
			this.label1.Text = "Bla";
			this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
			// 
			// reloadBtn
			// 
			this.reloadBtn.Location = new System.Drawing.Point(59, 125);
			this.reloadBtn.Name = "reloadBtn";
			this.reloadBtn.Size = new System.Drawing.Size(75, 23);
			this.reloadBtn.TabIndex = 1;
			this.reloadBtn.Text = "Reload";
			this.reloadBtn.UseVisualStyleBackColor = true;
			this.reloadBtn.Click += new System.EventHandler(this.reloadBtn_Click);
			// 
			// MainFrm
			// 
			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
			this.BackColor = System.Drawing.Color.Honeydew;
			this.ClientSize = new System.Drawing.Size(209, 175);
			this.Controls.Add(this.reloadBtn);
			this.Controls.Add(this.label1);
			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
			this.KeyPreview = true;
			this.MaximizeBox = false;
			this.Name = "MainFrm";
			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
			this.Text = "Blat";
			this.Load += new System.EventHandler(this.MainFrm_Load);
			this.ResumeLayout(false);

		}

		#endregion

		private System.Windows.Forms.Label label1;
		private Button reloadBtn;
	}
}

E
24 Beiträge seit 2006
vor 17 Jahren
Threat

Nabend,

hatte mal ein ähnliches Problem. Bei mir hat es geholfen das Programm in einen eigenen Threat zu verfrachten. Danach lief es stabil.

Gruß Euro.

R
Red_Wraith Themenstarter:in
150 Beiträge seit 2006
vor 17 Jahren

Original von eurofreddy
Nabend,

hatte mal ein ähnliches Problem. Bei mir hat es geholfen das Programm in einen eigenen Threat zu verfrachten. Danach lief es stabil.

Gruß Euro.

Danke für die Information.

Ich habe jetzt Program.cs so angepasst und ansonsten alles gleich belassen:


static void Main() {
	Application.EnableVisualStyles();
	Application.SetCompatibleTextRenderingDefault(false);
	Thread mainThread = new Thread(new ThreadStart(Program.Go));
	mainThread.Start();
}
		
public static void Go() {
	Application.Run(new MainFrm());
}

Leider hat das auch nichts gebracht. Mein Problem besteht noch immer. Oder habe ich das mit dem Thread falsch gemacht bzw. hast du das anders gemeint?

4.506 Beiträge seit 2004
vor 17 Jahren

Hallo Red_Wraith,

mit F12 hast Du Dir aber auch so denkbar die zweitschlechteste Taste hierfür ausgedacht.

Ich hab leider die Quelle nicht mehr in der Hand, aber es gibt so weit ich weiß nur ein HotKey Software Produzent, der die Taste F12 zuverlässig abfangen kann. Teilweise ist das sehr hart verdrahtet mit Windows. Die schlechteste Kombination wäre wohl Strg-Alt-Entf gewesen, denn das ist definitiv hart verdrahtet mit Windows.

Versuche doch einfach mal temporär auf die Taste F10 oder eine andere beliebige Taste zu wechseln, und untersuche, ob das Problem weiter besteht.

Ich vermute, dass F12 einfach zu extravagant ist 😉

Gruß
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

R
Red_Wraith Themenstarter:in
150 Beiträge seit 2006
vor 17 Jahren

Original von norman_timo
Hallo Red_Wraith,

mit F12 hast Du Dir aber auch so denkbar die zweitschlechteste Taste hierfür ausgedacht.

Ich hab leider die Quelle nicht mehr in der Hand, aber es gibt so weit ich weiß nur ein HotKey Software Produzent, der die Taste F12 zuverlässig abfangen kann. Teilweise ist das sehr hart verdrahtet mit Windows. Die schlechteste Kombination wäre wohl Strg-Alt-Entf gewesen, denn das ist definitiv hart verdrahtet mit Windows.

Versuche doch einfach mal temporär auf die Taste F10 oder eine andere beliebige Taste zu wechseln, und untersuche, ob das Problem weiter besteht.

Ich vermute, dass F12 einfach zu extravagant ist 😉

Wie ich bereits erwähnt habe, kann das leider nicht das Problem sein:

PS: Wenn ich if (e.KeyData == Keys.F12) rauskommentiere, ändert dies auch nichts an meinem Problem. Es liegt also nicht an der F12-Taste selbst. Er kommt ja nicht einmal mehr so weit bis zu der if-Abfrage, wenn das Programm wieder "schlafen" gegangen ist.

Also auch wenn das Programm auf alle Tasten reagieren soll, tritt das Problem nach einer Zeit wieder auf.

Und mir ist gerade etwas aufgefallen**!**:

Wenn ich das Programm laufen lasse und ansonsten nichts läuft und ich z.B. jede Sekunde auf F12 drücke, dann reagiert das Programm nach dem 37. F12 oder so nicht mehr. Das gleiche passiert, wenn ich ca. 37 beliebige Tasten drücke, wenn ich das Programm so wie oben angeführt umstelle. Nach mehreren Tests habe ich herausgefunden, dass es immer ca. 34 - 37 Tasteneingaben braucht, bis das Programm nicht mehr reagiert.

R
Red_Wraith Themenstarter:in
150 Beiträge seit 2006
vor 17 Jahren

Hat noch jemand eine Idee, wie ich das Problem lösen könnte?

R
Red_Wraith Themenstarter:in
150 Beiträge seit 2006
vor 17 Jahren

Ich habe eine neue Erkenntnis: Wenn ich bei der Methode SaveEdit() alles rauskommentiere, außer die zwei Console.Beep kann ich viel öfter F12 drücken, bis das Programm nicht mehr reagiert. Aber letztendlich reagiert es auch wieder nicht mehr.

Kann jemand hiermit vielleicht etwas anfangen?

PS: Wenn ich den Hook nicht benutze, sondern das ganz normale KeyUp-Event, dann hört mein Programm nicht zum reagieren auf. Nur ohne den Hook, funktioniert halt mein Programm nur wenn das Fenster gerade angewählt ist (und das will ich ja nicht).
Das Problem liegt also höchstwahrscheinlich im Code des Hooks begraben. Hat da jemand eine Ahnung, was da das Problem auslösen könnte könnte?

R
Red_Wraith Themenstarter:in
150 Beiträge seit 2006
vor 17 Jahren
Programm reagiert nach einer Zeit nicht mehr auf Tastatureingaben

Mit Application.Restart() kann man ja das Programm neustarten. Ein Programm von mir muss alle 15 Sekunden neustarten, damit der Tastatur-Hook funktionsfähig bleibt. Es wurde bisher leider noch kein anderer Lösungsweg für das Problem gefunden (Programm reagiert nach einer Zeit nicht mehr auf Tastatureingaben).

Das Problem dabei: Der komplette Neustart des Programms ist relativ ressourcenfressend, sodass man z.B. in Spielen immer einen Ruckler merkt. Gibt es vielleicht eine Neu-Laden-Funktion, die nicht das komplette Programm neustartet, sondern es nur auf Ausgangswerte zurücksetzt? Ich suche also eine Funktion, die einen nicht so "gründlichen" "Reboot" wie das Application.Restart() durchführt, wenn ihr versteht was ich meine. Natürlich in der Hoffnung, dass diese Funktion immer noch dafür ausreichen würde, dass der Tastatur-Hook wieder akzeptiert wird.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Red_Wraith,

wenn alle Stricke reißen poste bitte mal ein minimales Beispiel, das den Fehler zeigt. Ich habe zwar momentan wenig Zeit und kann nicht versprechen, dass ich es mir selbst angucken kann, aber es gibt sicher einige andere Mitglieder, die das Beispiel einfach mal bei sich testweise laufen lassen würden. Außerdem findet man selbst den Fehler oft schon beim "Abspecken" des eigentlichen Programms (top-down 🙂 bzw. beim erstellen des minimalen Beispiels (bottom-up 🙂.

herbivore

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Red_Wraith,

ich habe mal den anderen Thread ("Programm neu laden ohne es komplett neu zu starten") hier eingefügt, weil du ja eigentlich nicht das Problem lösen willst, sondern einen Workaround für das eigentliche Problem suchst. Vielleicht ist der Workaround aber gar nicht nötig, wenn du das minimale Beispiel postest. Und wenn Workaround, dann könnte es schon reichen einfach den/die Hooks regelmäßig neu zu regostrieren.

herbivore

R
Red_Wraith Themenstarter:in
150 Beiträge seit 2006
vor 17 Jahren

Ich habe jetzt auf herbivores Anraten das "minimale Beispiel" erstellt, d.h. ein minimales Programm, bei dem der Fehler auftritt. Es scheint so, dass bei diesem minimalen Beispiel das Programm nicht so leicht "einschläft", also die F12-Eingabe ignoriert. Wenn man es nur startet und mehrmals F12 drückt, passiert daher noch nichts. Deswegen sollte man das Programm starten und ca. 5 Minuten lang im Internet surfen, ein Spiel spielen oder ähnliches tun (also nicht nur 5 Minuten warten, ohne irgendwas zu tun) und dann erkennen, dass das Programm nicht mehr auf F12 reagiert.

Damit man das Programm in der IDE mit F5 starten kann muss man folgende Einstellung deaktivieren:
Projekt -> Minimal-Eigenschaften -> Debuggen -> Visual Studio-Hostprozess aktivieren

Man kann natürlich auch einfach einen Release mit F6 erstellen und das testen.

Ich wäre jedem sehr verbunden, der sich die Zeit nimmt, das Programm bei sich zu testen und nach Fehlerquellen zu suchen. Das Programm findet sich gepackt im Anhang.

PS: Den Code vom GlobalSystemHook habe ich unverändert gelassen.

6.862 Beiträge seit 2003
vor 17 Jahren

Hm, habs ne Weile laufen gehabt und es bestätigt sich eigentlich meine Vermutung die ich gleich in der ersten Antwort geäußert hab. Ein anderes Programm schnappt sich den Tastaturhook. Ich kann ne halbe Stunde machen was ich will, immer piepts. Sobald ich aber VS benutze, registriert der Debugger sich F12 als UserBreakpoint und schon funzt dein Prog nimmer 😉

Baka wa shinanakya naoranai.

Mein XING Profil.

S
8.746 Beiträge seit 2005
vor 17 Jahren

Kommt noch schlimmer: Du kannst nix dagegen unternehmen:

A given event can have more than one filter function attached. In this case, Windows maintains a last-in-first-out (LIFO) chain of the filter functions. The most recently installed function is at the beginning of the chain, and the function installed first is at the end. [Editor's Update - 5/12/2004: The text originally stated that the function installed last would be at the end of the chain. This has been fixed.] Each hook function is responsible for passing control to the next one in the chain when finished. If the filter function doesn't call the next hook, the operating system takes control of the flow and considers the event-hooking phase completed.

Will meinen: Wenn der zuletzt eingehängt Hook nicht so nett ist, die Kontrolle dem nächsten Hook zu übergeben, bist du abgeklemmt. Das erinnert an die alten Zeiten kooperativen Multitaskings.

R
Red_Wraith Themenstarter:in
150 Beiträge seit 2006
vor 17 Jahren

Original von talla
Hm, habs ne Weile laufen gehabt und es bestätigt sich eigentlich meine Vermutung die ich gleich in der ersten Antwort geäußert hab. Ein anderes Programm schnappt sich den Tastaturhook. Ich kann ne halbe Stunde machen was ich will, immer piepts. Sobald ich aber VS benutze, registriert der Debugger sich F12 als UserBreakpoint und schon funzt dein Prog nimmer 😉

Eine halbe Stunde was du willst außer VS zu nutzen? Das kann doch nicht sein. Starte mal bitte direkt die .exe aus dem Release (also ohne VS), mach eine halbe Stunde was am PC (z.B. surfen) und schau ob es noch das F12 empfängt.

Original von svenson
Kommt noch schlimmer: Du kannst nix dagegen unternehmen:

...

Will meinen: Wenn der zuletzt eingehängt Hook nicht so nett ist, die Kontrolle dem nächsten Hook zu übergeben, bist du abgeklemmt. Das erinnert an die alten Zeiten kooperativen Multitaskings.

Woher stammt der zitierte Artikel? Woraus schließt du, dass man nichts dagegen unternehmen kann? Meinst du etwa, dass andere Prozesse (z.B. Browser) selbst Hooks nutzen, und damit die Hooks meines C#-Programms zunichte machen? Dann müsste mein C#-Programm doch wieder funktionieren, wenn die anderen Prozesse geschlossen werden, oder? Außerdem, warum funktioniert dann der Hook nicht sofort nicht mehr, wenn ich einen anderen Prozess starte, sondern erst nach einer Zeit?
Kann man nicht irgendwie den Hook-Empfang meines C#-Programms "reset"en, ohne das ganze Programm z.B. mit Application.Restart() neustarten zu müssen.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Red_Wraith,

du kannst deinen Hook neu registrieren (und dabei freundlich zu den anderen Programmen sein).

herbivore

S
8.746 Beiträge seit 2005
vor 17 Jahren
6.862 Beiträge seit 2003
vor 17 Jahren

Original von Red_Wraith
Eine halbe Stunde was du willst außer VS zu nutzen? Das kann doch nicht sein. Starte mal bitte direkt die .exe aus dem Release (also ohne VS), mach eine halbe Stunde was am PC (z.B. surfen) und schau ob es noch das F12 empfängt.
.

Habs eh direkt ausm Release Ordner gestartet, weil ich auf Arbeit nur VS 2003 zu laufen hab. Wenn ich ne halbe Stunde surfe wird mir mein Projektleiter aber was husten 😁

VS war nur nen Beispielprogram was nen globalen Tastaturhook benutzt. Im Moment bin ich mir aber auch gar net hindertprozentig sicher ob wirklich VS Schuld war oder einfach das Programm wo ich grad mitentwickel, glaube des registriert auch globale Tastaturhooks.

Und ja, wenn ich halt nur Programme benutze die da nichts registrieren kann ich auch nach ner halben Stunde des piepen hören 😉 Mal überlegen, in der Zeit wo ich drauf geachtet hab liefen zig Explorer Instanzen, Notepad++, Firefox, XMLSpy, Sourcesafe, und noch nen paar Kleinigkeiten. VS lief auch, aber des Verhalten das dein Hook verloren ging, kam erst beim Debuggen.

Baka wa shinanakya naoranai.

Mein XING Profil.

R
Red_Wraith Themenstarter:in
150 Beiträge seit 2006
vor 17 Jahren

Original von herbivore
du kannst deinen Hook neu registrieren (und dabei freunlich zu den anderen Programmen sein).

Wie kann ich den alten Hook löschen und einen neuen registrieren? Also mit welchen Befehlen? Wenn das funktionieren würde, könnte ich ja einfach alle 10 Sekunden oder so den Hook neustarten, ohne das ganze Programm neustarten zu müssen.

svenson
Hier der komplette Artikel:


>

Okay, und was ist mit den anderen Fragen, die ich dir gestellt habe?

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Red_Wraith,

Wie kann ich den alten Hook löschen und einen neuen registrieren? Also mit welchen Befehlen?

löschen weiß ich nicht, aber fürs Registrieren müsstest du ja den Code haben.

Wenn das funktionieren würde, könnte ich ja einfach alle 10 Sekunden oder so den Hook neustarten, ohne das ganze Programm neustarten zu müssen.

So habe ich das gemeint, wobei man sich über die Zeitdauer streiten kann.

herbivore

R
Red_Wraith Themenstarter:in
150 Beiträge seit 2006
vor 17 Jahren

Original von herbivore

Wie kann ich den alten Hook löschen und einen neuen registrieren? Also mit welchen Befehlen?
löschen weiß ich nicht, aber fürs Registrieren müsstest du ja den Code haben.

Kann ich einfach den alten Hook überschreiben? Weil, wenn ich jedes mal einen neuen Hook aufmache, dann sind das ja nach ein paar Minuten viel zu viele.

Mein einziger Code, mit denen ich den Hook einbinde ist:


private void Form1_Load(object sender, EventArgs e) {
	UserActivityHook actHook = new UserActivityHook();
	actHook.KeyUp += new KeyEventHandler(this.Key_Up);
}

Kann ich einfach nochmal UserActivityHook actHook = new UserActivityHook(); schreiben, oder wie meinst du das?

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Red_Wraith,


private UserActivityHook actHook = new UserActivityHook();
private void Form1_Load(object sender, EventArgs e) {
    actHook.KeyUp -= new KeyEventHandler(this.Key_Up);
    actHook.KeyUp += new KeyEventHandler(this.Key_Up);
}

herbivore

R
Red_Wraith Themenstarter:in
150 Beiträge seit 2006
vor 17 Jahren

Gleich mal die guten Nachrichten: ES FUNKTIONIERT JETZT!

Ich habe beim Code des Minimalbeispiels aus


private void Form1_Load(object sender, EventArgs e) {
	UserActivityHook actHook = new UserActivityHook();
	actHook.KeyUp += new KeyEventHandler(this.Key_Up);
}

das folgende gemacht:


private UserActivityHook actHook = new UserActivityHook();

private void Form1_Load(object sender, EventArgs e) {
	actHook.KeyUp += new KeyEventHandler(this.Key_Up);
}

Ansonsten keine Veränderungen!

Mein Erklärungsversuch, warum das ganze jetzt funktioniert:

Beim alten Code wird der Hook direkt an den Prozess angehängt, denn das Objekt actHook verschwindet nach dem Ausführen von Form1_Load (weil actHook ja nur eine temporäre Variable bzw. temporäres Objekt ist). Andere Programme, die selbst Hooks nutzen, können den Hook von meinem Programm "überschreiben". Somit ist der Hook gänzlich aus meinem Programm verschwunden und das Programm reagiert nicht mehr auf F12.
Beim neuen Code wird das Objekt actHook auf Klassenebene deklariert, gehört also direkt zur Form1-Klasse und ist somit auch in der Instanz dieser Klasse (also in dem Fenster) vorhanden. Damit existiert das Objekt actHook dauerhaft. Selbst wenn dann ein anderes Programm den Hook meines Prozesses überschreibt, kann der Hook nicht ganzlich verschwinden, da ja das Objekt actHook inklusive der Eigenschaft .KeyUp noch existiert.

Ich bedanke mich recht herzlich bei allen, die mich bei der Fehlersuche unterstützt haben!!

^
2 Beiträge seit 2010
vor 13 Jahren

Hallo,

ich weiß das Thema ist schon 4 Jahre alt, dennoch stehe ich gerade vor dem selben Problem. Allerdings tritt das Problem mit jeder Hook die ich bisher benutzt habe auf.
Deklariert habe ich diese auch ausserhalb einer Funktion, wie es bei ihm später ohne Probleme lief.

mfg