我正在开发一个winForm应用程序,我列出了所有正在运行的进程。 在任何进程的鼠标hover时,我需要预览窗口(如在Windows 7中,将鼠标hover在任务栏中的应用程序上时,会生成预览,显示应用程序窗口的内容。
任何想法如何实现这一点,我无法得到它。 任何build议都会有帮助。 谢谢..
完整的例子在这个网站
你需要两个功能:
[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);
注册后,你只要说窗口的位置来绘制图片
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);
你不需要编写任何代码来实现这一点。 它是Windows Vista中引入的Aero主题的一部分,仍然存在于Windows 7中。默认情况下,当您将鼠标悬停在任务栏中的图标上时,会显示应用程序窗口的一个缩略图。 对于您展示的Skype示例,以及您自己编写的C#应用程序,情况也是如此。
如果您想要更精确地控制预览中显示的内容(如果您只想显示应用程序窗口的一小部分),则可以编写一些调用一个或多个相关DWM API函数的代码 。
但是不要自己编写所有的P / Invoke代码。 使用一个现有的库,以.NET友好的方式封装它,如Windows Forms Aero或Windows API Code Pack 。
如果你想自己的应用程序显示一个Aero缩略图,也许这个C ++示例可以帮助你。 显然它使用DwmRegisterThumbnail()来表示“此HWND现在将显示另一个的缩略图”。
所以,一个小小的P / Invoke调用和IWin32Window
…