Windows aero peek API

时间:2011-06-23 06:39:05

标签: windows api aero aero-peek

我正在尝试将API用于航空偷看。经过大量的挖掘和搜索,我偶然发现了这段代码:

    [DllImport("dwmapi.dll", EntryPoint = "#113", SetLastError = true)]
    internal static extern uint DwmpActivateLivePreview(uint , uint , uint , uint );

但我无法让它工作..我不知道参数是什么..我尝试了一些API拦截工具但是没有成功。如何才能发现如何正确调用此API?

4 个答案:

答案 0 :(得分:4)

我最终解决了我的自我。我在我的网站上发布了一篇关于此的文章: http://www.jesconsultancy.nl/tips-and-tricks/aero-apis.html。  不幸的是,这是荷兰语,所以这里有点解释:

 [DllImport("dwmapi.dll", EntryPoint = "#113", SetLastError = true)]
 internal static extern uint DwmpActivateLivePreview(uint switch, IntPtr hWnd, IntPtr c, uint d);

 DwmpActivateLivePreview(1, Handle, topmostWindowHandle, 1);//activate
 DwmpActivateLivePreview(0, Handle, topmostWindowHandle, 1);//deactivate

第一个参数用于激活/停用Aero Peek功能。第二个参数是Aero peek关注的句柄。其他两个 一个我还没能识别。

修改 在更多地讨论这个API后,我想出了第3个参数。在设置表单的TopMost属性时,表单有时会显示在aero peek效果的下方。如果将句柄传递给需要作为第3个参数的peek效果顶部的表单,并且表单的TopMost属性设置为true,则表单将位于查看效果之上。

您可以从Aero Peek效果中排除窗口。这在此处描述:http://huddledmasses.org/fun-with-pinvoke-and-aero-peek/

答案 1 :(得分:4)

我知道这是一个较老的问题但是,接受的答案缺乏完整性。

以下是Aero Peek API的正确用法。

    ///<summary>
    /// These flags are used in conjunction with the Aero Peek API.
    /// </summary>
    public enum PeekTypes : long
    {
        /// <summary>
        /// This flag is here only for completeness and is not used
        /// </summary>
        NotUsed = 0,
        /// <summary>
        /// Denotes that the Peek API is to operate on the desktop
        /// </summary>
        Desktop = 1,
        /// <summary>
        /// Denotes that the Peek API is to operate on a window.
        /// </summary>
        Window = 3
    }

    /// <summary>
    /// This is the *Almighty* Aero Peek API!
    /// </summary>
    /// <param name="EM">True if we're going into peek mode; False if we're coming out of it.</param>
    /// <param name="PH">The handle of the window we want to put into peek mode; 
    /// IntPtr.Zero if we're coming out of peek mode or peeking on the desktop.</param>
    /// <param name="C">The handle of the window calling the API method.</param>
    /// <param name="pT">One of the <see cref="PeekTypes"/> enum members. 
    /// Pass <see cref="PeekTypes.Desktop"/> if you want to peek on the desktop and <see cref="PeekTypes.Window"/> if you want to peek on a window. <see cref="PeekTypes.None"/> is unused but, there for completeness.</param>
    /// <param name="hPN0">When going into or out of peek mode, always pass new IntPtr(32) for this parameter.</param>
    /// <param name="iFI0">When going into or out of peek mode, always pass 0x3244 for this parameter.</param>
    /// <returns></returns>
    [DllImport("dwmapi.dll", EntryPoint = "#113", CharSet = CharSet.Auto, PreserveSig = true, SetLastError = true, CallingConvention = CallingConvention.StdCall)]
    static extern int InvokeAeroPeek(bool EM, IntPtr PH, IntPtr C, PeekTypes pT, IntPtr hPN0, int x3244);

我花了几个月的时间对大部分酷炫的Windows 7任务栏API进行逆向工程,这是我发现的一部分。接受或离开它,这是使用Aero Peek API的正确方法。我的“研究”是在2008年完成的,而Windows 7仍处于测试阶段,泄露的预览版本很普遍。对于那些可能会产生麻烦的人来说,这段代码也适用于Windows 8。下面是一个简单的例子:

InvokeAeroPeek(enterPeekMode, target, caller, pType, new IntPtr(32), 0x3244);

此代码与处理器无关,无论您想要编译它,它仍然可以工作。 Win32和x64都是受欢迎的。

答案 2 :(得分:1)

你可以详细说明你想做什么吗?你试图在你自己的应用程序中调用窥视或支持自定义Aero偷看吗?

如果是后者,您应该参考http://msdn.microsoft.com/en-us/library/ff819048(v=VS.85).aspx和相关文档。

答案 3 :(得分:1)

对于每个实际使用此无证功能的人来说,我都有坏消息。 Windows 10似乎在最后添加了一个额外的参数。这可能意味着在Win7下运行正常的代码可能会在Win10下崩溃,因为在调用此函数后堆栈指针将会搞砸。另外,有可能使用缺少堆栈参数调用此函数将导致Win10在调用期间deref一个错误的指针。

我使用了以下定义。

typedef HRESULT (__stdcall *DwmpActivateLivePreview)(BOOL peekOn, HWND hPeekWindow, HWND hTopmostWindow, UINT peekType1or3, UINT_PTR newForWin10);

我在这个新论点中简单地传递了零。在Win10 64bit下运行64位代码,我能够使用本页其他答案中描述的参数激活Aero Peek。在Win10 64bit下运行32位代码,在Win7 64bit下运行32位代码时,我得到了相同的0x80070018错误。