1

I'm having a problem with a Global Keyboard Hook.

For the most part, it works. Bu,t in the section below, it should be stopping the enter key from being passed onto the focused program. It only works about half the time.

Any ideas as to why it would block the enter key sometimes and not others?

Here is the relevant code:

  [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);


    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;
    private const int WM_KEYUP = 0x0101;
    private static LowLevelKeyboardProc _proc = HookCallback;
    private static IntPtr _hookID = IntPtr.Zero;

And:

_hookID = SetHook(_proc);

And:

  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)
{



    Keys keyName;
    bool validKey;
    int vkCode = Marshal.ReadInt32(lParam);
    keyName = (Keys)vkCode;
    validKey = monitorKeys.Contains(keyName.ToString()); //checks if the current key is in our list of keys to monitor



    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
    {

        vkCode = Marshal.ReadInt32(lParam);
        keyName = (Keys)vkCode;



       if (validKey && keyName == Keys.Enter && altActive == false && ctrlActive == false)
        {


            char c = new char();
            c = KeyConvertor.ToAscii(keyName);
            }

            displayBuffer += c.ToString();

//do some db lookups on the current word here



            lblBuffer.Text = displayBuffer;

            return (IntPtr)1; //no key is sent to program This only works about half the time even though (IntPtr)1 is being returned.

        }


        return CallNextHookEx(_hookID, nCode, wParam, lParam); //key is passed on to program
        }

    }

    else if (nCode >= 0 && wParam == (IntPtr)WM_KEYUP)
    {


        //trap the key
        return (IntPtr)1;

    }

    return CallNextHookEx(_hookID, nCode, wParam, lParam); //key is passed on to program
}
John Saunders
  • 160,644
  • 26
  • 247
  • 397
PlexXoniC
  • 31
  • 5
  • 1
    possible duplicate of [SetWindowsHookEx global keyboard hook not catching all keypresses](http://stackoverflow.com/questions/1983148/setwindowshookex-global-keyboard-hook-not-catching-all-keypresses) –  Apr 21 '11 at 18:57
  • I checked that one out, not the same issue, keyboard events are firing with the hook but for example, the enter key is supposed to be blocked in my code but it only catches it some of the time. Thanks though. – PlexXoniC Apr 21 '11 at 19:18

0 Answers0