我正在尝试使用WindowsInputSimulator library来帮助我模拟keyPresses。
该软件将由客户端和服务器组成。当在客户端输入密钥时,它的KeyEventArgs将被发送到服务器。然后,服务器对其执行以下操作:
public void SendKeyDown(Keys keyCode, Keys modifiers)
{
uint nonVK = MapVirtualKey((uint)keyCode, 2);
char mappedChar = Convert.ToChar(nonVK);
if (modifiers.Equals(Keys.None))
{
VirtualKeyCode vkc;
if (Enum.TryParse(VkKeyScan(mappedChar).ToString(), out vkc))
{
InputSimulator.SimulateKeyDown(vkc);
}
}
else
{
//Find out which modifier we're working with.
uint modVK = MapVirtualKey((uint)modifiers, 2);
char modifierChar = Convert.ToChar(modVK);
VirtualKeyCode vkc, modVkc;
if (Enum.TryParse(VkKeyScan(mappedChar).ToString(), out vkc)
&& Enum.TryParse(VkKeyScan(modifierChar).ToString(), out modVkc))
{
InputSimulator.SimulateModifiedKeyStroke(modVkc, vkc);
}
}
}它适用于单键。然而,我也在尝试使用修饰键,但我遇到了一些麻烦。例如,按SHIFT +K会产生"k2“,这会让我相信我到VirtualKeyCodes的转换是不可靠的,或者其他东西是不可靠的。
另外,在发送这些命令时,我应该只捕获KeyDown / KeyUp事件吗?或者我也应该关注KeyPress事件?我应该能够使用箭头键和非字符键,这使我认为我应该忽略KeyPress。
编辑:另外,当我使用多个修饰符时,我如何知道?我该如何把它们串在一起呢?
有什么想法?谢谢!
发布于 2012-07-27 03:22:21
我能够让它与以下内容一起工作。请记住,这适用于单个修饰符和单个字符。特殊字符还不适用于此代码,但我认为这是朝着正确方向迈出的一步,并回答了我直接提出的问题。
public void SendKey(int keyValue, Keys modifiers)
{
VirtualKeyCode key;
if (modifiers.Equals(Keys.None))
{
if (Enum.TryParse(VkKeyScan(((char)keyValue)).ToString(), out key))
{
InputSimulator.SimulateKeyDown(key);
InputSimulator.SimulateKeyUp(key);
}
}
else if (modifiers.Equals(Keys.Shift) && keyValue >= (int)Keys.A && keyValue <= (int)Keys.Z)
{
if (Enum.TryParse(VkKeyScan(((char) keyValue)).ToString(), out key))
{
InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.SHIFT, key);
}
}
else if (modifiers.Equals(Keys.Control) && keyValue >= (int)Keys.A && keyValue <= (int)Keys.Z)
{
if (Enum.TryParse(VkKeyScan(((char)keyValue)).ToString(), out key))
{
InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.CONTROL, key);
}
}
else if (modifiers.Equals(Keys.Alt) && keyValue >= (int)Keys.A && keyValue <= (int)Keys.Z)
{
if (Enum.TryParse(VkKeyScan(((char)keyValue)).ToString(), out key))
{
//Alt is named MENU for legacy purposes.
InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.MENU, key);
}
}
}https://stackoverflow.com/questions/11675446
复制相似问题