c# - C# 在运行 geth 的命令提示符下执行
问题描述
我有一个侦听器服务,我可以向它发送命令,但是使用此服务,它无法向运行 ethereuem 的 geth 的命令提示符发送命令。有没有办法强行让键盘敲击通过?
我注意到我有其他代码可以通过名称或 id 找到命令提示符并且能够将该窗口带到前面,但是当我尝试使用运行 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);
}
}
}
解决方案
哦,在运行 geth 的命令提示符下,windows 似乎有三个进程 ID。我不知道为什么有三个。我尝试了所有三个,其中一个对我有用。所以我不能用“geth”的名字来调用这个进程,这似乎不是发送击键的正确窗口或进程。希望这对其他人有帮助!
推荐阅读
- c# - 我无法通过 C# 在 Outlook 约会中插入超链接
- react-admin - React Admin - 获取表单中的当前值
- postgresql - 使用 postgresQL 选择具有首先出现的 id 的行
- regex - 使用 Groovy 脚本从日志文件中复制特定的 XML 块
- java - 访问 REST API 时完全忽略 WAR 名称
- plugins - 自定义注释和标记工具栏以在 acrobat 2017 中添加一些按钮
- javascript - 带有 OneMap 的 Leaflet.js:标记和多边形问题
- c# - 布尔的 PropertyBuilder
- mysql - 按年和月分组数据
- graph - Cacti - 数据源模板更改后轮询器停止 - 旧但黄金