Windows 钩住Win32 API事件以在桌面完全加载时获得通知

Windows 钩住Win32 API事件以在桌面完全加载时获得通知,windows,winapi,events,dwm,Windows,Winapi,Events,Dwm,想象一个场景,当一个用户登录并且没有注销时,切换到另一个用户。然后切换回。当切换回(因为我们从未注销)时,Windows将首先显示一个黑色桌面,然后进行一些窗口闪烁(特别是使用2个监视器),最后将所有内容重新安排到我们关闭的状态。闪烁和重新排列需要一些时间(大约1秒) 获取桌面已满负载通知的最有效方法是什么?我需要这个,因为我想在桌面完全加载时调用我的特定函数 一个选项是挂钩到WM_-PAINT,但我使用了Spy++并在桌面上获得了12个WM_-PAINT事件,因此这是不可靠的。有人知道另一种方

想象一个场景,当一个用户登录并且没有注销时,切换到另一个用户。然后切换回。当切换回(因为我们从未注销)时,Windows将首先显示一个黑色桌面,然后进行一些窗口闪烁(特别是使用2个监视器),最后将所有内容重新安排到我们关闭的状态。闪烁和重新排列需要一些时间(大约1秒)

获取桌面已满负载通知的最有效方法是什么?我需要这个,因为我想在桌面完全加载时调用我的特定函数


一个选项是挂钩到
WM_-PAINT
,但我使用了Spy++并在桌面上获得了12个
WM_-PAINT
事件,因此这是不可靠的。有人知道另一种方法吗?

找到了一种非常简单的解决方案。对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);

}
while(true)
{
HRESULT hr=DwmFlush();
如果(hr==S_正常)
{

std::我建议使用api跟踪/ETW跟踪并观察传递的消息。除此之外,还有专门针对@JakeHeidt的api,实际上我只是在尝试OpenInputDesktop。问题是桌面已经准备好输入,但窗口还没有安排好。我有显示复制功能当桌面上的一切都安排好后,我需要调用什么。如果我早点调用它,显示复制将不起作用。如果我睡眠2秒钟,它就会起作用。问题是,当它闪烁时,它已经接受输入,因此该函数成功返回。@DWM API中的JakeHeidt DwmFlush()在这种情况下工作得很好。