如何以编程方式检测时,OS已经加载完成其所有的应用程序\\服务?(How to detect pro

2019-07-29 04:33发布

编辑 :我转述我的问题,请忽略所有下面的意见(最多5月7日)。

首先,我会尽力解释这个问题:
我的过程是试图展示编程方式使用ITrayDeskBand :: ShowDeskBand一个Deskband。
它在任何时候除了OS加载所有的流程时(复位或注销后)的伟大工程。

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

如果鼠标光标设置为等待和进程在该时间后运行,调用将失败。
但是,如果我的进程等待几秒钟(即时间光标变成常规后),然后调用调用,一切都很正常。

这种行为是在Windows 7和Windows Vista转载两者。

所以基本上我要问的是:

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

起初,我以为探险家没有正确加载,所以我已经使用WaitForInputIdle但它不是。

后来我想,忙光标表示CPU是很忙,所以我一直在使用我的创建过程IDLE_PRIORITY_CLASS但未收到空闲时间,同时光标很忙。

Answer 1:

视窗从未停止加载应用程序和/或服务!

作为事实上,应用程序来来去去,其中的一些交互其中的一些无需任何用户交互。 即使服务在不同的时间点加载(取决于其设置和外部条件 - 例如,只有当OS检测到Smard卡设备已连接Smard卡资源管理服务可能会启动)。 应用程序可以(但不得)自动停止,做一些服务。

谁也不知道,当Windows已经停止加载所有应用程序和/或服务。



Answer 2:

如果ITrayDeskBand::ShowDeskBand失败,那么等待TaskbarCreated消息,然后再试一次。 (这是由通知图标所用的相同的技术。)



Answer 3:

最明显的办法是检查是否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。 相关资源ID列在文章中的GetIconInfo 。

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

我建议你检查游标类型的第二十倍。 当你看到箭头光标在一排(即一个完整的第二个)的十倍,很可能Explorer已经完成启动。



文章来源: How to detect programmatically when the OS has done loading all of its applications\\services?