none
针对控制台的应用程序 sendkeys无效怎么办 RRS feed

  • 问题

  • 我需要在一个控制台应用中模拟键盘输入选择选项 

    本来是想用vbs实现的 但是sendkeys方法不好用,所以才用的c#,所以就用c#思路描述下:
    我先是用C#的System.Diagnostics.Process.Start调用cmd.exe 然后利用sendkey方法输入路径 并在控制台窗口中打开我需要的控制台应用(因为这个应用必须使用命令参数才能开启所以我只能用cmd来打开它),应用也成功打开,但是接下来的sendkeys完全无效, 手动按键倒是可以,后来用User32.dll 的keybd_event也不行我发现sendkeys方法也没法控制windows中的模拟键盘输入,还有我以为是窗口没有激活的缘故,但我即使将这个窗口特意置为最前仍就不行,我也把开启应用和开启后的输入分为2个线程来处理,但也不好使,有谁知道这是为什么吗,有什么解决方案没有,我没什么开发基础,平时也用不上,所以属于现用现学型的, 还请高人指点,谢谢

    2014年11月12日 15:30

全部回复

  • 你好:

    你可以尝试通过Process类来直接启动你的控制台应用,而不是先启动cmd.exe再启动你的应用。然后通过Process.Start来传递参数,再通过RedirectStandardInput,RedirectStandardOutput属性来控制输入输出,具体的例子可以参考MSDN文档:

    ProcessStartInfo.RedirectStandardInput 属性

    Console.WriteLine("Ready to sort one or more text lines...");
    
             // Start the Sort.exe process with redirected input.
             // Use the sort command to sort the input text.
             Process myProcess = new Process();
    
             myProcess.StartInfo.FileName = "Sort.exe";
             myProcess.StartInfo.UseShellExecute = false;
             myProcess.StartInfo.RedirectStandardInput = true;
    
             myProcess.Start();
    
             StreamWriter myStreamWriter = myProcess.StandardInput;
    
             // Prompt the user for input text lines to sort. 
             // Write each line to the StandardInput stream of
             // the sort command.
             String inputText;
             int numLines = 0;
             do 
             {
                Console.WriteLine("Enter a line of text (or press the Enter key to stop):");
    
                inputText = Console.ReadLine();
                if (inputText.Length > 0)
                {
                   numLines ++;
                   myStreamWriter.WriteLine(inputText);
                }
             } while (inputText.Length != 0);
    
    
             // Write a report header to the console.
             if (numLines > 0)
             {
                Console.WriteLine(" {0} sorted text line(s) ", numLines);
                Console.WriteLine("------------------------");
             }
             else 
             {
                Console.WriteLine(" No input was sorted");
             }
    
             // End the input stream to the sort command.
             // When the stream closes, the sort command
             // writes the sorted text lines to the 
             // console.
             myStreamWriter.Close();
    
    
             // Wait for the sort process to write the sorted text lines.
             myProcess.WaitForExit();
             myProcess.Close();


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年11月13日 2:47
    版主
  • 嗯 谢谢您的回复 我试一试, 另外请问 您知道我用sendkeys 或者键盘钩子模拟输入为什么无效吗这个功能在cmd命令串口中都管用,就是启动了这个应用后失效了?
    2014年11月13日 10:42
  • 原因是你通过Process.Start打开cmd的时候,可能cmd还没有完全开启Sendkeys就被调用。所以没有效果,可以在启动之后暂停一下:

    Dim cd As String = "CD C:\"
    
    
        Process.Start("cmd.exe")
    
    
        Threading.Thread.Sleep(2000)
        SendKeys.SendWait(cd)
        Threading.Thread.Sleep(2000)
        SendKeys.SendWait("{ENTER}")
        Threading.Thread.Sleep(2000)
        SendKeys.SendWait("START KES1.bat")
        Threading.Thread.Sleep(2000)
        SendKeys.SendWait("{ENTER}")

    同时

    你也可以参考这篇帖子里面的方法:

    SendKeys() not working


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年11月14日 6:45
    版主
  • 非常感谢 我会根据你的建议进行下修改
    2014年11月15日 7:26
  • 我试了下 Threading.Thread.Sleep 也不好用,我试了下使用Process直接启动那个控制台应用 就只会闪一下DOS窗口就自动关了,我的代码是:

    	    Process myProcess = new Process();
    
    	    myProcess.StartInfo.FileName = @"C:\test.exe";
                myProcess.StartInfo.Arguments = @"-A.CC";
                myProcess.StartInfo.UseShellExecute = false;
                myProcess.StartInfo.RedirectStandardInput = true;
    
                myProcess.Start();

    如果直接在Windows运行里直接输入“C:\test.exe -A.CC" 是可以正常打开这个控制台应用的,请问应该如何解决,谢谢!


    • 已编辑 fansmit 2014年11月15日 9:35
    2014年11月15日 8:54