API Windows Aero Peek - PullRequest
       9

API Windows Aero Peek

8 голосов
/ 23 июня 2011

Я пытаюсь использовать API для Aero Peek.С большим количеством копания и поиска я наткнулся на этот кусок кода:

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

Но я не могу заставить его работать ... Я не знаю, каковы параметры ... Я попробовал некоторый APIперехватывать инструменты, но это не сработало.Как я могу узнать, как правильно назвать этот API?

Ответы [ 4 ]

4 голосов
/ 28 июня 2011

Я в конце концов решил это сам. Я разместил статью на своем сайте об этом: 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 формы форма все равно иногда отображается под эффектом аэродинамики. Если вы передадите дескриптор той форме, которая должна находиться над эффектом просмотра, в качестве 3-го параметра, а свойство TopMost вашей формы будет установлено в значение true, ваша форма будет поверх эффекта просмотра.

Вы можете исключить окно из эффекта Aero Peek. Это описано здесь: http://huddledmasses.org/fun-with-pinvoke-and-aero-peek/

4 голосов
/ 01 декабря 2012

Я знаю, что это более старый вопрос, но принятому ответу не хватает полноты.

Ниже приведено правильное использование 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);

Я потратил несколько месяцев на реинжиниринг большинства классных API панели задач Windows 7, и это часть моих выводов. Примите это или оставьте, это правильный способ использовать Aero Peek API. Мои «исследования» были проведены в 2008 году, когда Windows 7 все еще находилась в стадии бета-тестирования, и распространенные предварительные сборки были распространены. Для тех, кто может посрать, этот код должен работать и в Windows 8. Ниже приведен простой пример:

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

Этот код не зависит от процессора, скомпилируйте его так, как хотите, и он все равно будет работать. Win32 и x64 приветствуются.

1 голос
/ 31 августа 2015

У меня плохие новости для всех, кто использует эту недокументированную функцию.Windows 10, кажется, добавил дополнительный аргумент в конце.Это, вероятно, означает, что ваш код, работающий нормально под Win7, вероятно, потерпит крах под Win10, потому что указатель стека испортится после вызова этой функции.Кроме того, есть вероятность, что вызов этой функции с отсутствующим аргументом стека приведет к тому, что Win10 разыменует неверный указатель во время самого вызова.

Я использовал следующее определение.

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

Iпросто передал ноль в этом новом аргументе.Запустив 64-битный код под Win10 64-битным, я смог активировать Aero Peek, используя аргументы, как описано в других ответах на этой странице.При запуске 32-битного кода под Win10 64-битной я получил ту же ошибку 0x80070018, которую получил при запуске 32-битного кода под Win7 64-битной.

1 голос
/ 24 июня 2011

Можете ли вы уточнить, что вы пытаетесь сделать? Вы пытаетесь вызвать Peek или поддержать пользовательский Aero Peek в вашем собственном приложении?

если последнее, вы должны ссылаться на http://msdn.microsoft.com/en-us/library/ff819048(v=VS.85).aspx и соответствующую документацию.

...