3

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

首先,我将尝试解释问题:
我的过程正在尝试使用 ITrayDeskBand::ShowDeskBand 以编程方式显示 Deskband。
它在任何时候都可以很好地工作,除非操作系统正在加载其所有进程(在重置或注销之后)。

Windows 启动并开始加载各种应用程序\服务后,鼠标光标设置为等待几秒钟(取决于正在运行的应用程序数量\一切的速度)。

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

此行为在 Windows 7 和 Windows Vista 上都重现。

所以基本上我要问的是:

1)只是为了基础知识,当光标设置为忙时操作系统会做什么?
2)更重要的问题:当这个过程结束时,我如何以编程方式检测?

起初,我认为资源管理器没有正确加载,所以我使用了 WaitForInputIdle但事实并非如此。

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

4

3 回答 3

5

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

于 2012-05-09T02:16:52.600 回答
5

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

事实上,应用程序来来去去,其中一些是交互的,其中一些没有任何用户交互。甚至服务在不同的时间点加载(取决于它们的设置和外部条件 - 例如,智能卡资源管理器服务可能仅在操作系统检测到智能卡设备已连接时启动)。应用程序可以(但不能)自动停止,某些服务也是如此。

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

于 2012-05-08T11:57:41.430 回答
1

显而易见的方法是检查 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 很可能已完成启动。

于 2012-05-09T02:05:43.777 回答