Как сделать окно «всегда внизу» - PullRequest
6 голосов
/ 09 февраля 2009

Кто-нибудь знает, как сделать «всегда внизу» или окно, прикрепленное к рабочему столу? Он должен получать фокус и щелчки мыши, но должен оставаться в нижней части Z-порядка. Было бы также неплохо, если бы он мог оставаться на рабочем столе, даже если пользователь выполняет минимизацию всех или показывает операции на рабочем столе.

И решения Delphi, и C # (или частичные решения / подсказки) были бы хорошими.

Ответы [ 3 ]

12 голосов
/ 09 февраля 2009

Предупреждение Было предложено сделать это, вызвав SetParent и установив окно, являющееся дочерним элементом рабочего стола. Если вы сделаете это, вы заставите Win32 Window Manager объединить очередь ввода рабочего стола с вашим дочерним окном, это плохо - Раймонд Чен объясняет почему.

Кроме того, имейте в виду, что вызов SetWindowPos с HWND_BOTTOM является неполным. Это нужно делать всякий раз, когда ваше окно меняется на zorder. Обработайте событие WM_WINDOWPOSCHANGING, посмотрите SWP_NOZORDER для получения дополнительной информации.

8 голосов
/ 09 февраля 2009

SetWindowPos может сделать окна AlwaysOnTop. Скорее всего, это может дать противоположный результат. Попробуйте что-то вроде этого:

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

Примечание:

  • Не проверял этот подход (для того, чтобы окна всегда были внизу)
  • Если это сработает, то, скорее всего, операция show desktop будет скрывать окно. Так что, возможно, вам стоит углубиться в этот «красивый» API.

РЕДАКТИРОВАТЬ: закончил поиск по этим строкам, чтобы убедиться, что он справится, и нашел что-то интересное - дубликат .

1 голос
/ 25 февраля 2013

Вот решение для окна ATL. Если вы можете обратиться к c #, это поможет вам.


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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...