Как держать мое верхнее окно сверху? - PullRequest
5 голосов
/ 18 июня 2010

Сначала я объясню, зачем мне это нужно, потому что я ожидаю, что первым ответом будет «Зачем вам это нужно?». Я хочу определить, когда курсор мыши находится на краю экрана, и я не хочу использовать хуки. Поэтому я создал невидимое окно TOPMOST шириной в один пиксель.

Я использую C ++ в Win XP, поэтому при создании окна (CreateWindowEx (WS_EX_TOPMOST | WS_EX_TRANSPARENT ...) все работает нормально.

К сожалению, если пользователь перемещает другое самое верхнее окно, например панель задач над моим окном, я не получаю движения мыши.

Я пытался решить эту проблему аналогично подходам, предложенным в: Как сохранить окно MDI всегда сверху

Сначала я попытался проверить Z-порядок моего верхнего окна в WM_WINDOWPOSCHANGED с помощью

case WM_WINDOWPOSCHANGED :
    WINDOWPOS* pWP = (WINDOWPOS*)lParam;

все же pWP-> hwnd указывает на мое окно, а pWP-> hwndInsertAfter равно 0, что должно означать, что мое окно находится на вершине Z, даже если оно закрыто панелью задач. Тогда я попробовал:

case WM_WINDOWPOSCHANGED :
    HWND topWndHndl = GetNextWindow(myHandle, GW_HWNDPREV)
    GetWindowText(topWndHndl, pszMem, cTxtLen + 1);

и я всегда получу, что окно "IME по умолчанию" находится в верхней части моего окна. Даже если попытаться вывести мое окно наверх с помощью SetWindowPos () или BringWindowToTop (), «IME по умолчанию» остается наверху. Я не знаю, что такое «IME по умолчанию» и как определить, находится ли панель задач поверх моего окна.

Итак, мой вопрос: как определить, что мое верхнее окно больше не является верхним верхним окном и как сохранить его сверху?

P.S. Я знаю, что подход "грубой силы", состоящий в том, чтобы периодически выводить мое окно наверх, работает, но уродлив и может иметь некоторый нежелательный вывод, например, в окне уведомлений. (Если поднять окно вверх, окно уведомлений будет скрыто.)

Спасибо за ваше время и предложения!

1 Ответ

8 голосов
/ 18 июня 2010

TopMost, это всегда сложная вещь.Нет никакого способа переопределить другое окно, которое определяет себя как TopMost.

У Раймонда Чена есть хорошая статья на эту тему.

Также дубликат this .

...