【问题标题】:.Net application windows controls injection.Net 应用程序窗口控制注入
【发布时间】:2010-11-11 20:27:47
【问题描述】:

我有一个作为 Windows 窗体 .net 应用程序实现的旧版应用程序。它允许编写事件脚本(使用 vbs),但不允许改进它的 UI。

是否可以将一些自定义用户控件注入到遗留应用程序控件树中,以便进一步通过脚本功能与它们进行通信?

附言遗漏了遗留应用程序代码。从头开始重写也是不可能的

【问题讨论】:

    标签: .net winforms legacy


    【解决方案1】:

    如果您竭尽全力并付出很多努力,我相信使用反射和代码重写或任何类似的东西都是可能的。但是,通过更改源代码然后重新编译来简单地修改 GUI,几乎可以肯定会更简单、更省时、更不容易出错。

    如果您的 GUI 并不意味着灵活,那么应该通过重新设计或重构代码来使其灵活,而不是通过将现有代码滥用到它不应该做的事情中。


    更新#1:正如评论中所说,由于您不再拥有源代码,因此重新编译的选项消失了。除非您从头开始重新编写应用程序或通过逆向工程工具(如 .NET Reflector)检索部分源代码。 (假设代码没有被混淆。)

    更新#2:如果你想走枚举HWNDs(Win32窗口句柄)的路线,你可能会对一个相关的问题感兴趣:即修改Windows'默认文件打开/保存对话框。如果您想在这些对话框中插入或更改控件,则基本上必须处理HWNDs,然后使用本机 Win32 API 函数通过这些操作控件​​。

    【讨论】:

    • 是的,没错。但是代码被遗漏了:(对不起,我从一开始就没有提到这一点
    • @Andrew:好的。根据您的应用程序的复杂程度,您可能需要考虑重新编写它,以便开始时更加灵活。或者使用 .NET 反射器或任何其他逆向工程工具部分检索源代码。 (这个建议只有在代码没有被混淆的情况下才有效。)
    • 是否可以使用脚本从 dll 创建我的 com 对象(在这种情况下,我的代码将被加载到可执行文件中),然后使用 win32 本机函数遍历句柄找到我想要的控件并将其转换返回 Windows.Forms.Form 实例以访问 .Controls 属性?
    • 我不认为这是要走的路。但是既然你问:我认为与其混合 Windows API 功能和 Winforms,我会忘记 Winforms——我认为你不能轻易地重新构建一个 Form 对象,包括它的所有子对象 Controls 只是从一个HWND -- 并坚持使用 Win32 API。我相信很有可能遍历一个过程'HWNDs(以查找表单)并找到一个特定HWND 的所有子HWNDs(控件)。
    • 谢谢你,Stakx。我找到了 Form.FromHandle 方法,尽管它对应用程序域边界有限制。它不适用于我的情况
    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多