Forum: PC-Programmierung WPF C# Alt-Taste blocken


von Waldi (Gast)


Lesenswert?

Hi,

ich möchte mit Keyboard-Hooks "Makros" ausführen / Programmieren...

Unter anderem will ich auch Tasten / Tastenkombinationen senden => was 
dann zusätzlich mit Windows.Forms kein Problem ist...

Was allerdings ein Problem ist, dass wenn ich z.B. mit [Alt] + [1] den 
Text "Test" an den Editor sende, dann ist ja noch die Alttaste gedrückt 
und die einzelnen Buchstaben machen dann Menüaktionen :/

gut, also hab ich eben den Command erst ausgeführt als die Alt-Taste 
losgelassen wurde, aber selbst da erkennt er die Alt noch... erst nach 
200ms Verzögerung schreibt er auch "Test" in den editor "ohne 
Menüaktionen"

nun, ich möchte aber dass das ganze einiges schneller geht. Gibt es eine 
Möglichkeit die "Alt"-Taste dann zu deaktivieren oder noch besser diese
> SendKeys.SendWait
ohne die Zusätzlichen tasten wie z.B. alt? sondern lediglich das was er 
senden Soll?

Ich hoffe meine Problemstellung ist klar, ggf. muss ich einfach mehr 
nachliefern.

Danke

von Matthias (Gast)


Lesenswert?

Zeig mal den Code, wo du auf [Alt] + [1] reagierst? Ist das ein KeyDown- 
 KeyUp-  Keypress-Eventhandler?

Falls ja, hast du es mal mit

private void control_KeyPress(object sender, 
System.Windows.Forms.KeyPressEventArgs e)
{
   // dein Code...

   // Event ist behandelt und muss nicht mehr weitergeleitet werden
   e.Handled = true;
}

von Waldi (Gast)


Lesenswert?

nein, das ist ein HookCallback welcher auf alles was ich drücke oder 
Loslasse Reagiere...

das Problem ist, dass das Vordergrundfenster dies auch "mitbekommt"...
=> leider gibt es auf der Tastatur keine Taste vor der man sicher ist...

zwar kann ich schon [strg] oder [alt] + "Zahlen" drücken ohne dass was 
passiert, aber sobald Buchstaben geschrieben werden, reagieren 80% aller 
Vordergrundfenster (Browser, Editor...)

das ganze mach ich mit einem LowLevelKeboardProc

> private static LowLevelKeyboardProc _proc = HookCallback;

der Callback wird dann in Tastenzustand <- gedrückt / losgelassen & 
welche Taste aufgesplittet...

> private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)

aber wie schon erwähnt, der Keyboard-Hook fängt keine eingaben ab, 
sondern schreibt diese nur mit (könnte man fast schon nen Keylogger 
draus bauen :-) )...
Ich will aber in der Tat, diverse Tasten "abfangen" <- idealerweise nur 
zu bestimmten Zeiten
=> und zwar genau dann wenn der Hook, nicht mitliest sondern selbst 
aktiv schreibt! <- damit "persönliche" Eingaben nicht die Ausgabe Stören
... theoretisch könnte man sogar die ganze Tastatur deaktivieren... <- 
aber diese "idee" ist auch gefährlich, immerhin soll man notfalls noch 
abrechen oder andersweitig Aggieren können...

> Habe im Internet ein Tool gefunden (MapKeyboard) mit welchen man die Tasten 
umbelegen kann... allerdings macht er das in der Regedit und das wiederum erst 
nach einem Relog <- was dann wieder nicht temporär wäre...

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Waldi schrieb:
> das ganze mach ich mit einem LowLevelKeboardProc

https://www.codeproject.com/Articles/14485/Low-level-Windows-API-hooks-from-C-to-stop-unwante

Da müsste an Funktionen alles dabei sein. - Vorallem der Teil in der 
Mitte der Seite...
1
private const int WM_KEYUP = 0x0101;
2
private const int WM_SYSKEYUP = 0x0105;
3
4
private IntPtr HookCallback(int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam)
5
{
6
  //Filter wParam for KeyUp events only - otherwise this code
7
  //will execute twice for each keystroke (ie: on KeyDown and KeyUp)
8
  //WM_SYSKEYUP is necessary to trap Alt-key combinations
9
  if (nCode >= 0)
10
  { 
11
      if (wParam == (IntPtr)WM_KEYUP || wParam == (IntPtr)WM_SYSKEYUP)
12
      {
13
        //Raise the event
14
        OnKeyIntercepted(new KeyboardHookEventArgs(lParam.vkCode, AllowKey));
15
      }
16
      //Return a dummy value to trap the keystroke
17
      return (System.IntPtr)1;
18
  }
19
  //The event wasn't handled, pass it to next application
20
  return CallNextHookEx(hookID, nCode, wParam, ref lParam);
21
}

Einen dummy-Keystroke / bzw. das zu sendende "Makro" zurückgeben. So 
weit warst du sicher aber auch schon.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.