Konsolen Hotkeys
-
Hallo zusammen !
Ich habe ein Konsolenprogramm geschrieben, das "versteckt" im hintergrund startet.
Nun möchte ich wenn man eine bestimmte Tastenkombination drückt (ctrl + F), das Konsolenprogramm wieder sichtbar wird. (Um bestimmte Einstellungen durchzuführen)Ich habe in Google nach dem Stichwort Hotkeys c# gesucht, habe aber nichts brauchbares gefunden.
Gruss user5
Ps. Es ist ein Backup Program das ich geschrieben habe, kein Keylogger
-
Vllt. hilft dir RegisterHotkey weiter?
-
Servus,
du kannst RegisterHotkey verwenden oder du schreibst einen GlobalKeyHook (Google Stichwort: Global hooks). Dann hättest du aber schon einen KeyLogger
Du kannst aber auch richtig "quick and dirty" mit GetAsyncKeyState (Native Methode aus der WinApi) zyklisch den Status der Tasten abfragen. Ist zwar unsauber, geht aber:
Bsp.
private const int KEY_PRESSED = 0x8000; [DllImport("User32.dll", EntryPoint = "GetAsyncKeyState")] internal static extern short GetAsyncKeyState(int nVirtKey); private static void GetKeyState(out bool alt, out bool ctrl, out bool shift, out bool fKey) { alt = ( ( GetAsyncKeyState((int)Keys.Menu) & KEY_PRESSED ) != 0 ? true : false ); ctrl = ( ( GetAsyncKeyState((int)Keys.ControlKey) & KEY_PRESSED ) != 0 ? true : false ); shift = ( ( GetAsyncKeyState((int)Keys.ShiftKey) & KEY_PRESSED ) != 0 ? true : false ); fKey = ( ( GetAsyncKeyState((int)Keys.F) & KEY_PRESSED ) != 0 ? true : false ); }
hf
Hellsgore
-
Vielen Dank !!!
Habs mit RegisterHotKey gemacht.
Soll ich noch den Code posten ?Gruss User5
-
Servus,
für andere Benutzer die sich die selbe Frage stellen, ist es bestimmt interessant.
gruß
Hellsgore
-
Habe jetzt doch einen Fehler entdeckt !
listenkey.cs
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace namespace1 { class listenkey { private Hotkey _Hotkey = new Hotkey(); public listenkey() { try { _Hotkey.Pressed += new EventHandler(_Hotkey_Pressed); register(); } catch (Exception exd) { MessageBox.Show(exd.Message); } -> //MessageBox.Show(""); } void _Hotkey_Pressed(object sender, EventArgs e) { Hide.showConsole(); _Hotkey.Value = Keys.None; } public void register() { var modifier = Keys.Control; var k = Keys.P; _Hotkey.Value = k | modifier; } } }
Wenn ich jetzt das Object erzeuge mit listenkey lis = new listenkey(); und z.B
MessageBox(""); nicht in den listenkey Konstruktor hinzufüge oder in MessageBox Ok klicke, dann fährt mein Programm einfach fort dort wo ich das Objekt erzeugt habe(logisch ...), und die Hotkeys funktionieren nicht mehr !!!Wieso funktioniert es mit MessageBox() aber nicht mit Console.ReadLine() ?
Ich brauche eine "blockierende Funktion" wie Application.Run für die Console.Weis jemand die Antwort ?
Ich habe MessageBox im Code mit einem -> markiert.Mit Console.readline() will es einfach nicht funktionieren.
Gruss User 5
-
Keiner eine Idee ?
Gruss User5
-
Ich denke, du brauchst eine Nachrichtenschleife (Windows message loop) und daher funktioniert MessageBox.Show, aber Console.ReadLine nicht.
Evtl. könntest du versuchen "Application.Run()" zu verwenden (also ohne eine Form) bzw, "Application.Run(ApplicationContext)"...
-
Th69 schrieb:
Evtl. könntest du versuchen "Application.Run()" zu verwenden (also ohne eine Form) bzw, "Application.Run(ApplicationContext)"...
Geht nicht Fehlermeldung "1-Argument: Kann nicht in "System.Windows.Forms.ApplicationContext" Konvertiert werden"
Code:
Application.Run(new listen());
Gruss
-
User user5 = new User() schrieb:
Th69 schrieb:
Evtl. könntest du versuchen "Application.Run()" zu verwenden (also ohne eine Form) bzw, "Application.Run(ApplicationContext)"...
Geht nicht Fehlermeldung "1-Argument: Kann nicht in "System.Windows.Forms.ApplicationContext" Konvertiert werden"
Code:
Application.Run(new listen());
Gruss
Ich bin doch so ein Esel, habe vergessen die Klasse von Windows.Forms abzuleiten ...
Das Problem jetzt wird ein Form angezeigt, wenn man this.Hide() oder Visible = True setz sieht man es immer noch ?
Gruss User5
-
this.ShowInTaskbar = false; this.WindowState = System.Windows.Forms.FormWindowState.Minimized;