forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Разница между запуском из студии и виндой. Потеря функционала. (http://forum.boolean.name/showthread.php?t=17785)

Varg Vikernes 24.01.2013 01:58

Разница между запуском из студии и виндой. Потеря функционала.
 
Итак, проблема такова: есть проект, который замечательно работает при нажатии 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 от запуска непосредственно из винды? как мне исправить данное недоразумение?
Заранее благодарен.

Platon 24.01.2013 09:39

Ответ: Разница между запуском из студии и виндой. Потеря функционала.
 
Попробуй вместо этого BringWindowToTop, или SetWindowPos с Z-order HWND_TOPMOST

Varg Vikernes 24.01.2013 11:46

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

Varg Vikernes 24.01.2013 12:40

Ответ: Разница между запуском из студии и виндой. Потеря функционала.
 
вот это происходит при запуске вручную моей программы (не из студии) при неудачном выводе окна наверх(когда окно по каким-то причинам не выводится):

Цитата:

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.
В чем же может быть причина? :wallbash:

MSDN говорит:
Цитата:

The calling thread must be able to change the foreground window, otherwise the call fails.
Но как мне узнать, способен ли поток изменить окно переднего плана?

MiXaeL 24.01.2013 14:27

Ответ: Разница между запуском из студии и виндой. Потеря функционала.
 
*пальцем в небо*
запуск скомпилированной программы от имени администратора не меняет дело?

Varg Vikernes 24.01.2013 14:59

Ответ: Разница между запуском из студии и виндой. Потеря функционала.
 
Итак, внимание. Для всех, кто когда-либо будет искать что-то подобное (большинство примеров в сети почему-то не работают)

Код:

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-последовательности.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot