Не удается активировать окно

 
0
 
C++
ava
WinDev | 08.11.2011, 19:08
Не удается активировать окно с помощью функции SetActiveWindow().

Цитата (MSDN)
The SetActiveWindow function activates a window. The window must be attached to the calling thread's message queue.

Цитата (MSDN)
By using the AttachThreadInput function, a thread can attach its input processing to another thread. This allows a thread to call SetActiveWindow to activate a window attached to another thread's message queue.


Имеется окно под многими остальными на рабочем столе. Задача - вывести его "наверх" и активировать.

Следующий код не работает:


DWORD idAttach = GetWindowThreadProcessId(hwnd, &pid);
DWORD idAttachTo = GetCurrentThreadId();
bRes = AttachThreadInput(idAttach, idAttachTo, TRUE);

HWND hWndPrev = SetActiveWindow(hwnd);
AttachThreadInput(idAttach, idAttachTo, FALSE);


Правильный ли код? Если да, то почему он не работает?
Ответы (15)
ava
WinDev | 08.11.2011, 18:56 #
UPD: Случайно заметил, что в режиме Debug вышеприведенный код работает.. , баг Visual Studio?..
ava
vol4ek | 08.11.2011, 19:09 #
нет, не баг. У конфигураций Release и Debug разные настройки. Release для создания окончательного модуля, Debug отладочная. Причина в коде.
ava
WinDev | 08.11.2011, 19:20 #
А что не так в коде?
ava
vol4ek | 08.11.2011, 19:38 #
покажи весь.
ava
WinDev | 08.11.2011, 19:41 #
Зачем? Задавайте вопросы - отвечу.
ava
vol4ek | 08.11.2011, 19:53 #
у тебя там сишного кода нет? у меня как-то была прога на 3-х языках. C, C++ и модули ассемблерные в придачу. так в debug нормально собиралось, а Release тьму ошибок давал.

Добавлено позднее:
или устаревший код.
ava
WinDev | 08.11.2011, 20:03 #
Давайте может будем исходить из специфики отличий разных видов сборок - debug и release. А то гадать здесь - это как иголку в стоге сена искать. Весь код скидывать я бы не хотел.. Программа написана с использованием MFC.
ava
vol4ek | 08.11.2011, 20:09 #
какие ошибки выдает?
ava
WinDev | 08.11.2011, 20:10 #
Никаких.

UPD: возникла идея, что при запуске из отладчика GetCurrentThreadId возвращает одно, а при запуске "самостоятельного" приложения - другое. Так ли это?


P.S. Может как-то можно обойти проблему использованием другой функции?
ava
Lols | 08.11.2011, 21:23 #
Не работает и при этом не выдает ошибок. И это только в Release?
ava
WinDev | 08.11.2011, 21:33 #
Программа работает в Release, просто не выносит окно на топ.
ava
500mhz | 08.11.2011, 21:33 #
а может все таки SetForegroundWindow ?
ava
WinDev | 08.11.2011, 21:38 #
Просто мигает в трее и все, если использовать только SetForegroundWindow()
ava
Albor | 11.11.2011, 09:35 #
Посмотри в сторону GetLastError() и FormatMessage(). Не плохо бы проверять возвращаемое значение (м.б. в фрагменте кода это просто не показано). Во всяком случае, можно попытаться локализовать место ошибки выбросом MessageBox-ов, если функция вернула что-то не то, а не гадать.
ava
Dem_max | 15.11.2011, 14:59 #
SetWindowPos(, HWND_TOP,,,, SWP_NOMOVE | SWP_NOSIZE);
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  Dem_max   500mhz   Albor   WinDev   vol4ek   Lols
advanced
Отправить