Как я могу вывести окно на передний план в Vista, используя C ++? - PullRequest
2 голосов
/ 11 февраля 2009

У меня есть кусок кода, который выводит окно под курсором на передний план, используя API SetForegroundWindow для WinXP. Я тестировал его для Vista, но API, похоже, больше не выполняет свою работу правильно.

AllowSetForeground не помогло, мой процесс является фоновым процессом.

Что я могу использовать для этого?

Ответы [ 7 ]

7 голосов
/ 11 февраля 2009

Попробуйте следующий код и посмотрите, работает ли он для вас:

SetWindowPos(WndHandle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);
SetWindowPos(WndHandle,HWND_NOTOPMOST,0,0,0,0,SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
2 голосов
/ 11 февраля 2009

Просто предупреждение: для этого был общедоступный API (SetForegroundWindow), теперь он больше не выводит окно на передний план.

Теперь окно просто мигает.

Но это было по причине. Приложения, которые «крадут» фокус из текущего окна (часто без веской причины) и могут привести к всевозможным проблемам.

Поэтому, прежде чем пытаться обойти защиту, установленную ОС, от такого поведения, убедитесь, что вы не раздражаете своих пользователей. Задайте себе вопрос: «Действительно ли мне нужно прыгать в лицо моему пользователю, даже если мое приложение находится в фоновом режиме?»

1 голос
/ 16 сентября 2010

При использовании MFC это работало для меня в Windows 7 x64:

    RECT rc;
    m_pMainWnd->GetWindowRect(&rc);

    int nBoxWidth = rc.left-rc.right;
    int nBoxHeight = rc.bottom-rc.top;
    int nBoxTop = rc.top;
    int nBoxLeft = rc.left;

    SetWindowPos(m_pMainWnd->GetSafeHwnd(), HWND_TOPMOST,
                    nBoxLeft, nBoxTop, nBoxWidth, nBoxHeight,
                    SWP_NOMOVE || SWP_NOSIZE);
    SetWindowPos(m_pMainWnd->GetSafeHwnd(), HWND_NOTOPMOST,
                    nBoxLeft, nBoxTop, nBoxWidth, nBoxHeight,
                    SWP_SHOWWINDOW || SWP_NOMOVE || SWP_NOSIZE);
1 голос
/ 11 февраля 2009

Если SetForegroundWindow() не удалось, вы попытались установить окно WS_EX_TOPMOST, а затем сразу же после начала вызова SetForegroundWindow()?

.

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

0 голосов
/ 02 апреля 2014

Установка текущей нити в спящем режиме сделала это для меня, вместе с установкой его на не верхний уровень ранее:

OS.SetWindowPos(handle, OS.HWND_NOTOPMOST, 0, 0, 0, 0, OS.SWP_NOMOVE | OS.SWP_NOSIZE);
try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    LOG.error("sleeping thread was interrupted", e);
}
OS.SetWindowPos(handle, OS.HWND_TOPMOST, 0, 0, 0, 0, OS.SWP_NOMOVE | OS.SWP_NOSIZE);
0 голосов
/ 14 апреля 2011

используйте программу настройки Windows Powertoys для изменения состояния разрешения для фокуса.

выберите «общие», затем «фокус», а затем снимите флажок, позволяющий другим программам сфокусироваться.

Это работает, когда кажется, что все предложения не работают, (на самом деле все они работают).

Microsoft в своей бесконечной мудрости решила, что ответ на вызовы setforegrondwindow и т. Д. И т. Д. Теперь будет нулевым.

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

наслаждаться .....

0 голосов
/ 11 февраля 2009
VOID SwitchToThisWindow(HWND hWnd, BOOL fAltTab);

Работает от XP до Windows 7 http://msdn.microsoft.com/en-us/library/ms633553.aspx

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