title: Global keyboard hook that doesn't disable user input outside of form
body: <p>So i'm trying to find a global keyboard hook for C#. I found a class that worked to hook the keyboard, but it disabled the keyboard outside of the form. This is the current keyboard hook:</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Text;
  using System.Runtime.InteropServices;
  using System.Windows.Forms;
  
  namespace Project
  {
  
      class globalKeyboardHook
      {
  
          public delegate int keyboardHookProc(int code, int wParam, ref keyboardHookStruct lParam);
  
          public struct keyboardHookStruct
          {
              public int vkCode;
              public int scanCode;
              public int flags;
              public int time;
              public int dwExtraInfo;
          }
  
          const int WH_KEYBOARD_LL = 13;
          const int WM_KEYDOWN = 0x100;
          const int WM_KEYUP = 0x101;
          const int WM_SYSKEYDOWN = 0x104;
          const int WM_SYSKEYUP = 0x105;
  
          public List&lt;Keys&gt; HookedKeys = new List&lt;Keys&gt;();
  
          IntPtr hhook = IntPtr.Zero;
  
          public keyboardHookProc SAFE_delegate_callback;
          public event KeyEventHandler KeyDown;
  
          public event KeyEventHandler KeyUp;
  
          public globalKeyboardHook()
          {
              hook();
          }
  
          ~globalKeyboardHook()
          {
              unhook();
          }
  
          public void hook()
          {
              IntPtr hInstance = LoadLibrary("User32");
              SAFE_delegate_callback = new keyboardHookProc(hookProc);
              hhook = SetWindowsHookEx(WH_KEYBOARD_LL, SAFE_delegate_callback, hInstance, 0);
  
          }
  
          public void unhook()
          {
              UnhookWindowsHookEx(hhook);
          }
  
          public int hookProc(int code, int wParam, ref keyboardHookStruct lParam)
          {
  
              try
              {
                  if (code &gt;= 0)
                  {
                      Keys key = (Keys)lParam.vkCode;
                      if (HookedKeys.Contains(key))
                      {
                          KeyEventArgs kea = new KeyEventArgs(key);
                          if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) &amp;&amp; (KeyDown != null))
                          {
                              KeyDown(this, kea);
                          }
                          else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) &amp;&amp; (KeyUp != null))
                          {
                              KeyUp(this, kea);
                          }
                          if (kea.Handled)
                              return 1;
                      }
                  }
  
                  return CallNextHookEx(hhook, code, wParam, ref lParam);
              }
              catch { return 0;  }
          }
  
  
          [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);
  
      }
  }
  </code></pre>
  
  <p>Would anyone know how to change the exisiting hook so that it still allows the user to type, or know of another example that does this.</p>
  
  <p>Thanks.</p>