|
24.01.2013, 01:58
|
#1
|
AnyKey`щик
Регистрация: 03.03.2012
Сообщений: 15
Написано 0 полезных сообщений (для 0 пользователей)
|
Разница между запуском из студии и виндой. Потеря функционала.
Итак, проблема такова: есть проект, который замечательно работает при нажатии F5 в студии. При компиляции в релиз-режиме и запуске exe-файла отдельно, функционал частично падает. Ожидания: пользователь нажимает кнопку, поверх всех окон вылазит мое окно с нужной информацей.
Запуск их студии: все работает замечательно.
Запуск вручную в папке: окно выводится ЗА уже открытыми окнами.
Читал про SPI_FOREGROUNDLOCKTIMEOUT, так и сделал:
void MakeForeground(HWND hWnd)
{
DWORD dwTimeout;
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &dwTimeout, 0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0);
SetForegroundWindow(hWnd);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)dwTimeout, 0);
}
Итак, вопрос: чем отличается запуск в visual studio от запуска непосредственно из винды? как мне исправить данное недоразумение?
Заранее благодарен.
|
(Offline)
|
|
24.01.2013, 09:39
|
#2
|
Знающий
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений (для 70 пользователей)
|
Ответ: Разница между запуском из студии и виндой. Потеря функционала.
Попробуй вместо этого BringWindowToTop, или SetWindowPos с Z-order HWND_TOPMOST
|
(Offline)
|
|
24.01.2013, 11:46
|
#3
|
AnyKey`щик
Регистрация: 03.03.2012
Сообщений: 15
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Разница между запуском из студии и виндой. Потеря функционала.
HWND_TOPMOST не пригоден, т.к. все дочерние окна тоже становятся топмост и поверх них ничего не отображается. Нет, мне нужно именно переместить окно наверх z-последовательности, просто переместить и отобразить поверх остальных окон. И желательно разобраться, почему при запуске студии результат один, а при ручном запуске - другой.
|
(Offline)
|
|
24.01.2013, 12:40
|
#4
|
AnyKey`щик
Регистрация: 03.03.2012
Сообщений: 15
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Разница между запуском из студии и виндой. Потеря функционала.
вот это происходит при запуске вручную моей программы (не из студии) при неудачном выводе окна наверх(когда окно по каким-то причинам не выводится):
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &dwTimeout, 0); //true
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0);//false
SetForegroundWindow(hWnd);//false
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)dwTimeout, 0);//false
|
Как видим, функции возвращают false. они ведут себя странно - казалось бы, однотипные функции. Параметры получает, а устанавливать не хочет. В студии все идеально, ошибок нет, возвращаемые значения - true.
В чем же может быть причина?
MSDN говорит:
The calling thread must be able to change the foreground window, otherwise the call fails.
|
Но как мне узнать, способен ли поток изменить окно переднего плана?
|
(Offline)
|
|
24.01.2013, 14:27
|
#5
|
Бывалый
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений (для 267 пользователей)
|
Ответ: Разница между запуском из студии и виндой. Потеря функционала.
*пальцем в небо*
запуск скомпилированной программы от имени администратора не меняет дело?
|
(Offline)
|
|
24.01.2013, 14:59
|
#6
|
AnyKey`щик
Регистрация: 03.03.2012
Сообщений: 15
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Разница между запуском из студии и виндой. Потеря функционала.
Итак, внимание. Для всех, кто когда-либо будет искать что-то подобное (большинство примеров в сети почему-то не работают)
void MakeForeground(HWND hWnd) //целевое окно, которое переносим наверх
{
HWND hCurrWnd;
int iMyTID;
int iCurrTID;
hCurrWnd = GetForegroundWindow();
iMyTID = GetCurrentThreadId();
iCurrTID = GetWindowThreadProcessId(hCurrWnd,0);
AttachThreadInput(iMyTID, iCurrTID, TRUE);
SetForegroundWindow(hWnd);
SetWindowPos(hWnd,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
AttachThreadInput(iMyTID, iCurrTID, FALSE);
}
При разборе читать ремарксы к SetForegroundWindow
Теги для поиска: z-order, z-последовательность, BringWindowToTop, наверх z-последовательности.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:27.
|