SendInput 无法将回车键发送到特定程序

Posted

技术标签:

【中文标题】SendInput 无法将回车键发送到特定程序【英文标题】:SendInput fails to send enterkey to specific program 【发布时间】:2021-04-28 19:50:49 【问题描述】:

我创建了一个能够在游戏中向聊天发送文本的程序。 在我使用 Sendkeys.SendWait("My text"); 之前,游戏有一个更新,可悲的是,这不再有效...

过了一会儿,我找到了this*** 的问题。使用 SendInput,这个问题的答案使它工作,除了激活聊天框的输入键。

我的代码通过按下按钮激活,然后它将选择正确的进程。

   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 键按下的时间长一点,这样游戏才会真正看到它被按下了。

【问题讨论】:

让 Enter 键按下的时间长一点 如果`*SendKeys.SendWait* 不再起作用,请自行实现。查看该方法的参考源代码,看看您是否可以对其进行调整以克服游戏变化。 首先,我是c#的初学者,我不认为我可以调整方法,所以它会起作用...... 如果您下载 ILSpy,然后打开 System.Winfows.Form.DLL,然后查看 Microsoft SendKEys.SendWait 方法的底层实现。我的意思是根据他们的实现自己的实现,可以在游戏中防止 Enter 键和/或等待一秒钟。 你回复得很快!哈哈,我google了一下,我找到了,我不认为它可以。 Sendkeys 不再起作用了,我觉得不得不改变整个方法似乎很困难。 专业提示:作为开发人员,我的座右铭是“追随它;像狗追骨头一样”。通常,一个可行的解决方案只需再过 5 分钟。试试看:***.com/a/20493025/495455 或 ***.com/a/20484836/495455 【参考方案1】:

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++) 

【讨论】:

感谢 Jeremy 的编辑。我做了一些研究,但似乎不明白代码的用途。我想我必须用 for each 来改变它。但我看不出这会有什么好处……

以上是关于SendInput 无法将回车键发送到特定程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AutoHotkey 中的 SendInput 命令之间添加延迟?

为啥 SendInput Ctrl+V 在 Outlook 中不起作用?

Python SendInput() 按键无法识别

将线程输入附加到目标进程后,SendInput 不起作用

如何使用 C#/pinvoke 将输入发送到 WinSta0\Winlogon 桌面

通过 JNA 向隐藏窗口发送击键