C # выполнить в командной строке, запустив geth

У меня есть служба прослушивателя, где я могу отправить ему команду, но с этой службой он не может отправить команду в командную строку, выполняющую geth ethereuem. Есть ли способ принудительно пропустить штрихи клавиатуры?

Я замечаю, что у меня есть другой код, который может найти командную строку по имени или идентификатору и вывести это окно на передний план, но когда я пытаюсь сделать это с помощью командной строки, в которой запущен geth, кажется, что он не может открыть это окно вперед. Я надеюсь, что эта информация может помочь.

namespace Listener
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var listener = new HttpListener())
            {
                listener.Prefixes.Add("http://localhost:8081/mytest/");

                listener.Start();

                string command = string.Empty;

                for (; ; )
                {
                    Console.WriteLine("Listening...");

                    HttpListenerContext context = listener.GetContext();
                    HttpListenerRequest request = context.Request;

                    // TODO: read and parse the JSON data from 'request.InputStream'

                    using (StreamReader reader = new StreamReader(request.InputStream))
                    {
                        // Would prefer string[] result = reader.ReadAllLines();
                        string[] result = reader.ReadToEnd().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                        foreach (var s in result)
                        {
                            command = s;
                        }
                    }

                    // send command to other geth window
                    sendKeystroke(command);

                    using (HttpListenerResponse response = context.Response)
                    {
                        // returning some test results

                        // TODO: return the results in JSON format

                        string responseString = "<HTML><BODY>Hello, world!</BODY></HTML>";
                        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
                        response.ContentLength64 = buffer.Length;
                        using (var output = response.OutputStream)
                        {
                            output.Write(buffer, 0, buffer.Length);
                        }
                    }
                }
            }
        }

        [DllImport("user32.dll")]
        static extern bool SetForegroundWindow(IntPtr hWnd);
        private static void sendToOpenCmd(string command)
        {
            int processId = 13420;
            //processId = int.Parse(13420);
            System.Diagnostics.Process proc = (from n in System.Diagnostics.Process.GetProcesses()
                                               where n.ProcessName == "geth"
                                               //where n.Id == processId
                                               select n).FirstOrDefault();
            if (proc == null)
            {
                //MessageBox.Show("No such process.");
                Console.WriteLine("No such process.");
            }
            else
            {
                SetForegroundWindow(proc.MainWindowHandle);
                SendKeys.SendWait(command + "{enter}");
                Console.WriteLine("Sent! " + command + " " + DateTime.Now.ToString());
            }

        }

        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("user32.dll")]
        public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
        [DllImport("user32.dll")]
        public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

        public static void sendKeystroke(string command)
        {
            const uint WM_KEYDOWN = 0x100;
            const uint WM_SYSCOMMAND = 0x018;
            const uint SC_CLOSE = 0x053;

            IntPtr WindowToFind = FindWindow(null, "geth");

            //ushort[] result = command.Where(i => ushort.TryParse(i, out short s)).Select(ushort.Parse);
            //ushort[] result = command.Where(i => { ushort r = 0; return ushort.TryParse(i, out r); }).Select(ushort.Parse);
            ushort result;
            ushort.TryParse(command, out result);
            IntPtr result3 = SendMessage(WindowToFind, WM_KEYDOWN, ((IntPtr)result), (IntPtr)0);
            //IntPtr result3 = SendMessage(WindowToFind, WM_KEYUP, ((IntPtr)c), (IntPtr)0);
        }
    }
}

person L.Le    schedule 30.09.2018    source источник


Ответы (1)


ооо, похоже, есть три идентификатора процесса, которые Windows имеют в этой командной строке, запускающей geth. Я не уверен, почему их трое. Я попробовал все три, и один из них у меня сработал. поэтому я не могу вызвать процесс по имени "geth", это не то окно или процесс, в который нужно отправлять нажатия клавиш. надеюсь, это поможет кому-то другому!

person L.Le    schedule 30.09.2018