简体   繁体   中英

How to make 'always-on-bottom'-window

Does anybody know how to make a 'always-on-bottom'-windows, or a window pinned to the desktop? It should receive focus and mouseclicks, but should stay at the bottom of the Z-order. It would also be great if it could stay on the desktop even when user do a minimize all or show desktop operation.

Both delphi and c# solutions (or partial solutions/hints) would be great.

Warning It was suggested that you can accomplish this by calling SetParent and setting the window to be a child of the Desktop. If you do this, you cause the Win32 Window Manager to combine the input queue of the Desktop to your child window, this is a bad thing - Raymond Chen explains why.

Also, keep in mind that calling SetWindowPos with HWND_BOTTOM is incomplete. You need to do this whenever your window is changing zorder. Handle the WM_WINDOWPOSCHANGING event, look at SWP_NOZORDER for more info.

SetWindowPos can make windows AlwaysOnTop. Most likely it can give the opposite result. Try something along these lines:

[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);

Note:

  • Haven't tested this approach (for making windows always on bottom)
  • If it happens to work, then most likely the show desktop operation will hide the window. So maybe you should go even deeper into this 'nice' API.

EDIT: Done some searching along these lines to confirm whether it will do the trick and found something interesting - a duplicate .

Here is solution for ATL window. If you can apply to c#, it will help you.


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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM