我正在尝试将字符串值插入第三方应用程序,例如记事本。以下是我正在使用的代码
[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
public void sim_type(string txt)
{
const int KEYEVENTF_EXTENDEDKEY = 0x1;
const int KEYEVENTF_KEYUP = 0x2;
byte[] ASCIIValues = Encoding.ASCII.GetBytes(txt);
foreach (byte keyCode in ASCIIValues)
{
Console.WriteLine("Ascii Values = " + keyCode);
keybd_event(keyCode, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
keybd_event(keyCode, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0);
}
}
我正在给出示例文本消息例如“这是测试消息”。 我得到了正确的ascii值。 但是在相应示例消息的目标文本框中,我得到了这个输出。
t89 9 1 13:38 02/12/2010513:38 02/12/2010 -5175
有人可以帮助解决这个问题。我也把ascii值打印在控制台
中消息:这是一条测试消息
{
Ascii值= 84Ascii值= 104
Ascii值= 105
Ascii值= 115
Ascii值= 32
Ascii值= 105
Ascii值= 115
Ascii值= 32
Ascii值= 97
Ascii值= 32
Ascii值= 116
Ascii值= 101
Ascii值= 115
Ascii值= 116
Ascii值= 32
Ascii值= 109
Ascii值= 101
Ascii值= 115
Ascii值= 115
Ascii值= 97
Ascii值= 103
Ascii值= 101
}
请有人帮忙 谢谢, Nikil
答案 0 :(得分:1)
keybd_event已被SendInput取代。我建议看一下Windows Input Simulator,它在Send Input API周围提供了一个很好的C#Wrapper。您还可以使用SendInput API模拟鼠标移动(我相信他们正在为下一版本的输入模拟器工作)。
我已经将这个库用于自动化项目,它似乎工作得很好,但是有一些怪癖(IE键盘主页+ SHIFT + END没有按预期选择所有文本)。
答案 1 :(得分:0)
keybd_event的第一个参数是虚拟键码,而不是ASCII码。一些VK与ASCII相同(这就是为什么你得到第一个!),但这不是这样做的。
实现目标的一种方法是使用SendInput方法。对于此方法,您可以传递KEYBDINPUT,该字段具有用于传递Unicode字符的字段(如果指定KEYEVENTF_UNICODE标志)。