【问题标题】:Best way to start a "PC booking" application in Windows 7 / Vista?在 Windows 7 / Vista 中启动“PC 预订”应用程序的最佳方式是什么?
【发布时间】:2012-03-07 12:47:56
【问题描述】:

我正在编写一种 PC 预订应用程序(C# 中的客户端),除了当用户登录 PC(Windows 7 / Vista)时我无法尽快启动它之外,一切都已完成,即我想以某种方式覆盖 explorer.exe。

我试图用 explorer.exe 替换我的应用程序,

“HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell”

它可以工作,但是当我尝试在我的应用中启动 explorer.exe 时,

const string explorer = "explorer.exe";
string explorerPath = string.Format("{0}\\{1}", Environment.GetEnvironmentVariable("WINDIR"), explorer);
Process eProcess = new Process();
eProcess.StartInfo.FileName = explorerPath;
eProcess.StartInfo.UseShellExecute = true;
eProcess.StartInfo.CreateNoWindow = true;
eProcess.Start();
eProcess.WaitForInputIdle();

它只是挂起并且没有按应有的方式启动资源管理器。

我还尝试了许多其他“解决方法”,以根据不同的注册表项开始,

http://technet.microsoft.com/en-us/magazine/ee851671.aspx

但似乎没有一个在 Windows 7 / Vista 中可以 100% 工作。在 XP 中它似乎工作得更好。

顺便说一句:UAC 在所有将要运行的机器上都关闭。

任何建议都会很好 - 现在我被卡住了。

谢谢。

【问题讨论】:

  • 我没有时间玩并提供一个真正的答案,但“UseShellExecute”设置对我来说似乎是错误的——shell 通常是资源管理器(除了你的情况,我猜它是你的程序),它尚未运行,因此不太可能自行启动。您是否尝试将其设置为 false?
  • 嗨,涛。是的 - 我也考虑过这一点,并尝试将 UseShellExecute 设置为 false。我现在确实有一个资源管理器窗口,但没有外壳,没有任务栏等等。

标签: c# shell windows-7 explorer winlogon


【解决方案1】:

不要eProcess.WaitForInputIdle();,那样就可以了。

【讨论】:

  • 如果我将 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced] 设置为 1,它似乎也可以工作。
  • 在注册表中四处乱窜是一个非常糟糕的主意,您的应用程序挂起的原因是因为我上面提到的调用,在某种情况下会阻塞我很确定 explorer.exe 永远不会得到到。无论如何,为什么您的应用程序必须在 Explorer 之前启动?我很确定在 Windows 上搞砸这是一件很危险的事情……第一个资源管理器实例比你想象的要多得多,改变它在 Windows 上的启动方式并不是一个好主意。
  • SpikeX 它是一个 PCBooking 应用程序,在我锁定键盘、禁用 CAD、任务管理器等之前,用户应该无法启动任何东西。这是这个应用程序的全部想法。
  • 啊,我明白了,只是好奇。在这种情况下,是的,这可能是最好的路线。 :)
  • 不,它不能按我的意愿工作。我确实有一个资源管理器窗口,但没有外壳,没有任务栏,桌面等等。我必须尝试另一种方法。
猜你喜欢
  • 2012-03-08
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
相关资源
最近更新 更多