jac
jac

Reputation: 9726

Capture Keystrokes

I need to capture keystokes from a wedge device and prevent any controls or the form from receiving them. I also need to be able to know the value (char). I have tried overriding the ProcessCmdKey(Keys) and ProcessDialogChar(char) events. In the ProcessCmd event I can suppress the keystroke if it's one I want, but I the character isn't a parameter of the event. In the ProcessDialogChar event the character is there, but I cannot prevent the form or control with the focus from receiving the key. Suggestions?

Upvotes: 1

Views: 1591

Answers (2)

jac
jac

Reputation: 9726

It was not how I wanted to do it, but because I needed to fix this and move on I put a hidden textbox on the form and as soon as I see the character that signals the possible start of the string of data I want to capture I set focus to that text box and respond to the TextChanged event. If I haven't seen the ending character before I timer expires I clear the textbox and start again. Kludge, but it works and got me to the next task.

Upvotes: 1

jasonh
jasonh

Reputation: 30303

You'll want to add this during Form load:

Application.AddMessageFilter(this);

Add this constant:

private const int WM_KEYDOWN = 0x100;

And this method:

public bool PreFilterMessage(ref Message m)
{
    Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode;
    bool retVal = false;

    if (m.Msg == WM_KEYDOWN)
    {
        // Handle the keypress
        retVal = true;
    }

    return retVal;
}

By returning true, your form and control(s) will never see the key press.

Upvotes: 5

Related Questions