API Windows aero peek

J’essaie d’utiliser l’API pour aero peek. Avec beaucoup de fouilles et de recherches, je suis tombé sur ce morceau de code:

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

Mais je ne peux pas le faire fonctionner .. Je ne sais pas quels sont les parameters .. J’ai essayé quelques outils d’interception API mais cela n’a pas fonctionné. Comment puis-je savoir comment appeler correctement cette API?

    Je l’ai finalement résolu moi-même. J’ai posté un article sur mon site à ce sujet: http://www.jesconsultancy.nl/tips-and-sortingcks/aero-apis.html . Malheureusement, c’est en néerlandais alors voici un peu expliquant:

      [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 

    Le premier paramètre sert à activer / désactiver la fonctionnalité Aero Peek. Le second paramètre est la poignée sur laquelle Aero peek se concentre. Les deux autres que je n’ai pas encore pu identifier.

    Edit: Après quelques déconvenues avec cette API, j’ai compris le troisième paramètre. Lors de la définition de la propriété TopMost d’un formulaire, le formulaire affiche parfois parfois sous l’effet aero peek. Si vous transmettez le handle à ce formulaire qui doit être au-dessus de l’effet peek en tant que troisième paramètre et que la propriété TopMost de votre formulaire est définie sur true, votre formulaire sera au-dessus de l’effet peek.

    Vous pouvez exclure une fenêtre de l’effet Aero Peek. Ceci est décrit ici: http://huddledmasses.org/fun-with-pinvoke-and-aero-peek/

    Je sais que c’est une question plus ancienne mais la réponse acceptée manque de complétude.

    Vous trouverez ci-dessous l’utilisation correcte de l’API Aero Peek.

      /// /// These flags are used in conjunction with the Aero Peek API. ///  public enum PeekTypes : long { ///  /// This flag is here only for completeness and is not used ///  NotUsed = 0, ///  /// Denotes that the Peek API is to operate on the desktop ///  Desktop = 1, ///  /// Denotes that the Peek API is to operate on a window. ///  Window = 3 } ///  /// This is the *Almighty* Aero Peek API! ///  /// True if we're going into peek mode; False if we're coming out of it. /// 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. /// The handle of the window calling the API method. /// One of the  enum members. /// Pass  if you want to peek on the desktop and  if you want to peek on a window.  is unused but, there for completeness. /// When going into or out of peek mode, always pass new IntPtr(32) for this parameter. /// When going into or out of peek mode, always pass 0x3244 for this parameter. ///  [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); 

    J’ai passé plusieurs mois à désosser la plupart des API de la barre des tâches de Windows 7 et cela fait partie de mes découvertes. Prenez-le ou laissez-le, c’est la bonne façon d’utiliser l’API Aero Peek. Ma “recherche” a été faite en 2008, alors que Windows 7 était encore en version bêta et que les versions de prévisualisation qui avaient été divulguées étaient répandues. Pour ceux qui pourraient se moquer, ce code devrait également fonctionner dans Windows 8. Voici un exemple simple:

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

    Ce code est indépendant du processeur, comstackz-le comme vous le souhaitez et cela fonctionnera toujours. Win32 et x64 sont les bienvenus.

    pouvez-vous préciser ce que vous essayez de faire? Est-ce que vous essayez d’invoquer un peek ou de prendre en charge un coup d’oeil personnalisé Aero dans votre propre application?

    si ce dernier vous devez vous référer à http://msdn.microsoft.com/en-us/library/ff819048(v=VS.85).aspx et à la documentation associée.

    J’ai une mauvaise nouvelle pour tous ceux qui utilisent cette fonction non documentée. Windows 10 semble avoir ajouté un argument supplémentaire à la fin. Cela signifie probablement que votre code qui fonctionne correctement sous Win7 va probablement tomber sous Win10, car le pointeur de la stack va se vider après avoir appelé cette fonction. De plus, il est possible que l’appel de cette fonction avec un argument de stack manquant entraîne un déréf de Win10 lors de l’appel lui-même.

    J’ai utilisé la définition suivante.

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

    J’ai simplement passé zéro dans ce nouvel argument. En cours d’exécution du code 64 bits sous Win10 64 bits, j’ai pu activer Aero Peek en utilisant les arguments décrits dans les autres réponses de cette page. En cours d’exécution code 32bit sous Win10 64bit, j’ai eu la même erreur 0x80070018 que j’ai reçue lors de l’exécution du code 32bit sous Win7 64bit.