如何调用AnimateWindow函数来设置外部窗口/进程的动画

时间:2018-04-10 00:30:35

标签: c# .net vb.net winapi pinvoke

我正在使用ShowWindow功能隐藏并显示外部进程的主窗口。现在,我想在调用 ShowWindow 之前使用AnimateWindow函数在我显示或隐藏它时为该窗口设置动画,但正如文档在MSDN上所说的那样, Animatewindow <如果线程(我在其上调用 Animatewindow )不拥有我想要设置动画的窗口,则/ strong>函数将失败...

对此有什么解决方案吗?我可以通过某种方式“拥有”该线程,以远程执行该外部进程的UI线程上的 Animatewindow 函数,或任何其他更简单的解决方案这个?。至少我知道窗口句柄,我可以使用GetWindowThreadProcessId函数检索创建该窗口的线程的线程ID。

那么,这可以用任何方式完成吗?。

如果此信息可能有用:外部进程是.NET可执行文件(WPF桌面应用程序),我想为其主窗口设置动画。该应用程序支持应用程序在启动时加载的dll文件形式的插件,因此我在类库中调用 ShowWindow AnimateWindow ,运行我的代码我在其上运行消息循环的新线程(用于其他需求)。我无权访问该应用程序的源代码来实现任何类型的进程间通信功能,如命名管道或共享内存块。

我要求使用C#或VB.NET的解决方案,无所谓。

1 个答案:

答案 0 :(得分:3)

正如文档所述,只有拥有该窗口的线程才能在窗口上调用AnimateWindow()

您无法拥有其他人的线程或窗口。因此,实现目标的唯一方法是将代码注入拥有窗口的线程中。

让你的插件DLL调用GetWindowThreadProcessId()来获取拥有该窗口的线程的ID,然后调用SetWindowsHookEx()为该线程安装特定于线程的消息钩子。

然后,您可以向窗口发送自定义消息,并且您的消息挂钩处理程序将在拥有该窗口的线程的上下文中运行,然后可以在窗口上调用AnimateWindow()