如何在OS完​​成加载所有应用程序\服务时以编程方式进行检测?

编辑 :我解释了我的问题,请忽略下面的所有评论(截至5月7日)。

首先,我会试着解释一下这个问题:
我的过程试图以编程方式使用ITrayDeskBand :: ShowDeskBand来显示Deskband。
除了操作系统正在加载所有进程(复位或注销之后)以外,它在任何时候都可以工作。

Windows启动并开始加载各种应用程序\服务后,鼠标光标被设置为等待几秒钟(取决于有多less应用程序正在运行\有多快)。

如果鼠标光标设置为等待,并且在此期间进程正在运行,则调用将失败。
但是,如果我的进程等待几秒钟(在此之后光标变为正常),然后调用该调用,一切都很好。

这一行为在Windows 7和Windows Vista上都得到了重现。

所以基本上我问的是:

1)基本知识,当光标被设置为繁忙时,OS做什么?
2)更重要的问题:如何在程序结束时以编程方式检测?

起初,我以为浏览器没有正确加载,所以我用WaitForInputIdle,但它不是。

后来我以为忙光标表示CPU很忙,所以我用IDLE_PRIORITY_CLASS创build了我的进程,但在光标忙的时候收到了空闲时间。

Windows永远不会停止加载应用程序和/或服务!

事实上,应用程序来来往往,其中一些交互式的这些​​没有任何用户交互。 偶服务在不同的时间点被加载(取决于他们的设置和外部条件 – 例如,Smard卡资源管理器服务可能仅在操作系统检测到Smard卡设备已经连接时才启动)。 应用程序可以(但不能)自动停止,所以做一些服务。

人们永远不知道Windows何时停止加载所有应用程序和/或服务。

如果ITrayDeskBand::ShowDeskBand失败,请等待TaskbarCreated消息,然后重试。 (这与通知图标使用的技术相同。)

明显的方法是检查ShowDeskband是否工作,如果没有,几秒钟后重试。 我假设你已经考虑并拒绝了这个选项。

既然你似乎已经缩小了光标所显示的标准,那么等待你想要的特定光标又如何呢? 你可以找到这样的游标:

 CURSORINFO cinfo; ICONINFOEX info; cinfo.cbSize = sizeof(cinfo); if (!GetCursorInfo(&cinfo)) fail(); info.cbSize = sizeof(info); if (!GetIconInfoEx(cinfo.hCursor, &info)) fail(); printf("szModName = %ws\n", info.szModName); printf("wResID = %u\n", info.wResID); 

大多数简单的游标都在USER32模块中。 GetIconInfo文章中列出了相关的资源ID。

你显然希望等待标准的箭头光标出现。 这在模块USER32中,资源ID是32512(IDC_ARROW)。

我建议你检查光标类型每秒十次。 当你连续看十次箭头光标(即一整秒)时,Explorer可能已经完成启动。