Cómo hacer ‘siempre-en-abajo’-ventana

¿Alguien sabe cómo hacer una ventana “siempre en la base”, o una ventana en el escritorio? Debería recibir el foco y los clics del mouse, pero debería permanecer al final del orden Z. También sería genial si pudiera permanecer en el escritorio incluso cuando el usuario minimiza todo o muestra la operación del escritorio.

Las soluciones delphi y c # (o soluciones / sugerencias parciales) serían geniales.

Advertencia Se sugirió que puede lograr esto llamando a SetParent y configurando la ventana para que sea un elemento secundario del escritorio. Si hace esto, hace que Win32 Window Manager combine la cola de entrada del escritorio con su ventana secundaria, esto es algo malo : Raymond Chen explica por qué.

Además, tenga en cuenta que llamar a SetWindowPos con HWND_BOTTOM está incompleto. Debe hacer esto siempre que su ventana esté cambiando zorder. Maneje el evento WM_WINDOWPOSCHANGING, mire SWP_NOZORDER para obtener más información.

SetWindowPos puede hacer que las ventanas sean AlwaysOnTop. Lo más probable es que pueda dar el resultado opuesto. Pruebe algo en esta línea:

[DllImport("user32.dll")] static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); public const uint SWP_NOSIZE = 0x0001; public const uint SWP_NOMOVE = 0x0002; public const uint SWP_NOACTIVATE = 0x0010; public const int HWND_BOTTOM = 1; SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); 

Nota:

  • No he probado este enfoque (para hacer que las ventanas siempre estén abajo)
  • Si resulta que funciona, lo más probable es que la operación de mostrar el escritorio oculte la ventana. Así que tal vez deberías profundizar aún más en esta ‘buena’ API.

EDITAR: Hice algunas búsquedas a lo largo de estas líneas para confirmar si hará el truco y encontró algo interesante: un duplicado .

Aquí hay una solución para la ventana de ATL. Si puedes postularte a c #, te ayudará.


 BEGIN_MSG_MAP(...) ... MESSAGE_HANDLER(WM_WINDOWPOSCHANGING, OnWindowPosChanging) ... END_MSG_MAP() LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (_bStayOnBottom) { auto pwpos = (WINDOWPOS*)lParam; pwpos->hwndInsertAfter = HWND_BOTTOM; pwpos->flags &= (~SWP_NOZORDER); } return 0; }