Odpověď naleznete ve článku pana Kindermanna: http://www.vbnet.cz/clanek--104-globalni... Vás zajímá přímo tato část kódu:
public class KeyboardHook
{
private IntPtr hook;
private IntPtr lib;
public KeyboardHook()
{
lib = api.LoadLibrary("kernel32.dll"); //nahrajeme modul kernel32.dll
hook = api.SetWindowsHookEx(api.WH_KEYBOARD_LL, MyCallbackFunction, lib, 0); //nastavíme hook
}
~KeyboardHook()
{
api.UnhookWindowsHookEx(hook); //odebereme hook
api.FreeLibrary(lib); //uvolníme z paměti nahraný modul
}
//tato metoda bude volána po každém stisku klávesy
private IntPtr MyCallbackFunction(int code, uint wParam, ref api.KeyboardHookStruct lParam)
{
if (wParam == api.WM_KEYFIRST || wParam == api.WM_SYSKEYDOWN) //pouze při stisku
{
if (KeyPressed != null) KeyPressed((int)lParam.vkCode);
}
if (lParam.vkCode == 68) return new IntPtr(1); //pokud stiskneme 'D', tak zpráva bude zahozena
return api.CallNextHookEx(hook, code, wParam, lParam); //zajistí že pokud někde byly nastaveny ještě další hooky, tak se k nim zpráva dostane
}
}
Ale přečtěte si celý článek, protože je velmi zajímavý a jsou tam další podpůrné mechanismy, bez kterých kód výše nebude pracovat.
|