在 Visual Studio C# 中控制外部窗口

Posted

技术标签:

【中文标题】在 Visual Studio C# 中控制外部窗口【英文标题】:Control external window in visual studio c# 【发布时间】:2011-07-28 04:37:48 【问题描述】:

[编辑] 我打算为 VLC 播放器构建一些外部插件,因此我使用 FindWindow 类型的函数来控制我的程序中的 VLC 播放器。

从您自己的窗口控制外部窗口的最佳编程实践是什么? FindWindowEx 是最佳实践,还是 FindWindow 更好,还是有一些开发的库?应该使用FindWindowEx 的任何提示吗?

[编辑] 此外,在许多情况下,标题可能因不同的语言而异, 所以hwnd = FindWindow(null, "Calculator") 如果标题不是“计算器”而是“模拟器”[法语] 或“Rechner”[德语] 可能不起作用。无论操作系统语言是什么,我如何确保它找到了窗口?

还有另一个问题 - 是否有可能将我的应用程序锚定在 VLC 播放器旁边,这样 vlc 播放器窗口的任何移动也会移动我的应用程序?我找不到任何合适的功能。

【问题讨论】:

【参考方案1】:

您没有描述您打算做的示例,但 .NET 自动化可能会对您有所帮助。查看this 文章。也关注this

[编辑] 好吧,要获得独立于标题值的查找窗口的可能性,您应该只使用 FindWindEx 函数并依赖于外部窗口的类名。类与语言环境无关。 我认为 UI 自动化分为两类:

基于窗口。这种方法假设您使用 FindWindow 和 SendMessage 来操作外部窗口 基于坐标。在这种方法中,您只使用外部窗口上的控件坐标。因此,您正在向具有特定坐标的***窗口发送消息。

第二种方法更简单,但完全不可靠。它将一直工作到目标应用程序更改控制布局。所以我建议你在任何可以应用的地方使用 FindWindowEx 和 SenMessage。

关于使用目标应用程序锚定您的应用程序。是的,有可能,您有两种方法可以做到这一点: 第一种也是简单的方法是在您的应用程序内创建计时器并检查目标应用程序的坐标并相应地移动您的应用程序窗口,但这种方法似乎是解决方法。 第二种也是更复杂的方法是创建 Hook 并将其注入目标进程。您可以使用SetWindowHookEx 函数设置挂钩。另请阅读mouse hook in C#。还有一个提示,如果您要编写一个钩子,不要在所有进程中注入 .NET 钩子,如果托管应用程序是为不同的平台版本而不是您的钩子编写的,这可能会在托管应用程序中出现问题。

【讨论】:

谢谢,我做了一些更改,所以问题会很清楚。

以上是关于在 Visual Studio C# 中控制外部窗口的主要内容,如果未能解决你的问题,请参考以下文章

怎样在visual studio 2008中的c#控制台中用console.writeline语句输出一个字符数组?用foreach循环怎么写

C# 关键字 Visual Studio 2012

从 Visual Studio 启动时,C# ReleaseMutex() 未在控制台应用程序的多个实例中释放互斥锁

Visual Studio XML 外部注释文件不起作用

如何在 Visual Studio 2017 项目中启用 C# 7 的所有功能?

在Visual Studio中使用Git命令提示符