使用
EnableWindow(Handle, True)
可以轻松启用控件,这可以在应用程序内完成,也可以从外部应用程序(如果您可以确定句柄)完成。这允许您启用禁用的按钮,并在 OnClick
事件中有代码时单击它。如果某个操作附加到按钮并且该操作被禁用,则此操作不起作用。
有没有办法从外部应用程序以类似的方式启用操作?
如果目标应用程序是在启用运行时包的情况下编译的,那么启用操作会更容易。为此,需要编译单独的 dll,它将迭代 Screen.Forms,找到必要的操作并启用它。最重要的是,这个 dll 应该在启用运行时包的相同 Delphi 版本中编译。当注入目标进程时,它将能够与通过全局变量访问的任何内容进行交互,例如应用程序或屏幕。 RAD Studio 中的 UI 测试就是这样工作的,但我没有这么说。
如果目标应用程序是在没有运行时包的情况下编译的,则任务会更加困难并且接近黑客攻击。在注入的 dll 中,您可以使用 FindControl 函数获取指向主机应用程序中的 VCL 对象的指针。之后应该可以使用 RTTI 与该对象进行交互。但在做任何事情之前,您需要以某种方式在主机的地址空间中找到 GetMemoryManager 过程的地址,并将 dll 中的 MM 替换为主机使用的地址。最有可能的是,在所有操作之后,任何卸载 dll 的尝试都会导致主机崩溃。