如何选择并突出显示另一个应用程序中的窗口?

Posted

技术标签:

【中文标题】如何选择并突出显示另一个应用程序中的窗口?【英文标题】:How to select and highlight a window in another application? 【发布时间】:2008-10-23 05:53:06 【问题描述】:

我想将 C++ 程序中的一些击键发送到另一个窗口。

出于这个原因,我想让用户选择目标窗口,类似于在 Visual Studio 附带的 Spy++ 实用程序中的操作方式(将十字光标拖到目标窗口上,并用框架突出显示目标窗口)。

在 Windows 中如何进行这种拖动和选择?我完全不知道从哪里开始寻找实现此功能的机制。

【问题讨论】:

【参考方案1】:

这是通常的做法:

    使用SetCapture 捕获鼠标。这将导致所有鼠标消息都被路由到您应用的窗口。 处理WM_MOUSEMOVE 消息。在您的处理程序代码中,使用WindowFromPoint 抓住鼠标下方的窗口。这将为您提供鼠标当前所在窗口的 HWND。 现在您已经获得了窗口,您需要一个设备上下文 (HDC)。您可以使用GetWindowDC 为指定窗口获取一个。 现在您可以使用典型的 GDI 函数绘制到 DC。

您必须注意一些事情 - 干净地擦除选择矩形等,但这是一种方法。

您也可以绘制到屏幕 DC 中来执行此操作,但无论如何您都需要窗口句柄才能获得窗口矩形。

如果您搜索 Spy++ 源代码,您会看到一些这种技术的示例。

【讨论】:

这种方法的问题是 DWM(尤其是 Aero)不知道您绘制精美的图像并随机删除它们。【参考方案2】:

以前的答案是错误的。

Spy++ 源代码已在 G.Groups 上提供多年(主要参见 Win32 api ng news://194.177.96.26/comp.os.ms-windows.programmer.win32)

【讨论】:

我熟悉 Spy++ 代码,但有不止一种方法可以做到这一点。您可以使用上述技术在进程外执行此操作,也可以使用挂钩、DLL 注入和子类化在进程内执行此操作。我相信这就是 Spy++ 所做的。但这并不是绘画所必需的。

以上是关于如何选择并突出显示另一个应用程序中的窗口?的主要内容,如果未能解决你的问题,请参考以下文章

打开资源管理器窗口并选择指定文件

如何使用 PDFKit 突出显示 pdf 中的选定文本?

在 QTextEdit 窗口中选择文本并使用 setTextBackgroundColor 突出显示

如何选择/突出显示列表视图中的项目而不触摸它?

ListView 项目在滚动后保持突出显示

如何选择并突出显示 UICollectionView,如 UITableViewCell?