Wie auf Tastendruck Event reagieren bzw. warten?
-
Ich muss euch nochmal stören, kriege es nicht hin in der Konsole das Beispiel von hier auszuführen: http://www.pinvoke.net/default.aspx/user32.RegisterHotKey
Ich habe die Klasse GlobalHotkeys in mein Projekt aufgenommen, in meiner Programm Klasse habe ich nun folgendes gemacht:
class Program : Form { private GlobalHotkeys hotkey; public Program() { hotkey = new GlobalHotkeys(); hotkey.RegisterGlobalHotKey((int)Keys.ControlKey, GlobalHotkeys.MOD_CONTROL); hotkey.UnregisterGlobalHotKey(); } protected override void WndProc(ref Message m) { const int WM_HOTKEY = 0x0312; switch (m.Msg) { case WM_HOTKEY: if ((short)m.WParam == hotkey.HotkeyID) { MessageBox.Show("TEST"); // do your thing } break; default: base.WndProc(ref m); break; } } [STAThread] static void Main(string[] args) { Application.Run(new Program()); } }
Darf man Konsolenanwendungen von Form ableiten wie ich das gemacht habe??
wieso passier nix wenn ich STRG drücke??
-
Servus,
wusste garnicht das es sowas gibt... lustig...
hotkey.RegisterGlobalHotKey((int)Keys.ControlKey, GlobalHotkeys.MOD_CONTROL); hotkey.UnregisterGlobalHotKey();
Es passiert nichts, weil du nach dem Register wieder ein "Un"register aufrufst...
Macht nicht viel Sinngruß
Hellsgore
-
Wie kann ich nun auf deinen Code reagieren wenn die STRG Taste gedrückt wird, will zum Test ein String in der Konsole ausgeben und muss ich noch eine Schleife einbauen die ständig wartet?
public class Programm { static void OnKeyboardHookKeyDown(object sender, KeyEventArgs e) { e.Handled = true; // Taste generell blocken } public static int Main(String[]args) { KeyboardHook keyboardHook = new KeyboardHook(); keyboardHook.KeyDown += new KeyEventHandler(OnKeyboardHookKeyDown); // Hier deine STRG Taste keyboardHook.HookedKeys.Add(Keys.Control); return 0; } }
-
Servus,
du reagierst schon auf den Tastendruck. Allerdings springst du nach dem Initialisiern des Hooks direkt mit "return 0" aus deiner Main wieder heraus. Wird die STRG Taste gedrückt, wird das Event KeyDown gefeuert. Entweder baust du die Klasse um, dass du auf eine Taste in einer Endlosschleife wartest oder du lässt dein Programm nach der Hook Initialisierung solange laufen, bis das Event gefeuert wird.
gruß
Hellsgore
-
Hi, hab letztens wieder das Programm rausgesucht, nun habe ich in der Main mit der Applicatio.Run() die Nachrichtenschleife eingeleitet, nun wenn ich mit dem Debugger durch den Code gehe bin ich ständig in der HookProcedure() Funktion, aber er springt nicht hier rein:
if (this.hookedKeys.Contains(key)) ...
Ich komme garnicht dazu in der Konsole auf eine Taste zu drücken da ständig der Debugger die Funktion durchläuft. Für WinForms gibt es etliche Beispiele doch für die Konsole hab ich kein brauchbares gefunden, hoffe du kannst mir noch einmal weiterhelfen, möchte es gerne hinbekommen.
MfG
-
Servus,
beim Debuggen beisst sich die Katze in den Schwanz... Du landes im Debugger und drückst wahrscheinlich auf "F5" und was passiert? Genau, ein Key Event wird gefeuert und er landet wieder darin
Sowas mache ich eigentlich nicht, da ich dir schon dein fertiges Programm fast geschrieben habe aber Ausnahmen bestätigen die Regel...
Hier hast du dein Tool...
class Program { private static void OnKeyboardHookKeyDown(object sender, KeyEventArgs e) { Console.WriteLine("Uhh, its so amazing... KeyDown event fired!!!"); e.Handled = true; // Taste generell blocken Console.WriteLine(string.Format("{0} blocked...", e.KeyCode)); } private static void OnKeyboardHookKeyUp(object sender, KeyEventArgs e) { Console.WriteLine("Uhh, its so amazing... KeyUp event fired!!!"); e.Handled = true; // Taste generell blocken Console.WriteLine(string.Format("{0} blocked...", e.KeyCode)); } private static void Main(string[] args) { KeyboardHook keyboardHook = new KeyboardHook(); keyboardHook.KeyDown += new KeyEventHandler(OnKeyboardHookKeyDown); keyboardHook.KeyUp += new KeyEventHandler(OnKeyboardHookKeyUp); // Hier deine linke STRG Taste keyboardHook.HookedKeys.Add(Keys.LControlKey); // Hier deine rechte STRG Taste keyboardHook.HookedKeys.Add(Keys.RControlKey); Application.Run(); } }
gruß
Hellsgore
-
Vielen Dank
Ich habe nun in der OnKeyboardHookKeyDown() Funktion eine eigene MessageBox mit einem OK Button erstellt, also wenn die STRG gedrückt wird, poppt dieses Fenster aus. Wie kann man weitere Fenster blockieren wenn jemand wieder die STRG drückt, welche Möglichkeiten gibt es??
private static void OnKeyboardHookKeyDown(object sender, KeyEventArgs e) { e.Handled = true; // Taste generell blocken using (AbortMessage f = AbortMessage.getInstance()) { if (f.ShowDialog() == DialogResult.OK) { //Close current Thread _isExit = true; //Close Application Message Loop Application.Exit(); } } }
-
Servus,
jetzt solltest du aber mal ganz gut nachdenken. Das ist sehr simpel und einfach. Stichwort Variable / Feld vom Typ boolean.
gruß
Hellsgore
-
Schon erledigt, habs mit Singleton Pattern erstellt, welcher die Instanz der Klasse übergibt.
Was mir aufgefallen ist, dass die Reaktion der Fenster sehr träge ist. Wenn das Fenster erstellt wird und ich gleich mit der Maus auf den OK Button klicken will, dauert es ungefähr 4 Sekunden bis das Fenster darauf reagiert, liegt es am hook??
-
Ich möchte gern das Programm erweitern, es soll diesmal auf 3 Tasten gewartet werden wie z.B. STRG+SHIFT+1. Die Tasten habe ich registriert, nun muss in der HookProcedure() auf drei Tasten gewartet werden, wie bevor das Event gefeuert wird. Ich bin mir nicht sicher, aber ich glaube folgender Teil müsste geändert werden:
Keys key = (Keys)lParam.VKCode; if (this.hookedKeys.Contains(key)) { ..
Es soll nicht auf eine sondern 3 registrierte Tasten gewartet werden. Wie sollte man das lösen?