IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
denoy
Člen
Avatar
denoy:3.11.2012 22:01

Zdravím,
chci se zeptat, jak ve formové aplikaci zaznamenávat keypressy i v případě, že není aplikace aktivní (není na popředí, ale je Hide).

Díky za odpovědi.

 
Odpovědět
3.11.2012 22:01
Avatar
matesax
Tvůrce
Avatar
Odpovídá na denoy
matesax:3.11.2012 22:31
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.ComponentModel;

public struct KeyboardHookStruct
{
    public int VkCode, ScanCode, Flags, Time, DwExtraInfo;
}

public class GlobalKeyboardHook
{
    private const int WH_KEYBOARD_LL = 13, WM_KEYDOWN = 0x100, WM_KEYUP = 0x101, WM_SYSKEYDOWN = 0x104, WM_SYSKEYUP = 0x105;

    private IntPtr hhook = IntPtr.Zero;

    public delegate int KeyboardHookProc(int code, int wParam, ref KeyboardHookStruct lParam);

    public event KeyEventHandler KeyDown, KeyUp;

    private static KeyboardHookProc callbackDelegate;

    [DllImport("user32.dll")]
       static extern IntPtr SetWindowsHookEx(int idHook, KeyboardHookProc callback, IntPtr hInstance, uint threadId);

       [DllImport("user32.dll")]
       static extern bool UnhookWindowsHookEx(IntPtr hInstance);

       [DllImport("user32.dll")]
       static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, ref KeyboardHookStruct lParam);

       [DllImport("kernel32.dll")]
       static extern IntPtr LoadLibrary(string lpFileName);

       public GlobalKeyboardHook()
    {
        IntPtr hInstance = LoadLibrary("User32");
        callbackDelegate = new KeyboardHookProc(HookProc);
        hhook = SetWindowsHookEx(WH_KEYBOARD_LL, callbackDelegate, hInstance, 0);
       }

       ~GlobalKeyboardHook()
    {
        if (!UnhookWindowsHookEx(hhook))
            throw new Win32Exception();

        callbackDelegate = null;
       }

       public int HookProc(int code, int wParam, ref KeyboardHookStruct lParam)
    {
               if (code >= 0)
        {
            KeyEventArgs kea = new KeyEventArgs((Keys)lParam.VkCode);

            if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null))
                KeyDown(this, kea);
            else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null))
                               KeyUp(this, kea);
               }

               return CallNextHookEx(hhook, code, wParam, ref lParam);
       }
}

Použití:

private void Form1_Load(object sender, EventArgs e)
{
gkh.KeyDown += new KeyEventHandler(GlobalKeyboardHook_KeyDown);
gkh.KeyUp += new KeyEventHandler(GlobalKeyboardHook_KeyUp);
}

private void GlobalKeyboardHook_KeyUp(object sender, KeyEventArgs e)
{

}

private void GlobalKeyboardHook_KeyDown(object sender, KeyEventArgs e)
{

}
 
Nahoru Odpovědět
3.11.2012 22:31
Avatar
denoy
Člen
Avatar
denoy:4.11.2012 1:08

Přesně to jsem potřeboval, díky moc!

Nemáš ještě někde popis všech kláves, která je jak označená?

 
Nahoru Odpovědět
4.11.2012 1:08
Avatar
matesax
Tvůrce
Avatar
Odpovídá na denoy
matesax:4.11.2012 6:56

Co? :) Je to normální KeyEvent - takže si dáš v jedné z těch metod e.KeyData a pak panuj switchem:

switch (e.KeyData)
{
    case Keys.Delete:

         break;

    ...
}
 
Nahoru Odpovědět
4.11.2012 6:56
Avatar
denoy
Člen
Avatar
denoy:4.11.2012 11:08

Jojo, promin já blbě pochopil tu jednu funkci, 2 hodiny ráno udělají své :-D Díky jde to dobře.

 
Nahoru Odpovědět
4.11.2012 11:08
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.