【问题标题】:How can I target a process without executing it?如何在不执行进程的情况下定位进程?
【发布时间】:2016-02-11 02:48:17
【问题描述】:

我最近遇到了如下代码:

Process proc1 = Runtime.getRuntime().exec("C:\\Program Files (x86)\\...");

这很好用。然而,一个有趣的问题。此代码实际上打开了指定进程的新实例并将其存储到对象中。如果该进程已经运行并将其存储到对象,则它不会以该进程为目标。我猜这就是 .exec() 函数调用。如何在不打开新实例的情况下定位已经处于活动状态的进程并将其存储到我的 Process 对象中?

注意:我尝试了明显的答案,Process proc1 = new Process("name"); Eclipse 说无法实例化进程。我确实在 javadoc 中查找了 Runtime 类。据我所知,没有明显的方法可以实现我想要实现的目标。似乎是一个简单的问题,我敢肯定它之前被问过,但我无法在任何地方找到答案,这就是我在这里问的原因。我可能使用了错误的术语,这就是原因。

编辑: 我在 Windows 10 上

我的目标是将游戏 Minecraft 的进程附加到 Process 对象。然后,我想使用robot.keyPress(KeyEvent.VK_W); 将我的角色向前移动。我不能只打开进程 minecraft,因为所有要做的就是打开启动器 minecraft.exe,然后我会在“欢迎”屏幕上。

【问题讨论】:

  • 您只能附加到您创建的进程。该进程必须是当前进程的子进程。您可以使用/proc 访问 Linux 上的进程,但它是特定于平台的。
  • 你想用这个过程做什么?
  • @PeterLawrey 我在 MS Windows 上。抱歉忘了提,我在问题正文中添加了这一点。如何在 Windows 中创建它?
  • 据我了解,如果进程已经在运行,您不想实例化它。但是您想将正在运行的进程捕获到一个 java Process 对象中对吧?您当然可以使用 tasklist.exe 以编程方式识别正在运行的进程,然后停止该进程(我不知道这是否真的是您想要的?)然后实例化一个新进程。
  • @nlloyd 只是为了学习而玩耍。 ATM,我试图通过打开进程并使用 Robot.keypress() 来让我的 Minecraft 角色前进。

标签: java process runtime


【解决方案1】:

正如您从Process docs, 推测的那样,当您从代码创建子进程时会创建进程对象。您可以使用此对象管理进程,但运行的其他进程由您的操作系统管理(或与它们有关联的进程)。您必须与操作系统交互才能对它们进行任何操作。

在Windows中查找和杀死进程的示例可以在this answer.中找到

【讨论】:

  • 我听说过一种叫做 JNI 的东西,它显然是用于操作系统和其他东西的。那里可能有一些函数或类可以让我这样做吗?
  • JNI 用于与本机(想想 C/C++)代码进行交互。操作系统不会提供这种级别的访问权限,但通常会提供可以使用 Runtime.exec() 从“命令行”调用的实用程序——点击我的答案中的链接查看示例
  • 哦,好吧,我不知道我只是在猜测。虽然,如果它能够调用 C#,C# 可能具有更好的 Windows 进程功能。
  • 考虑到时间和资源……我想一切皆有可能。一个人可以实现的hackery没有限制:)如果我的老板要求我现在从我的java应用程序中杀死一个不相关的进程,我会走Runtime.exec()路线。如果这是您需要编写脚本的东西 - .NET 肯定会提供选项;同样,PowerShell(在 .NET 上运行但也充当外壳)would probably be the easiest to get done quickly.
  • 刚刚发现了一种乱七八糟的做法。我让它打开了launcher.exe。然后我让线程休眠了 10 秒。我从启动器手动启动游戏并打开了我的世界。然后它起作用了。 =/。不是永久的解决方案。
猜你喜欢
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 2016-04-30
相关资源
最近更新 更多