我正在使用ShowWindow函数隐藏和显示外部进程的主窗口。现在,我想使用AnimateWindow当我显示或隐藏该窗口时,调用 ShowWindow 来为该窗口设置动画之前,我需要调用该函数,但是,正如 MSDN 上的文档所述,如果线程(我在其上),Animatewindow 函数将失败正在调用 Animatewindow)不拥有我想要设置动画的窗口...
对此有什么解决方案吗?我可以以某种方式“拥有”该线程,以在该外部进程的 UI 线程上远程执行 Animatewindow 函数,或者任何其他更简单的解决方案这?。至少我知道窗口句柄,并且我可以使用 GetWindowThreadProcessId 检索创建该窗口的线程的线程 ID。功能。
那么,这可以通过任何方式完成吗?
如果此信息有帮助:外部进程是一个 .NET 可执行文件(WPF 桌面应用程序),我想为其主窗口设置动画。该应用程序支持 dll 文件形式的插件,应用程序将在启动时加载这些插件,因此我在类库中调用 ShowWindow 和 AnimateWindow ,在我在其上运行消息循环的新线程(用于其他需求)。我无法访问该应用程序的源代码来实现任何类型的进程间通信功能,例如命名管道或共享内存块。
我正在寻求使用 C# 或 VB.NET 的解决方案,没关系。
最佳答案
正如文档所述,只有拥有该窗口的线程才能在该窗口上调用 AnimateWindow()
。
您不能拥有其他人的线程或窗口的所有权。因此,实现目标的唯一方法是将代码注入(inject)到拥有该窗口的线程中。
让您的插件 DLL 调用 GetWindowThreadProcessId()
来获取拥有该窗口的线程的 ID,然后调用 SetWindowsHookEx()
来安装线程特定的消息该线程的钩子(Hook)。
然后,您可以向窗口发送自定义消息,消息 Hook 处理程序将在拥有该窗口的线程的上下文中运行,然后可以在窗口上调用 AnimateWindow()
.
关于c# - 如何调用 AnimateWindow 函数来为外部窗口/进程设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49743525/