SwitchToThisWindow отправляет текущее окно обратно - PullRequest
6 голосов
/ 02 февраля 2011

Так что да, я нахожусь в сомнительной ситуации с реализацией вызова SwitchToThisWindow, чтобы заставить мое окно выйти вперед. Я согласен, это не идеал, но не всегда можно спорить с «особенностями» продукта, которые другие считают необходимыми.

Теперь я считаю SwitchToThisWindow победой взлома AttachThreadInput для принудительного переключения окна, поскольку он менее вероятен для тупиковой блокировки, и его следует удалить или прекратить SwitchToThisWindow. функция я не буду жаловаться.

Тем не менее, SwitchToThisWindow имеет неприятный побочный эффект - толкает текущее окно переднего плана к нижней части z-порядка в дополнение к переносу целевого окна наверх, когда FALSE передается для параметра fAltTab, и ничего не делает если ИСТИНА пройдена.

Как можно избежать этого поведения «проталкивающий ток активен до z-дна», не прибегая к AttachThreadInput?

Кроме того, MS может просто удалить AttachThreadInput в качестве жизнеспособного обходного пути, и я могу просто сказать своему менеджеру, что невозможное, на самом деле, фактически невозможно.

Ответы [ 3 ]

6 голосов
/ 02 февраля 2011

Я не знаю, помогает ли это, но единственный способ, которым я нашел надежное доведение своего окна до вершины, - это сделать 2 следующих вызова:

ShowWindow(myhwnd, SW_MINIMIZE);
ShowWindow(myhwnd, SW_RESTORE);

Очевидно, что эти вызовы должны выполняться, когда ваше окно в данный момент не самое верхнее, чтобы избежать мерцания.Но это также не должно иметь побочного эффекта при приближении текущего переднего окна к нижней части z-порядка.

2 голосов
/ 02 февраля 2011

При прохождении fAltTab=FALSE вы фактически эмулируете Alt + Esc. Таким образом, вы можете изменить это изменение z-порядка с помощью SetWindowPos и его hWndInsertAfter после вызова SwitchToThisWindow, но тогда вы вернетесь в безобразную хакерскую страну ИМХО.

Вопрос в том, нужен ли вам фокус клавиатуры?

Позвольте мне предложить другую альтернативу:

  1. Если ваше окно свернуто, восстановите его
  2. Установите ваше окно, чтобы быть самым верхним, когда ваше окно активировано, удалите стиль снова.
  3. Позвоните SetForegroundWindow, чтобы высветить кнопку панели задач (или FlashWindowEx)

Это должно избежать сценария, когда пользователь печатает, и в конечном итоге выполняет какое-то действие в вашем пользовательском интерфейсе, даже не глядя на экран.

Изменить:

HWND hwndFgnd=GetForegroundWindow();
SetWindowPos(hwnd,hwndFgnd,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);
SetWindowPos(hwndFgnd,hwnd,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);

.., вероятно, будет работать, если вы не хотите устанавливать самый верхний бит в любой точке (даже если ваше окно находится в верхней части z-порядка, вы все равно не можете легально получить фокус с помощью SetForegroundWindow )

0 голосов
/ 03 марта 2014

Это плохая проблема, с которой я тоже столкнулся.Смотрите мое решение здесь .Работает как для Show(), так и для ShowDialog().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...