Tastatur abfragen

cantharis

Grünschnabel
Hallo,
ich versuche die Eingabe der Tastaur auszulesen hab dabei aber meine schwierigkeiten und das was ich im Internet gefunden habe (das war einiges) hat mir leider nicht geholfen. Die dortigen Lösungen haben bei mir alle nicht funktioniert. Die beisten bassieren ja auf der KeyEventArgs Klasse aber bei funktioniert einfach nichts. Kann es vielleicht daran liegen das ich keine Form habe? Also ich hab ein neues Projeckt erstellt (WIndows-Forms) aber habe dann die Datei Form.cs gelöscht. Funktioniert es deshalb vielleicht nicht? Wenn ich das über GetKeyState mache funktioniert es so wie es soll aber ich hab momentan für jede einzelne Taste eine eigene if abfrage das kann es doch nicht sein? Außerdem werden zb das numb-pad ignoriert? Wär super wenn ihr mir helfen könnt.

Grüße cantharis
 
Also ich hab jetzt auf deinen Tipp hin mal ein bisschen nach Hooks gesucht und das gefunden:

Code:
using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;

class InterceptKeys
{
    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;
    private static LowLevelKeyboardProc _proc = HookCallback;
    private static IntPtr _hookID = IntPtr.Zero;

    public static void Main()
    {
        _hookID = SetHook(_proc);
        Application.Run();
        UnhookWindowsHookEx(_hookID);
    }

    private static IntPtr SetHook(LowLevelKeyboardProc proc)
    {
        using (Process curProcess = Process.GetCurrentProcess())
        using (ProcessModule curModule = curProcess.MainModule)
        {
            return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
                GetModuleHandle(curModule.ModuleName), 0);
        }
    }

    private delegate IntPtr LowLevelKeyboardProc(
        int nCode, IntPtr wParam, IntPtr lParam);

    private static IntPtr HookCallback(
        int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
        {
            // this doesn't work for me
            int vkCode = Marshal.ReadInt32(lParam);
            MessageBox.Show(vkCode.ToString());
        } 
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook,
        LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
        IntPtr wParam, IntPtr lParam);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);
}


Zwei Probleme habe ich damit, erstens Verstehe ich den Code nicht so ganz :\ und zweitens, wenn man eine Taste drückt würd immer die "Zahl" dafür ausgegeben und ich würde aber gene den Namen also zb "Esc" oder "G" geliefert bekommen.
 
Warum benutzt nicht einfach eine der von mir genannten Bibliotheken bzw. deren Sourcecode..?

Aber du kannst einfach den Wert von vkCode in einen Keys Wert umwandeln:

C#:
Keys k = (Keys) vkCode;

k.ToString() würde dann z.b. Escape liefern, und du könntest einfach mit anderen Keys Werten vergleichen.
 

Neue Beiträge

Zurück