c# - 如何调用 AnimateWindow 函数来为外部窗口/进程设置动画

标签 c# .net vb.net winapi pinvoke

我正在使用ShowWindow函数隐藏和显示外部进程的主窗口。现在,我想使用AnimateWindow当我显示或隐藏该窗口时,调用 ShowWindow 来为该窗口设置动画之前,我需要调用该函数,但是,正如 MSDN 上的文档所述,如果线程(我在其上),Animatewindow 函数将失败正在调用 Animatewindow)不拥有我想要设置动画的窗口...

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

那么,这可以通过任何方式完成吗?

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

我正在寻求使用 C# 或 VB.NET 的解决方案,没关系。

最佳答案

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

您不能拥有其他人的线程或窗口的所有权。因此,实现目标的唯一方法是将代码注入(inject)到拥有该窗口的线程中。

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

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

关于c# - 如何调用 AnimateWindow 函数来为外部窗口/进程设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49743525/

相关文章:

c# - vb6 对十六进制值常量进行或运算?

.net - 当我按名称搜索文件时,如何设置 ReSharper 忽略区分大小写?

c# - VB.Net 中的匿名类初始化

c# - 无需 VS 设计器即可动态添加 ActiveX 控件

c# - 项目设置中缺少 Visual Studio 2017 包选项卡

c# - DatagridViewComboBoxColumn 的 DisplayMember 中的多个值

c# - 为什么初始化程序不能处理返回列表 <t> 的属性?

c# - 只有多个线程之一执行特定代码路径

vb.net - With... End With vs Using in VB.NET

asp.net-mvc - VB.NET 中 ViewDataDictionary 实例后的 "!"符号是什么?