编辑 :我解释了我的问题,请忽略下面的所有评论(截至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可能已经完成启动。