4

我正在开发一个 winForm 应用程序,其中列出了所有正在运行的进程。在任何进程的鼠标悬停时,我想要预览窗口(在 Windows 7 中,当您将鼠标悬停在任务栏中的应用程序上时,会生成一个预览,显示应用程序窗口的内容。)参见图像。

在此处输入图像描述

任何想法如何实现这一点,我无法得到它。任何建议都会有所帮助。谢谢..

4

3 回答 3

7

此站点上的完整示例
您需要两个功能:

[DllImport("dwmapi.dll")]
static extern int DwmRegisterThumbnail(IntPtr dest, IntPtr src, out IntPtr thumb);

[DllImport("dwmapi.dll")]
static extern int DwmUpdateThumbnailProperties(IntPtr hThumb, ref DWM_THUMBNAIL_PROPERTIES props);

使用 DwmRegisterThumbnail
您在您的表单中,并将其处理为您想要在您的程序中绘制的外部程序。

IntPtr hWnd = process.MainWindowHandle;
int i = DwmRegisterThumbnail(this.Handle, hWnd, out thumb);

注册后,你只需对windows说绘制图片的位置

            DWM_THUMBNAIL_PROPERTIES props = new DWM_THUMBNAIL_PROPERTIES();

            props.fVisible = true;
            props.dwFlags = DWM_TNP_VISIBLE | DWM_TNP_RECTDESTINATION | DWM_TNP_OPACITY;
            props.opacity = 255;
            props.rcDestination = new Rect(panel.Left, panel.Top, panel.Right, panel.Bottom);

            DwmUpdateThumbnailProperties(thumb, ref props);
于 2013-07-05T10:23:01.237 回答
3

您无需编写任何代码即可实现这一目标。它是 Aero 主题的一部分,随 Windows Vista 引入,并且仍然存在于 Windows 7 中。默认情况下,当您将鼠标悬停在任务栏中的图标上时,会显示应用程序窗口的小缩略图。对于您展示的 Skype 示例以及您自己编写的 C# 应用程序来说都是如此。

如果您想对预览中显示的内容进行更精细的控制(例如,如果您只想显示应用程序窗口的一小部分),您可以编写一些代码来调用一个或多个相关的DWM API 函数

但是不要自己编写所有的 P/Invoke 代码。使用以 .NET 友好的方式将其全部打包的现有库之一,例如Windows Forms AeroWindows API Code Pack

于 2013-07-05T09:20:05.190 回答
0

如果您希望自己的应用程序显示 Aero 缩略图,也许这个 C++ 示例可以帮助您。显然它使用DwmRegisterThumbnail()来表示“这个 HWND 现在将显示另一个的缩略图”。

所以,一个小小的 P/Invoke 调用和IWin32Window......

于 2013-07-05T09:32:36.257 回答