Diskuze: Key pressy
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 5 zpráv z 5.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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)
{
}
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;
...
}
Zobrazeno 5 zpráv z 5.