【问题标题】:"Preparing Your Desktop" interferes with Windows 7 GUI?“准备您的桌面”会干扰 Windows 7 GUI?
【发布时间】:2014-08-24 18:19:08
【问题描述】:

我有一个 .NET 程序(针对 3.5 客户端配置文件),它创建一个新的管理员帐户,重新启动,然后使用 AutoAdminLogon 注册表值自动以该帐户登录。在重新启动之前,它将 RunOnce 设置为在启动时再次运行。一旦计算机重新启动并登录,该程序应该隐藏 Start Orb 和任务栏并进入全屏模式。

问题是在重新启动时出现“正在准备您的桌面”的消息,据说是针对新创建的管理员帐户。我的程序继续在后台运行,但是当“准备桌面”屏幕完成时,任务栏和 Start Orb 并未隐藏。为什么会这样?以后每次重新启动时,任务栏和 Start Orb 都会正确隐藏,但“正在准备您的桌面”屏幕不会再次出现。

我正在使用这种方法隐藏任务栏并启动Orb:

IntPtr hwnd = FindWindow("Shell_TrayWnd", "");
ShowWindow(hwnd, SW_HIDE);
IntPtr orb = FindWindowEx(IntPtr.Zero, IntPtr.Zero, (IntPtr)0xC017, null);
ShowWindow(orb, SW_HIDE);

FindWindow、ShowWindow 和 FindWindowEx 方法在 win32.dll 中。

所以我想我的最后一个问题是:“准备桌面”屏幕是否会以某种方式阻止显示或隐藏 Windows UI 元素?例如,如果 UI 甚至没有被创建以便显示或隐藏,我怎么能等到加载屏幕完成然后运行我的程序?

【问题讨论】:

  • 如果您不想要任务栏或开始按钮,那您为什么还要费心运行资源管理器呢?这就像买了一个芝士汉堡,然后抱怨很难把所有的奶酪都摘下来。
  • 不允许 Explorer 运行会对需要显示的 .NET GUI 产生任何不利影响吗?如果不是这样可以解决我的问题。
  • 只有你可以说你的程序是否依赖于 Explorer。从描述中听起来你有一个信息亭程序,在这种情况下你应该做类似信息亭的事情。 Explorer 不支持以这种方式操作其窗口。
  • 好的。看来我必须研究如何在 Explorer 之外做一些事情才能做到这一点。

标签: .net winapi windows-7 startup


【解决方案1】:

我的心理调试技能告诉我,FindWindow 失败是因为在“准备桌面”时没有找到Shell_TrayWnd。这将使第一个 ShowWindow 失败,FindWindowEx 和该句柄上的后续 ShowWindow 也会失败。

您应该始终测试所有 API 调用的返回值,然后才假设它们有效并盲目地继续执行您的代码。例如,FindWindow 的文档说如果失败,则返回值为NULL

返回值

类型:

类型:HWND

如果函数成功,则返回值是具有指定类名和窗口名的窗口句柄。

如果函数失败,返回值为NULL。要获取扩展错误信息,请调用 GetLastError。

【讨论】:

  • 明白了,这就是实际代码中存在错误检查的原因。还有为什么我问的第二个问题与您关于“Shell_TrayWnd”尚不存在的观点有关。我只是将代码放在 while 循环中检查 null,但我不确定这会如何影响 Windows 启动过程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 2021-02-24
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
相关资源
最近更新 更多