Suppressing global windows shortcuts while recording keypresses

192 Views Asked by At

Is it possible to suppress the windows global shortcuts while recording keypresses ?

I have a Windows Form application written in c#, and using this library to record keypresses to use later in macros. Now when I record the key combinations that are used by Windows (i.e. L Control + Win + Right Arrow to change virtual desktop on Win 10), I'd like my app to record it but avoid windows actually using it while I record which is quite annoying.

I have a checkbox to enable key capturing, on click event

m_KeyboardHookManager.KeyDown += HookManager_KeyDown;

the HookManager_KeyDown is simply like this

private void HookManager_KeyDown(object sender, KeyEventArgs e)
{
    Log(string.Format("KeyDown \t\t {0}\n", e.KeyCode));
    string [] sArr = new string [2];
    if (keyBindingArea1.Text != "")
    {
        sArr[0] = keyBindingArea1.Text;
        sArr[1] = string.Format("{0}", e.KeyCode);

        keyBindingArea1.Text = string.Join("+", sArr);
    }
    else
    {
        keyBindingArea1.Text = string.Format("{0}", e.KeyCode);
    }
}

which display the key combination in a comboText control. (This code is taken directly from the demo attached to the package.

Now the recording work well if for instance I press L Control + Win, then I release the keys and press the third one (i.e. Right Arrow), this will not trigger Windows shortcuts but it is quite annoying to have it work like that.

Appreciate any help. Thanks

1

There are 1 best solutions below

2
On

Try to use e.Handled property of the event. If you set it to true it will terminate key procesing chain. As a rule oher applications in the processing chain will not get it. I am not sure it is going to work for such a low level windows staff as virtual desktop switch.

    private void OnKeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
    {
        bool isThirdKey = //Some state evaluation to detect the third key was pressed
        if (isThirdKey) e.Handled = true;
    }