用于预览窗口后面的屏幕状态的Aero功能是什么?

时间:2012-10-04 01:21:01

标签: c windows aero

我到处看看如何在我的程序中使用Aero。我找不到任何预览你自己后面的窗口的C函数,比如File Explorer或任何主流浏览器在它们的标题栏上。

有些程序通过添加一个看起来像Windows 7标题栏的图像来伪造它 - 没有Aero - 但我认为这有点作弊。我在下面的链接中找到了这段代码:

[DllImport ("dwmapi.dll" Entry Point = "# 113", SetLastError = true)] 

internal static external DwmpActivateLivePreview uint (uint a, IntPtr b, uint c, uint d); 

[DllImport ("dwmapi.dll" Entry Point = "# 105", SetLastError = true)]

internal static bool external DwmpStartOrStopFlip3D (); 

// Activate Aero peek into the desired Handle 
DwmpActivateLivePreview (1, Handle, 0, 1);

// Disable Aero peek
DwmpActivateLivePreview (0, Handle, 0, 1);

// start or stop the Aero Flip 3D
DwmpStartOrStopFlip3D ();

但不知道这意味着什么。 Aero Peek的实现是否会自动与PreviewWindows(or whatever)函数一起使用?

我迷路了。

This link是荷兰语,只需通过谷歌翻译

运行

我不是要尝试切换Aero Peek和/或Flip是否已激活,或者当鼠标悬停在任务栏图标上时更改应用程序的图标。我正在寻找一个函数,它接受我自己的应用程序的当前屏幕状态,并将其作为图像返回,以便在我的应用程序中显示。作为奖励,(推测)返回的图像是否模糊,或者是单独应用的效果?我认为它的名字是Aero Glass。

2 个答案:

答案 0 :(得分:1)

据我了解,您希望获得应用程序背后窗口的状态(就显示而言)。您可以通过执行以下操作来实现它,

HWND hwnd_behind = GetNextWindow(your_window_handle, GW_HWNDNEXT);

HDC hdc = GetWindowDC(hwnd_behind);

RECT rect;
GetWindowRect(hwnd_behind,rect);

HDC bitmap = MakeABitMapDC();

StretchBlt(bitmap,0,0,dW,dH,hdc,0,0,rect.width,rect.height,SRCCOPY);

您可以将此代码插入处理程序,当Windows向应用程序请求预览位图时返回位图。

为了简洁起见,留下像“MakeABitMapDC”这样的细节。

答案 1 :(得分:0)

我迷失了很多区域,看你不明白但我会尝试。

如果你不知道参数中的参数是什么意思:

[DllImport ("dwmapi.dll" Entry Point = "# 113", SetLastError = true)] 
internal static external DwmpActivateLivePreview uint (uint a, IntPtr b, uint c, uint d); 

基本上是这样的:

  • a:是激活Aero Peek的参数。
  • b:AeroPeek也关注这个句柄。
  • c:是一个棘手的问题。如果您将窗口的句柄传递给该参数并且设置了TopMost属性,它将显示在AeroPeek的顶部。
  • d:我不知道d的用途,但是我使用DwmpActivateLivePreview的时间总是把它放在1上。

所以签名是这样的:

internal static extern uint DwmpActivateLivePreview(uint active, IntPtr handle, IntPtr onTopHandle, uint d);

DwmpStartOrStopFlip3D方法激活“Windows + Tab”效果。

[DllImport("dwmapi.dll", EntryPoint = "#105", SetLastError = true)]
internal static extern bool DwmpStartOrStopFlip3D();

请记住,有一个原因是它们没有记录,因为它们不适合我们使用它们。

如果您想在应用程序中使用Aero Peek效果,可以查看位于DWM中的DwmSetIconicLivePreviewBitmap函数。

此处提供更多信息:MSDN: DwmSetIconicLivePreviewBitmap function