在运行时将一个窗口的控件替换为另一个

Posted

技术标签:

【中文标题】在运行时将一个窗口的控件替换为另一个【英文标题】:Replacing a window's control with another at runtime 【发布时间】:2010-03-11 15:31:51 【问题描述】:

我有一个窗口句柄及其richEdit 控件。我可以用我自己的一个替换上述控件吗?我希望它表现得像原来的那样,即成为窗口等的一部分。

我将进一步详细说明该场景 - 我目前正在反汇编一个应用程序,其功能之一是文本编辑器。我当前的(受限制的)环境中有各种程序挂钩,其中一个产生了编辑器窗口的句柄。另一个允许我获取 RichEdit20A 控件窗口主机的句柄。

我想做的是 - 用我自己的(大概是它的 .NET 等效项)覆盖控件并修补应用程序的 GetWindowText 调用以使用新的。为了实现它,我计划用 C#/托管 C++ 编写类库并将其导入我的应用程序(它是用非托管 C++ 编写的)。

此外,可以有任意数量的文本编辑器实例。

【问题讨论】:

这是不可能的,没有办法让应用知道它需要使用不同的窗口句柄。或者将托管代码注入到非托管程序中。 我当前的钩子允许我在 GetWindowTextA 调用(配备 asm 包装器的裸函数)之前修改调用堆栈,并且我不打算注入托管代码本身。你看,我的应用程序充当修补应用程序的非托管包装器。除了调用类库的方法来设置/获取后者的文本之外,它什么也不做。 【参考方案1】:

这听起来太复杂了。只需替换它的 WndProc(GWL_WNDPROC),什么都不转发,然后使 HWND 无效。这将强制重绘 (WM_PAINT),然后您可以捕获它。所有者可能甚至都不会注意到(当然,除非他们也将其钩住)

【讨论】:

以上是关于在运行时将一个窗口的控件替换为另一个的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应js中发生事件(按钮单击)时将组件替换为另一个组件

在运行时将新表重新加载/替换到 WPF DataGrid 中

在 s3 python boto3 中替换文件

在运行时将带有绑定的控件添加到 Xamarin ListView?

在运行时将图像加载到对话框图片控件中

在VB6.0中,运行一个窗体时,放大该窗体的尺寸时将触发的事件是