Я пишу приложение, которое реагирует на действия клавиатуры.Чтобы автоматизировать тестирование, я написал симулятор клавиатуры, который использует User32.dll / SendInput для автоматизации нажатий и отпусканий клавиш.Этот подход прекрасно работает на локальном компьютере разработчика, но завершается неудачно при регистрации и запуске на агенте сборки TFS.Я предполагаю, что действия в пользовательском режиме обрабатываются не так, как ожидалось, поскольку они выполняются как служба.Есть ли способ автоматизации нажатий и выпусков клавиатуры, который совместим с автоматическим тестированием в качестве службы?
Настройка: размещенный TFS (tfspreview.com) Visual Studio 2010 Ultimate MSTest, xUnit.NET Windows 7 Pro (dev)Windows 2008 R2 (контроллер сборки / агент сборки)
Код обидования:
Контрольный пример:
KeyboardSimulator.PressKey(Keys.A);
Симулятор клавиатуры:
public static void PushKeyDown(Keys key)
{
SendKeyboardInput(key, (uint)FLAGS.NONE);
}
public static void ReleaseKey(Keys key)
{
SendKeyboardInput(key, (uint)FLAGS.KEYUP);
}
public static void PressKey(Keys key)
{
PushKeyDown(key);
ReleaseKey(key);
}
#region Internals
private static KEYBDINPUT createKeybdInput(Keys key, uint flag)
{
KEYBDINPUT i = new KEYBDINPUT();
i.wVk = (ushort)key;
i.wScan = 0;
i.time = 0;
i.dwExtraInfo = IntPtr.Zero;
i.dwFlags = flag;
return i;
}
private static void SendKeyboardInput(Keys key, uint flag)
{
INPUT[] inputs = new INPUT[1];
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki = createKeybdInput(key, flag);
uint intReturn = SendInput(1, inputs, System.Runtime.InteropServices.Marshal.SizeOf(inputs[0]));
if (intReturn != 1) throw new ApplicationException("Could not send key");
}
[DllImport("User32.dll")]
private static extern uint SendInput(uint numberOfInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] input, int structSize);