Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 24.01.2013, 01:58   #1
Varg Vikernes
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
Platon
Знающий
 
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений
(для 70 пользователей)
Ответ: Разница между запуском из студии и виндой. Потеря функционала.

Попробуй вместо этого BringWindowToTop, или SetWindowPos с Z-order HWND_TOPMOST
(Offline)
 
Ответить с цитированием
Старый 24.01.2013, 11:46   #3
Varg Vikernes
AnyKey`щик
 
Регистрация: 03.03.2012
Сообщений: 15
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Разница между запуском из студии и виндой. Потеря функционала.

HWND_TOPMOST не пригоден, т.к. все дочерние окна тоже становятся топмост и поверх них ничего не отображается. Нет, мне нужно именно переместить окно наверх z-последовательности, просто переместить и отобразить поверх остальных окон. И желательно разобраться, почему при запуске студии результат один, а при ручном запуске - другой.
(Offline)
 
Ответить с цитированием
Старый 24.01.2013, 12:40   #4
Varg Vikernes
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
MiXaeL
Бывалый
 
Аватар для MiXaeL
 
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений
(для 267 пользователей)
Ответ: Разница между запуском из студии и виндой. Потеря функционала.

*пальцем в небо*
запуск скомпилированной программы от имени администратора не меняет дело?
(Offline)
 
Ответить с цитированием
Старый 24.01.2013, 14:59   #6
Varg Vikernes
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)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 08:27.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com