我需要确保explorer.exe
作为系统shell运行。我需要做的是:
Winlogon\Shell
explorer.exe
)
explorer.exe
(作为shell)在最后两个步骤之间是一场比赛:
所以问题是,是否有任何事件/互斥/回调我可以调用以确保将资源管理器初始化为shell?
我设法做的最好的事情是等待托盘窗口,如:
while(!FindWindow("Shell_TrayWnd", NULL)) {
sleep(250);
}
这似乎有点草率,有更好的方法吗?
答案 0 :(得分:6)
我甚至不会尝试这样做。您应该创建一个新的winsta0桌面(Win32 API CreateDesktop),在该桌面上启动Kiosk应用程序并切换到它。这样您就可以单独保留默认桌面,运行资源管理器,如果需要,可以返回它。在我们建立的自助服务亭项目中,我们取得了很大的成功。
答案 1 :(得分:3)
更好的方法(如实际记录的那样)是创建顶级窗口并等待“TaskbarCreated”广播。这样你也可以摆脱Sleep()调用。
广播记录为here。
答案 2 :(得分:0)
您还没有解释为什么需要3个步骤,“kiosk软件”不是解释。
您是否尝试过简单地在system.ini中设置shell,如litestep和其他桌面替换软件?如果您必须来回切换,请考虑为此任务编写的ShellOn或LiteSpawn等shell切换器。
答案 3 :(得分:-1)
为什么不观看正在运行的进程? 在步骤1之前,不应列出explorer.exe,因为它不是默认shell。 第2步,你启动它并观察过程,一旦可用,你就会改变。
我不确定您是否使用.NET框架,但如果您是StartInfo类的事件应该足以满足您的需求。