Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Windows 8.1. Как переключиться на Desktop программно

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

KDPoid



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Windows 8.1
Пользователь сидит в полноэкранном метрогуёвом приложении.
Например, в калькуляторе
 
Где-то там в фоне, моя программа, какой-нибудь будильник-отслеживатель, успешно отслеживает наступление события и выдаёт на экран предупреждение.
 
Если будильник был на десктопе скрыт, и его окно появляется или всплывает поверх других окон, то происходит переключение на desktop и всё хорошо.
 
А если будильник на десктопе уже висел поверх остальных окон, то Windows не считает нужным отвлекать пользователя от созерцания его метрогуёвого калькулятора и никуда не преключается.
 
Как программно вызвать переключение на desktop ?

Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 07:14 17-07-2015
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Метра не имею, но первое, что теоретически входит в голову- если будильник в самом верху, при евенте сначала положить его вниз с SetWindowPos(..., HWND_BOTTOM, ...);

Всего записей: 1570 | Зарегистр. 01-11-2004 | Отправлено: 07:56 17-07-2015
ziesto

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно эмулировать нажатие клавиши Win

Всего записей: 77 | Зарегистр. 16-07-2011 | Отправлено: 11:40 19-07-2015
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да, это работает:

Код:
const IID g_clsid = {0x7e5fe3d9,0x985f,0x4908,0x91,0xf9,0xee,0x19,0xf9,0xfd,0x15,0x14};
const IID g_riid  = {0x2246EA2D,0xCAEA,0x4444,0xA3,0xC4,0x6D,0xE8,0x27,0xE4,0x43,0x13};
///////////////////////////////////////////////////////////////////////////////////////////////////////
void toTop(HWND hDlg)
{
    int i, idTop, idSelf;
    IAppVisibility* p;
    INPUT inp;
    
    if(0x0601 < _byteswap_ushort(GetVersion())) // ver > Win7 ?
    {
        CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
        if(!CoCreateInstance(&g_clsid, 0, CLSCTX_INPROC_SERVER, &g_riid, (void**)&p))
        {
            p->lpVtbl->IsLauncherVisible(p, &i);
            p->lpVtbl->Release(p);
            if(i)                                //are we in Metro?
            {
                inp.type = INPUT_KEYBOARD;
                inp.ki.wVk = VK_LWIN;
                inp.ki.wScan = MapVirtualKey(VK_LWIN, 0);
                inp.ki.time = 0;
                inp.ki.dwExtraInfo = 0;
                inp.ki.dwFlags = KEYEVENTF_EXTENDEDKEY;        
                SendInput(1, &inp, sizeof(inp));    //Win key down
 
                inp.ki.dwFlags |= KEYEVENTF_KEYUP;
                SendInput(1, &inp, sizeof(inp));    //Win key up
            }
        }
        CoUninitialize();
    }
 
    if(IsIconic(hDlg))                                //are we in a tray?
    {
        ShowWindow(hDlg, SW_RESTORE);
        UpdateWindow(hDlg);
    }
 
    idTop = GetWindowThreadProcessId(GetForegroundWindow(), 0);
    idSelf = GetWindowThreadProcessId(hDlg, 0);
    if(idTop != idSelf)                                //are we on the top already?
    {
        AttachThreadInput(idTop, idSelf, 1);
        BringWindowToTop(hDlg);
        AttachThreadInput(idTop, idSelf, 0);
    }
}

Всего записей: 1570 | Зарегистр. 01-11-2004 | Отправлено: 10:37 23-07-2015
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Windows 8.1. Как переключиться на Desktop программно


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru