Подключитесь к событию Win32 API, чтобы получать уведомления, когда рабочий стол полностью загружается

Представьте себе сценарий, когда пользователь вошел в систему и, не выходя из системы, переключается на другого пользователя. Потом переключается обратно. При обратном переключении (потому что мы никогда не выходили из системы) Windows сначала отображает черный рабочий стол, затем немного мерцает окно (особенно с 2 мониторами), а затем, наконец, перестраивает все в состояние, в котором мы остановились. Это мерцание и перестановка занимает некоторое время (примерно 1 секунду).

Какой самый эффективный способ получить уведомление о полной загрузке рабочего стола? Мне это нужно, потому что я хочу вызвать свою конкретную функцию, когда рабочий стол полностью загружен.

Один из вариантов — подключиться к WM_PAINT, но я использовал Spy++ и получил 12 событий WM_PAINT на рабочем столе, так что это ненадежно. Кто-нибудь знает другой способ?


person aalimian    schedule 04.11.2014    source источник
comment
Я бы рекомендовал использовать трассировку API / ETW и наблюдать за передаваемыми сообщениями. Кроме того, существуют API специально для взаимодействие с созданием/переключением рабочих столов и их подключение   -  person Jake H    schedule 05.11.2014
comment
@JakeHeidt, на самом деле я просто пробовал OpenInputDesktop. Дело в том, что рабочий стол готов к вводу, но окна так и не устроены. У меня есть функция дублирования отображения, которую мне нужно вызвать, когда все на рабочем столе будет устроено. Если я назову это раньше, дублирование дисплея не сработает. Если ставлю Сон на 2 секунды, то работает. Дело в том, что пока он мерцает, он уже принимает ввод, поэтому эта функция успешно возвращается.   -  person aalimian    schedule 05.11.2014
comment
@JakeHeidt DwmFlush() из DWM API прекрасно сработал в этом случае.   -  person aalimian    schedule 20.11.2014


Ответы (1)


Нашел гораздо более простое решение. Вызов DwmFlush(). Эта функция является частью Windows DWM API.

Вот пример кода, который я тестировал, и он действительно работал с быстрым переключением пользователей в Windows 8.1:

while (true)
{
    HRESULT hr = DwmFlush();

    if (hr == S_OK)
    {
        std::cout << "TRUE" << std::endl;
    }
    else
    {
        std::cout << "FALSE" << std::endl;
    }

    Sleep(1000);

}
person aalimian    schedule 08.11.2014