阻止应用程序的所有其他输入,并从Java中的包装器控制它

时间:2010-04-27 03:32:40

标签: java windows automation wrapper

我有一个Windows应用程序,它有一个复杂的GUI,我想隐藏用户。为了做到这一点,我想创建一个包含极其简单的界面的包装器,它覆盖了这个应用程序,并在用户单击包装器上的单个按钮时自动执行许多操作。 (我希望“包装器”是正确的术语。)是否可以使用Java来阻止对底层应用程序的输入,以便用户不会无意中搞乱自动化?我该怎么做?另外,如何在不劫持鼠标的情况下自动按键和点击应用程序?这在Java中是否可行?

我看过java.awt.Robot,但它似乎劫持了鼠标。 我也查看了AutoIT,但它也劫持了鼠标并且没有与Java集成。

这些选项似乎都不足以满足我的需求,但我不知道还有什么可以继续。

1 个答案:

答案 0 :(得分:3)

如果您真的没有其他选择,我建议仅通过GUI进行自动化作为最后的手段。

如果您的应用程序公开了API,我会尝试使用它。例如,如果GUI在一个DLL中实现,而逻辑在另一个DLL中实现,那么您可以使用JNA加载应用程序逻辑DLL并直接从java调用应用程序函数。更好的是,如果你的应用程序暴露了一个COM / OLE接口 - 有大量的Java<> COM briges,这将使你直接调用这个接口,例如Jacob

如果你真的别无选择,只能通过GUI进行自动化,那么下面是如何做到这一点:

  1. 使用JNA访问Windows shell API。然后,您可以使用ShellExecute启动包装的应用程序。具体来说,将SW_HIDE作为窗口模式传递应有助于确保应用程序不会出现。
  2. 使用JNA访问Windows API FindWindow以查找应用程序窗口。您也可以使用ShowWindow API使其不可见,以防第1步不起作用(并非所有应用程序都使用nCmdShow参数编写。)
  3. 您现在可以使用PostMessage将消息发布到应用程序窗口。您可以使用Windows消息发送击键和鼠标事件。例如。请参阅WM_KEYUPWM_LBUTTONDOWN
  4. 因为包装的应用程序窗口不可见,所以您不需要“阻止”该应用程序,用户根本无法访问它的GUI。但您仍然可以通过编程方式向其发送输入。