SendInput 无法将回车键发送到特定程序
SendInput fails to send enterkey to specific program
我创建了一个程序,可以将文本发送到游戏中的聊天室。
游戏有更新,在我使用之前 Sendkeys.SendWait("My text");
遗憾的是,这不再有效...
过了一会儿,我发现了thisWhosebug的问题。使用 SendInput,除了激活聊天框的回车键之外,这个问题的答案使其有效。
我的代码通过按下按钮激活,然后它将 select 正确的过程。
public void BringMainWindowToFront(string processName)
{
Process bProcess = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(processName)).FirstOrDefault();
if (bProcess != null)
{
if (bProcess.MainWindowHandle == IntPtr.Zero)
{
ShowWindow(bProcess.Handle, ShowWindowEnum.Restore);
}
SetForegroundWindow(bProcess.MainWindowHandle);
}
}
之后我调用 TypeAll,这将输入聊天中的所有字符。
private void TypeAll(string text)
{
IDictionary<string, string> lettersToScanCode = new Dictionary<string, string>();
lettersToScanCode.Add("a", "KEY_A"); //This Dictionary translates the inputkeys to
the exact enum.
lettersToScanCode.Add("b", "KEY_B");
lettersToScanCode.Add("c", "KEY_C");
lettersToScanCode.Add("d", "KEY_D");
lettersToScanCode.Add("e", "KEY_E");
lettersToScanCode.Add("f", "KEY_F");
lettersToScanCode.Add("g", "KEY_G");
lettersToScanCode.Add("h", "KEY_H");
lettersToScanCode.Add("i", "KEY_I");
lettersToScanCode.Add("j", "KEY_J");
lettersToScanCode.Add("k", "KEY_K");
lettersToScanCode.Add("l", "KEY_L");
lettersToScanCode.Add("m", "KEY_M");
lettersToScanCode.Add("n", "KEY_N");
lettersToScanCode.Add("o", "KEY_O");
lettersToScanCode.Add("p", "KEY_P");
lettersToScanCode.Add("q", "KEY_Q");
lettersToScanCode.Add("r", "KEY_R");
lettersToScanCode.Add("s", "KEY_S");
lettersToScanCode.Add("t", "KEY_T");
lettersToScanCode.Add("u", "KEY_U");
lettersToScanCode.Add("v", "KEY_V");
lettersToScanCode.Add("w", "KEY_W");
lettersToScanCode.Add("x", "KEY_X");
lettersToScanCode.Add("y", "KEY_y");
lettersToScanCode.Add("z", "KEY_Z");
lettersToScanCode.Add(":", "SEPARATOR");
lettersToScanCode.Add(" ", "SPACE");
lettersToScanCode.Add("0", "KEY_0");
lettersToScanCode.Add("1", "KEY_1");
lettersToScanCode.Add("2", "KEY_2");
lettersToScanCode.Add("3", "KEY_3");
lettersToScanCode.Add("4", "KEY_4");
lettersToScanCode.Add("5", "KEY_5");
lettersToScanCode.Add("6", "KEY_6");
lettersToScanCode.Add("7", "KEY_7");
lettersToScanCode.Add("8", "KEY_8");
lettersToScanCode.Add("9", "KEY_9");
Send(ScanCodeShort.RETURN); //Here I send the enter key so I open the chatbox
char[] characters = text.ToCharArray(); //This foreach will send all the text.
foreach (char i in characters)
{
string newI = i.ToString().ToLower();
string str = lettersToScanCode[newI];
Enum.TryParse(str, out ScanCodeShort test);
Send(test);
}
}
是否有其他调用回车键的方法?
或者让 enter 键按下的时间长一点,这样游戏就会实际看到它被按下了。
This questions says you have to add a delay
在这里使用两个(丑陋的)Thread.sleep游戏可以看到输入并且工作正常。
Thread.Sleep(100);
Send(ScanCodeShort.RETURN);
Thread.Sleep(100);
要测试,有延迟。我希望我能把它降得更低。因为我的winForm在窗体上使用了定时器....
编辑:
为了使操作更简洁,我像这样遍历字母表:
for (char c = 'A'; c <= 'Z'; c++) {
我创建了一个程序,可以将文本发送到游戏中的聊天室。
游戏有更新,在我使用之前 Sendkeys.SendWait("My text");
遗憾的是,这不再有效...
过了一会儿,我发现了thisWhosebug的问题。使用 SendInput,除了激活聊天框的回车键之外,这个问题的答案使其有效。
我的代码通过按下按钮激活,然后它将 select 正确的过程。
public void BringMainWindowToFront(string processName)
{
Process bProcess = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(processName)).FirstOrDefault();
if (bProcess != null)
{
if (bProcess.MainWindowHandle == IntPtr.Zero)
{
ShowWindow(bProcess.Handle, ShowWindowEnum.Restore);
}
SetForegroundWindow(bProcess.MainWindowHandle);
}
}
之后我调用 TypeAll,这将输入聊天中的所有字符。
private void TypeAll(string text)
{
IDictionary<string, string> lettersToScanCode = new Dictionary<string, string>();
lettersToScanCode.Add("a", "KEY_A"); //This Dictionary translates the inputkeys to
the exact enum.
lettersToScanCode.Add("b", "KEY_B");
lettersToScanCode.Add("c", "KEY_C");
lettersToScanCode.Add("d", "KEY_D");
lettersToScanCode.Add("e", "KEY_E");
lettersToScanCode.Add("f", "KEY_F");
lettersToScanCode.Add("g", "KEY_G");
lettersToScanCode.Add("h", "KEY_H");
lettersToScanCode.Add("i", "KEY_I");
lettersToScanCode.Add("j", "KEY_J");
lettersToScanCode.Add("k", "KEY_K");
lettersToScanCode.Add("l", "KEY_L");
lettersToScanCode.Add("m", "KEY_M");
lettersToScanCode.Add("n", "KEY_N");
lettersToScanCode.Add("o", "KEY_O");
lettersToScanCode.Add("p", "KEY_P");
lettersToScanCode.Add("q", "KEY_Q");
lettersToScanCode.Add("r", "KEY_R");
lettersToScanCode.Add("s", "KEY_S");
lettersToScanCode.Add("t", "KEY_T");
lettersToScanCode.Add("u", "KEY_U");
lettersToScanCode.Add("v", "KEY_V");
lettersToScanCode.Add("w", "KEY_W");
lettersToScanCode.Add("x", "KEY_X");
lettersToScanCode.Add("y", "KEY_y");
lettersToScanCode.Add("z", "KEY_Z");
lettersToScanCode.Add(":", "SEPARATOR");
lettersToScanCode.Add(" ", "SPACE");
lettersToScanCode.Add("0", "KEY_0");
lettersToScanCode.Add("1", "KEY_1");
lettersToScanCode.Add("2", "KEY_2");
lettersToScanCode.Add("3", "KEY_3");
lettersToScanCode.Add("4", "KEY_4");
lettersToScanCode.Add("5", "KEY_5");
lettersToScanCode.Add("6", "KEY_6");
lettersToScanCode.Add("7", "KEY_7");
lettersToScanCode.Add("8", "KEY_8");
lettersToScanCode.Add("9", "KEY_9");
Send(ScanCodeShort.RETURN); //Here I send the enter key so I open the chatbox
char[] characters = text.ToCharArray(); //This foreach will send all the text.
foreach (char i in characters)
{
string newI = i.ToString().ToLower();
string str = lettersToScanCode[newI];
Enum.TryParse(str, out ScanCodeShort test);
Send(test);
}
}
是否有其他调用回车键的方法? 或者让 enter 键按下的时间长一点,这样游戏就会实际看到它被按下了。
This questions says you have to add a delay
在这里使用两个(丑陋的)Thread.sleep游戏可以看到输入并且工作正常。
Thread.Sleep(100);
Send(ScanCodeShort.RETURN);
Thread.Sleep(100);
要测试,有延迟。我希望我能把它降得更低。因为我的winForm在窗体上使用了定时器....
编辑:
为了使操作更简洁,我像这样遍历字母表:
for (char c = 'A'; c <= 'Z'; c++) {