mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-04 02:06:36 +02:00
1109 lines
50 KiB
C++
1109 lines
50 KiB
C++
#include "pch.h"
|
|
#include "CppUnitTest.h"
|
|
#include "MockedInput.h"
|
|
#include <keyboardmanager/common/KeyboardManagerState.h>
|
|
#include <keyboardmanager/dll/KeyboardEventHandlers.h>
|
|
#include "TestHelpers.h"
|
|
|
|
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
|
|
namespace RemappingLogicTests
|
|
{
|
|
// Tests for shortcut remapping logic
|
|
TEST_CLASS (OSLevelShortcutRemappingTests)
|
|
{
|
|
private:
|
|
MockedInput mockedInputHandler;
|
|
KeyboardManagerState testState;
|
|
|
|
public:
|
|
TEST_METHOD_INITIALIZE(InitializeTestEnv)
|
|
{
|
|
// Reset test environment
|
|
TestHelpers::ResetTestEnv(mockedInputHandler, testState);
|
|
|
|
// Set HandleOSLevelShortcutRemapEvent as the hook procedure
|
|
std::function<intptr_t(LowlevelKeyboardEvent*)> currentHookProc = std::bind(&KeyboardEventHandlers::HandleOSLevelShortcutRemapEvent, std::ref(mockedInputHandler), std::placeholders::_1, std::ref(testState));
|
|
mockedInputHandler.SetHookProc(currentHookProc);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 2 key shortcut remap wih different modifiers key down
|
|
TEST_METHOD (RemappedTwoKeyShortcutWithDiffModifiers_ShouldSetTargetShortcutDown_OnKeyDown)
|
|
{
|
|
// Remap Ctrl+A to Alt+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 2;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
|
|
// Send Ctrl+A keydown
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Ctrl and A key states should be unchanged, Alt and V key states should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), true);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 2 key shortcut remap with same modifiers key down
|
|
TEST_METHOD (RemappedTwoKeyShortcutWithSameModifiers_ShouldSetTargetShortcutDown_OnKeyDown)
|
|
{
|
|
// Remap Ctrl+A to Ctrl+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_CONTROL);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 2;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
|
|
// Send Ctrl+A keydown
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// A key state should be unchanged, Ctrl and V key states should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), true);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 2 key shortcut remap with different modifiers key down followed by key up
|
|
TEST_METHOD (RemappedTwoKeyShortcutWithDiffModifiers_ShouldClearKeyboard_OnKeyUp)
|
|
{
|
|
// Remap Ctrl+A to Alt+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 4;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
input[2].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[3].type = INPUT_KEYBOARD;
|
|
input[3].ki.wVk = VK_CONTROL;
|
|
input[3].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
|
|
// Send Ctrl+A keydown, followed by A and Ctrl released
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Ctrl, A, Alt, V key states should be false
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 2 key shortcut remap with same modifiers key down followed by key up
|
|
TEST_METHOD (RemappedTwoKeyShortcutWithSameModifiers_ShouldClearKeyboard_OnKeyUp)
|
|
{
|
|
// Remap Ctrl+A to Ctrl+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_CONTROL);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 4;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
input[2].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[3].type = INPUT_KEYBOARD;
|
|
input[3].ki.wVk = VK_CONTROL;
|
|
input[3].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
|
|
// Send Ctrl+A keydown, followed by A and Ctrl released
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Ctrl, A, V key states should be false
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
}
|
|
|
|
// Test if correct keyboard states are set when a 2 key shortcut is remapped, and a 3 key shortcut containing those keys is invoked - Ex: Ctrl+A remapped, but user presses Ctrl+Shift+A
|
|
TEST_METHOD (RemappedTwoKeyShortcutInvokingAShortcutContainingThoseKeys_ShouldNotBeRemapped_OnKeyDown)
|
|
{
|
|
// Remap Ctrl+A to Alt+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 3;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = VK_SHIFT;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
|
|
// Send Ctrl+Shift+A keydown
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Since Ctrl+Shift+A is not remapped, no remapping should be invoked
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 3 key shortcut remap wih different modifiers key down
|
|
TEST_METHOD (RemappedThreeKeyShortcutWithDiffModifiers_ShouldSetTargetShortcutDown_OnKeyDown)
|
|
{
|
|
// Remap Ctrl+Shift+A to Alt+LWin+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(VK_SHIFT);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(VK_LWIN);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 3;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = VK_SHIFT;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
|
|
// Send Ctrl+Shift+A keydown
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Ctrl, Shift, A key states should be unchanged, Alt, LWin, V key states should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_LWIN), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), true);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 3 key shortcut remap wih partially different modifiers key down
|
|
TEST_METHOD (RemappedThreeKeyShortcutWithPartiallyDiffModifiers_ShouldSetTargetShortcutDown_OnKeyDown)
|
|
{
|
|
// Remap Ctrl+Shift+A to Alt+Ctrl+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(VK_SHIFT);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(VK_CONTROL);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 3;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = VK_SHIFT;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
|
|
// Send Ctrl+Shift+A keydown
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Shift, A key states should be unchanged, Alt, Ctrl, V key states should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), true);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 3 key shortcut remap with same modifiers key down
|
|
TEST_METHOD (RemappedThreeKeyShortcutWithSameModifiers_ShouldSetTargetShortcutDown_OnKeyDown)
|
|
{
|
|
// Remap Ctrl+Shift+A to Ctrl+Shift+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(VK_SHIFT);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_CONTROL);
|
|
dest.SetKey(VK_SHIFT);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 3;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = VK_SHIFT;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
|
|
// Send Ctrl+Shift+A keydown
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// A key state should be unchanged, Ctrl, Shift, V key states should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), true);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 3 key shortcut remap with different modifiers key down followed by key up
|
|
TEST_METHOD (RemappedThreeKeyShortcutWithDiffModifiers_ShouldClearKeyboard_OnKeyUp)
|
|
{
|
|
// Remap Ctrl+Shift+A to Alt+LWin+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(VK_SHIFT);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(VK_LWIN);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 6;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = VK_SHIFT;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
input[3].type = INPUT_KEYBOARD;
|
|
input[3].ki.wVk = 0x41;
|
|
input[3].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[4].type = INPUT_KEYBOARD;
|
|
input[4].ki.wVk = VK_SHIFT;
|
|
input[4].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[5].type = INPUT_KEYBOARD;
|
|
input[5].ki.wVk = VK_CONTROL;
|
|
input[5].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
|
|
// Send Ctrl+Shift+A keydown, followed by A, Shift and Ctrl released
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Ctrl, Shift, A, Alt, LWin, V key states should be false
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_LWIN), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 3 key shortcut remap with partially different modifiers key down followed by key up
|
|
TEST_METHOD (RemappedThreeKeyShortcutWithPartiallyDiffModifiers_ShouldClearKeyboard_OnKeyUp)
|
|
{
|
|
// Remap Ctrl+Shift+A to Alt+Ctrl+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(VK_SHIFT);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(VK_CONTROL);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 6;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = VK_SHIFT;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
input[3].type = INPUT_KEYBOARD;
|
|
input[3].ki.wVk = 0x41;
|
|
input[3].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[4].type = INPUT_KEYBOARD;
|
|
input[4].ki.wVk = VK_SHIFT;
|
|
input[4].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[5].type = INPUT_KEYBOARD;
|
|
input[5].ki.wVk = VK_CONTROL;
|
|
input[5].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
|
|
// Send Ctrl+Shift+A keydown, followed by A, Shift and Ctrl released
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Ctrl, Shift, A, Alt, V key states should be false
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 3 key shortcut remap with same modifiers key down followed by key up
|
|
TEST_METHOD (RemappedThreeKeyShortcutWithSameModifiers_ShouldClearKeyboard_OnKeyUp)
|
|
{
|
|
// Remap Ctrl+Shift+A to Ctrl+Shift+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(VK_SHIFT);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_CONTROL);
|
|
dest.SetKey(VK_SHIFT);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 6;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = VK_SHIFT;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
input[3].type = INPUT_KEYBOARD;
|
|
input[3].ki.wVk = 0x41;
|
|
input[3].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[4].type = INPUT_KEYBOARD;
|
|
input[4].ki.wVk = VK_SHIFT;
|
|
input[4].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[5].type = INPUT_KEYBOARD;
|
|
input[5].ki.wVk = VK_CONTROL;
|
|
input[5].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
|
|
// Send Ctrl+Shift+A keydown, followed by A, Shift and Ctrl released
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Ctrl, Shift, A, V key states should be false
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
}
|
|
|
|
// Test if correct keyboard states are set when a 3 key shortcut is remapped, and a 2 key shortcut which is a subset of those keys is invoked - Ex: Ctrl+Shift+A remapped, but user presses Ctrl+A
|
|
TEST_METHOD (RemappedThreeKeyShortcutInvokingAShortcutSubsetOfThoseKeys_ShouldNotBeRemapped_OnKeyDown)
|
|
{
|
|
// Remap Ctrl+Shift+A to Alt+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(VK_SHIFT);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
const int nInputs = 2;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
|
|
// Send Ctrl+A keydown
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Since Ctrl+A is not remapped, no remapping should be invoked
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 3 key to 2 key shortcut remap with different modifiers key down
|
|
TEST_METHOD (RemappedThreeKeyToTwoKeyShortcutWithDiffModifiers_ShouldSetTargetShortcutDown_OnKeyDown)
|
|
{
|
|
// Remap Ctrl+Shift+A to Alt+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(VK_SHIFT);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 3;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = VK_SHIFT;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
|
|
// Send Ctrl+Shift+A keydown
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Ctrl, Shift, A key states should be unchanged, Alt, V key states should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), true);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 3 key to 2 key shortcut remap with partially different modifiers key down
|
|
TEST_METHOD (RemappedThreeKeyToTwoKeyShortcutWithPartiallyDiffModifiers_ShouldSetTargetShortcutDown_OnKeyDown)
|
|
{
|
|
// Remap Ctrl+Shift+A to Ctrl+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(VK_SHIFT);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_CONTROL);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 3;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = VK_SHIFT;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
|
|
// Send Ctrl+Shift+A keydown
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Shift, A key states should be unchanged, Ctrl, V key states should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), true);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 3 key to 2 key shortcut remap with different modifiers key down followed by key up
|
|
TEST_METHOD (RemappedThreeKeyToTwoKeyShortcutWithDiffModifiers_ShouldClearKeyboard_OnKeyUp)
|
|
{
|
|
// Remap Ctrl+Shift+A to Alt+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(VK_SHIFT);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 6;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = VK_SHIFT;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
input[3].type = INPUT_KEYBOARD;
|
|
input[3].ki.wVk = 0x41;
|
|
input[3].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[4].type = INPUT_KEYBOARD;
|
|
input[4].ki.wVk = VK_SHIFT;
|
|
input[4].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[5].type = INPUT_KEYBOARD;
|
|
input[5].ki.wVk = VK_CONTROL;
|
|
input[5].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
|
|
// Send Ctrl+Shift+A keydown, followed by A, Shift and Ctrl released
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Ctrl, Shift, A, Alt, V key states should be false
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 3 key to 2 key shortcut remap with partially different modifiers key down followed by key up
|
|
TEST_METHOD (RemappedThreeKeyToTwoKeyShortcutWithPartiallyDiffModifiers_ShouldClearKeyboard_OnKeyUp)
|
|
{
|
|
// Remap Ctrl+Shift+A to Ctrl+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(VK_SHIFT);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_CONTROL);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 6;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = VK_SHIFT;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
input[3].type = INPUT_KEYBOARD;
|
|
input[3].ki.wVk = 0x41;
|
|
input[3].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[4].type = INPUT_KEYBOARD;
|
|
input[4].ki.wVk = VK_SHIFT;
|
|
input[4].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[5].type = INPUT_KEYBOARD;
|
|
input[5].ki.wVk = VK_CONTROL;
|
|
input[5].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
|
|
// Send Ctrl+Shift+A keydown, followed by A, Shift and Ctrl released
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Ctrl, Shift, A, V key states should be false
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 2 key to 3 key shortcut remap with different modifiers key down
|
|
TEST_METHOD (RemappedTwoKeyToThreeKeyShortcutWithDiffModifiers_ShouldSetTargetShortcutDown_OnKeyDown)
|
|
{
|
|
// Remap Ctrl+A to Alt+Shift+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(VK_SHIFT);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 2;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
|
|
// Send Ctrl+A keydown
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Ctrl, A key states should be unchanged, Alt, Shift, V key states should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), true);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 2 key to 3 key shortcut remap with partially different modifiers key down
|
|
TEST_METHOD (RemappedTwoKeyToThreeKeyShortcutWithPartiallyDiffModifiers_ShouldSetTargetShortcutDown_OnKeyDown)
|
|
{
|
|
// Remap Ctrl+A to Ctrl+Shift+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_CONTROL);
|
|
dest.SetKey(VK_SHIFT);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 2;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
|
|
// Send Ctrl+A keydown
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// A key state should be unchanged, Ctrl, Shift, V key states should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), true);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 2 key to 3 key shortcut remap with different modifiers key down followed by key up
|
|
TEST_METHOD (RemappedTwoKeyToThreeKeyShortcutWithDiffModifiers_ShouldClearKeyboard_OnKeyUp)
|
|
{
|
|
// Remap Ctrl+A to Alt+Shift+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(VK_SHIFT);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 4;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
input[2].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[3].type = INPUT_KEYBOARD;
|
|
input[3].ki.wVk = VK_CONTROL;
|
|
input[3].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
|
|
// Send Ctrl+A keydown and A, Ctrl are then released
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Ctrl, A, Alt, Shift, V key states should be unchanged
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a 2 key to 3 key shortcut remap with partially different modifiers key down followed by key up
|
|
TEST_METHOD (RemappedTwoKeyToThreeKeyShortcutWithPartiallyDiffModifiers_ShouldClearKeyboard_OnKeyUp)
|
|
{
|
|
// Remap Ctrl+A to Ctrl+Shift+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_CONTROL);
|
|
dest.SetKey(VK_SHIFT);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 4;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
input[2].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[3].type = INPUT_KEYBOARD;
|
|
input[3].ki.wVk = VK_CONTROL;
|
|
input[3].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
|
|
// Send Ctrl+A keydown and A, Ctrl are then released
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Ctrl, A, Shift, V key states should be unchanged
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
}
|
|
|
|
// Test if correct keyboard states are set if a shortcut remap is pressed and then an unremapped shortcut with the same modifier is pressed - Ex: Ctrl+A is remapped. User invokes Ctrl+A then releases A and presses C (while Ctrl is held), should invoke Ctrl+C
|
|
TEST_METHOD (InvokingUnremappedShortcutAfterRemappedShortcutWithSameModifier_ShouldSetUnremappedShortcut_OnKeyDown)
|
|
{
|
|
// Remap Ctrl+A to Alt+Shift+V
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(VK_SHIFT);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 4;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
input[2].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[3].type = INPUT_KEYBOARD;
|
|
input[3].ki.wVk = 0x43;
|
|
|
|
// Send Ctrl+A keydown, A key up, then C key down
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// A, Alt, Shift, V key states should be unchanged, Ctrl, C should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_SHIFT), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x43), true);
|
|
}
|
|
|
|
// Test if correct keyboard states are set for a shortcut remap with win both modifier
|
|
TEST_METHOD (RemappedShortcutWithWinBothModifier_ShouldSetRemappedShortcut_OnKeyEvent)
|
|
{
|
|
// Remap Win+A to Alt+V
|
|
Shortcut src;
|
|
src.SetKey(CommonSharedConstants::VK_WIN_BOTH);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
// Remap Alt+D to Win+B
|
|
Shortcut dest1;
|
|
dest1.SetKey(CommonSharedConstants::VK_WIN_BOTH);
|
|
dest1.SetKey(0x42);
|
|
Shortcut src1;
|
|
src1.SetKey(VK_MENU);
|
|
src1.SetKey(0x44);
|
|
testState.AddOSLevelShortcut(src1, dest1);
|
|
|
|
// Test 2 cases for first remap - LWin, A, A(Up), LWin(Up). RWin, A, A(Up), RWin(Up)
|
|
const int nInputs = 2;
|
|
INPUT input[nInputs] = {};
|
|
|
|
// Case 1.1
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_LWIN;
|
|
input[0].ki.dwFlags = 0;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
input[1].ki.dwFlags = 0;
|
|
|
|
// Send LWin+A keydown
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// LWin, RWin, A key states should be unchanged, Alt, V should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_LWIN), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_RWIN), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), true);
|
|
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = 0x41;
|
|
input[0].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = VK_LWIN;
|
|
input[1].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
|
|
// Release LWin+A
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// LWin, RWin, A, Alt, V key states should be unchanged
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_LWIN), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_RWIN), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
|
|
// Case 1.2
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_RWIN;
|
|
input[0].ki.dwFlags = 0;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
input[1].ki.dwFlags = 0;
|
|
|
|
// Send RWin+A keydown
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// LWin, RWin, A key states should be unchanged, Alt, V should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_LWIN), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_RWIN), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), true);
|
|
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = 0x41;
|
|
input[0].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = VK_RWIN;
|
|
input[1].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
|
|
// Release RWin+A
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// LWin, RWin, A, Alt, V key states should be unchanged
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_LWIN), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_RWIN), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
|
|
// Case 2
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_MENU;
|
|
input[0].ki.dwFlags = 0;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x44;
|
|
input[1].ki.dwFlags = 0;
|
|
|
|
// Send Alt+D keydown
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Alt, D, RWin key states should be unchanged, LWin, B should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_LWIN), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_RWIN), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x42), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x44), false);
|
|
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = 0x44;
|
|
input[0].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = VK_MENU;
|
|
input[1].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
|
|
// Release Alt+D
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// LWin, RWin, B, Alt, D key states should be unchanged
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_LWIN), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_RWIN), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x42), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x44), false);
|
|
}
|
|
|
|
// Test if correct keyboard states are set if a win both shortcut remap is pressed and then an unremapped shortcut with the LWin modifier is pressed
|
|
TEST_METHOD (InvokingUnremappedShortcutWithLWinAfterRemappedShortcutWithWinBothModifier_ShouldSetUnremappedShortcutWithLWinKey_OnKeyDown)
|
|
{
|
|
// Remap Win+A to Alt+V
|
|
Shortcut src;
|
|
src.SetKey(CommonSharedConstants::VK_WIN_BOTH);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
// LWin, A, A(Up), C(Down)
|
|
const int nInputs = 4;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_LWIN;
|
|
input[0].ki.dwFlags = 0;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
input[1].ki.dwFlags = 0;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
input[2].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[3].type = INPUT_KEYBOARD;
|
|
input[3].ki.wVk = 0x43;
|
|
input[3].ki.dwFlags = 0;
|
|
|
|
// Send LWin+A, release A and press C
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// RWin, A, Alt, V key states should be unchanged, LWin, C should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_LWIN), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x43), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_RWIN), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
}
|
|
|
|
// Test if correct keyboard states are set if a win both shortcut remap is pressed and then an unremapped shortcut with the RWin modifier is pressed
|
|
TEST_METHOD (InvokingUnremappedShortcutWithRWinAfterRemappedShortcutWithWinBothModifier_ShouldSetUnremappedShortcutWithRWinKey_OnKeyDown)
|
|
{
|
|
// Remap Win+A to Alt+V
|
|
Shortcut src;
|
|
src.SetKey(CommonSharedConstants::VK_WIN_BOTH);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(0x56);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
// RWin, A, A(Up), C(Down)
|
|
const int nInputs = 4;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_RWIN;
|
|
input[0].ki.dwFlags = 0;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
input[1].ki.dwFlags = 0;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
input[2].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[3].type = INPUT_KEYBOARD;
|
|
input[3].ki.wVk = 0x43;
|
|
input[3].ki.dwFlags = 0;
|
|
|
|
// Send RWin+A, release A and press C
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// LWin, A, Alt, V key states should be unchanged, RWin, C should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_LWIN), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_RWIN), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x43), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
}
|
|
|
|
// Test if target modifier is still held down even if the action key of the original shortcut is released - required for Alt+Tab/Win+Space cases
|
|
TEST_METHOD (RemappedShortcutModifiers_ShouldBeDetectedAsPressed_OnReleasingActionKeyButHoldingModifiers)
|
|
{
|
|
// Remap Ctrl+A to Alt+Tab
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_MENU);
|
|
dest.SetKey(VK_TAB);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
const int nInputs = 3;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[0].ki.dwFlags = 0;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
input[1].ki.dwFlags = 0;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
input[2].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
|
|
// Send Ctrl+A, release A
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Ctrl, A, Tab key states should be unchanged, Alt should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_TAB), false);
|
|
}
|
|
|
|
// Test if invoking two remapped shortcuts (with different modifiers between original and new shortcut) that share modifiers in succession sets the correct keyboard states
|
|
TEST_METHOD (TwoRemappedShortcutsWithDifferentModifiersThatShareModifiers_ShouldSetRemappedKeyStates_OnPressingSecondShortcutActionKeyAfterInvokingFirstShortcutRemap)
|
|
{
|
|
// Remap Alt+A to Ctrl+C
|
|
Shortcut src;
|
|
src.SetKey(VK_MENU);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_CONTROL);
|
|
dest.SetKey(0x43);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
// Remap Alt+V to Ctrl+X
|
|
Shortcut src1;
|
|
src1.SetKey(VK_MENU);
|
|
src1.SetKey(0x56);
|
|
Shortcut dest1;
|
|
dest1.SetKey(VK_CONTROL);
|
|
dest1.SetKey(0x58);
|
|
testState.AddOSLevelShortcut(src1, dest1);
|
|
|
|
const int nInputs = 4;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_MENU;
|
|
input[0].ki.dwFlags = 0;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
input[1].ki.dwFlags = 0;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
input[2].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[3].type = INPUT_KEYBOARD;
|
|
input[3].ki.wVk = 0x56;
|
|
input[3].ki.dwFlags = 0;
|
|
|
|
// Send Alt+A, release A, press V
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// Alt, A, C, V key states should be unchanged, Ctrl, X should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_MENU), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x43), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x58), true);
|
|
}
|
|
|
|
// Test if invoking two remapped shortcuts (with same modifiers between original and new shortcut) that share modifiers in succession sets the correct keyboard states
|
|
TEST_METHOD (TwoRemappedShortcutsWithSameModifiersThatShareModifiers_ShouldSetRemappedKeyStates_OnPressingSecondShortcutActionKeyAfterInvokingFirstShortcutRemap)
|
|
{
|
|
// Remap Ctrl+A to Ctrl+C
|
|
Shortcut src;
|
|
src.SetKey(VK_CONTROL);
|
|
src.SetKey(0x41);
|
|
Shortcut dest;
|
|
dest.SetKey(VK_CONTROL);
|
|
dest.SetKey(0x43);
|
|
testState.AddOSLevelShortcut(src, dest);
|
|
|
|
// Remap Ctrl+V to Ctrl+X
|
|
Shortcut src1;
|
|
src1.SetKey(VK_CONTROL);
|
|
src1.SetKey(0x56);
|
|
Shortcut dest1;
|
|
dest1.SetKey(VK_CONTROL);
|
|
dest1.SetKey(0x58);
|
|
testState.AddOSLevelShortcut(src1, dest1);
|
|
|
|
const int nInputs = 4;
|
|
INPUT input[nInputs] = {};
|
|
input[0].type = INPUT_KEYBOARD;
|
|
input[0].ki.wVk = VK_CONTROL;
|
|
input[0].ki.dwFlags = 0;
|
|
input[1].type = INPUT_KEYBOARD;
|
|
input[1].ki.wVk = 0x41;
|
|
input[1].ki.dwFlags = 0;
|
|
input[2].type = INPUT_KEYBOARD;
|
|
input[2].ki.wVk = 0x41;
|
|
input[2].ki.dwFlags = KEYEVENTF_KEYUP;
|
|
input[3].type = INPUT_KEYBOARD;
|
|
input[3].ki.wVk = 0x56;
|
|
input[3].ki.dwFlags = 0;
|
|
|
|
// Send Ctrl+A, release A, press V
|
|
mockedInputHandler.SendVirtualInput(nInputs, input, sizeof(INPUT));
|
|
|
|
// A, C, V key states should be unchanged, Ctrl, X should be true
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x41), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x43), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x56), false);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(VK_CONTROL), true);
|
|
Assert::AreEqual(mockedInputHandler.GetVirtualKeyState(0x58), true);
|
|
}
|
|
};
|
|
}
|