我正在开发一个 winForm 应用程序,其中列出了所有正在运行的进程。在任何进程的鼠标悬停时,我想要预览窗口(在 Windows 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);
您无需编写任何代码即可实现这一目标。它是 Aero 主题的一部分,随 Windows Vista 引入,并且仍然存在于 Windows 7 中。默认情况下,当您将鼠标悬停在任务栏中的图标上时,会显示应用程序窗口的小缩略图。对于您展示的 Skype 示例以及您自己编写的 C# 应用程序来说都是如此。
如果您想对预览中显示的内容进行更精细的控制(例如,如果您只想显示应用程序窗口的一小部分),您可以编写一些代码来调用一个或多个相关的DWM API 函数。
但是不要自己编写所有的 P/Invoke 代码。使用以 .NET 友好的方式将其全部打包的现有库之一,例如Windows Forms Aero或Windows API Code Pack。
如果您希望自己的应用程序显示 Aero 缩略图,也许这个 C++ 示例可以帮助您。显然它使用DwmRegisterThumbnail()来表示“这个 HWND 现在将显示另一个的缩略图”。
所以,一个小小的 P/Invoke 调用和IWin32Window
......