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

5
我已经到处查找如何在我的程序中使用Aero。但是我没有找到任何C函数,可以预览窗口背后的内容,就像文件资源管理器或任何主流浏览器在它们的标题栏上所做的那样。
一些程序通过添加一个看起来像Windows 7标题栏的图像来伪造它,但我认为这有点欺骗。我在下面的链接中找到了这段代码:
[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(或其他函数)功能一起使用?

我迷失了。

此链接是荷兰语的,请通过Google翻译运行它

我不想切换Aero Peek和/或Flip是否激活,也不想在鼠标悬停在其任务栏图标上时更改我的应用程序的图标。相反,我正在寻找一个函数,它获取我自己后面的应用程序的当前屏幕状态并将其作为图像返回以在我的应用程序中显示。作为奖励,(可能)返回的图像模糊吗?还是这是单独应用的效果?我认为它的名称是Aero Glass。


1
我仍在努力弄清楚为什么这在C#中完全正常,但是我无论如何都无法在C++中通过LoadLibraryGetProcAddress获得任何工作。 - chris
1
你是指当你将鼠标悬停在缩略图预览上或在窗口之间按下Alt+Tab时返回的图像吗? - BoltClock
1
啊,Aero Peek 是当你展示所有打开窗口后面的桌面时发生的情况,那些图像是窗口预览。窗口框架的模糊部分确实是 Aero Glass,但我不知道是否有一个函数返回被窗口玻璃区域覆盖的区域... - BoltClock
有屏幕截图软件可以仅捕获特定区域,但我认为它们只是从屏幕上呈现的内容中获取(包括模糊和窗口着色)。 - BoltClock
1
http://msdn.microsoft.com/en-us/library/windows/desktop/aa969537%28v=vs.85%29.aspx - Hans Passant
显示剩余5条评论
2个回答

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”等细节。


在非Aero模式下,GetWindowDC会返回一些虚拟DC,它基本上指的是屏幕上被该窗口占用的部分。这意味着如果窗口1在顶部,窗口2在相同的XY位置下方,两个窗口的GetWindowDC都会返回一个内容相同的DC,即窗口1的内容。 - nanda

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


1
是的,未记录的函数非常适合用来玩耍,但请不要在任何超出此范围的事情中使用它们。Windows 中有大量死代码和/或无用代码挂在那里,因为它们需要保持人们的应用程序运行,即使它们不听。 - chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接