【问题标题】:How can I disable the Start button (but not the Taskbar) on Windows 7?如何禁用 Windows 7 上的开始按钮(但不是任务栏)?
【发布时间】:2011-06-23 20:54:27
【问题描述】:

在 Windows XP 上,可以使用以下代码禁用“开始”按钮:

hTray = FindWindow (TEXT("Shell_TrayWnd"), NULL);
if (hTray)
{
    hStartButton = FindWindowEx(hTray, NULL, TEXT("Button"), NULL);
    if (hStartButton) ShowWindow(hStartButton, FALSE);
}

对于公共访问计算机配置,我需要能够在 Windows 7 上执行此操作。必须禁用“开始”按钮(不仅仅是隐藏),并且任务栏的其余部分必须仍然可见且可用。隐藏任务栏和“开始”按钮不是一种选择。全屏运行不是一种选择。使用“Start Killer”将不起作用,因为它实际上并没有禁用“开始”按钮,只是将其隐藏(用户仍然可以使用热键拉出“开始”菜单)。

我已经尝试过使用FindWindowEx 和0xC017 作为其第三个参数的方法,然后尝试禁用该窗口。它不起作用。该方法仅在首先禁用整个任务栏时才有效。我需要的是一种禁用“开始”菜单的方法,就像我在上面复制的代码在 XP 中所做的那样。

非常感谢任何帮助。

【问题讨论】:

  • 通常组策略对象是解决此类问题的正确解决方案。
  • 没有组策略设置可以完全禁用“开始”按钮。
  • 您想运行自助服务终端应用程序吗?那你为什么要运行 explorer shell。你应该让 Windows 运行你自己的 shell,这样你就不会面对这些垃圾了。

标签: c winapi windows-7 startmenu taskbar


【解决方案1】:

Windows 7 的“正确”版本如下所示:

HWND hStartBtn = FindWindowEx(NULL, NULL, MAKEINTATOM(0xC017), TEXT("Start"));
if (hStartBtn != NULL)
{
    ShowWindow(hStartBtn, FALSE);
}

但是,这只会禁用 按钮,这意味着您不会通过将鼠标光标悬停在其上来获得发光或其他效果。 您仍然可以单击任务栏上的按钮区域来打开菜单。 显然,单击处理程序现在是在任务栏窗口本身中实现的,而不是作为单独的开始按钮的一部分。这就是您必须首先禁用整个任务栏的原因,因此您在网上找到的大多数解决方案都是这样做的。

不过,"Start Killer" 应用程序现在似乎具有禁用触发开始菜单的最常见热键的功能,即 Ctrl+Esc 键。您可以通过启动软件、右键单击任务栏中的图标并从菜单中选择“选项”来找到这些选项。您还可以编辑注册表以禁用 Windows 键,如this knowledge base article 中所述。如果您想通过代码自己实现相同的功能,唯一的解决方案是使用低级键盘挂钩来捕获负责的按键事件并丢弃它们。

像这样的未记录的黑客攻击被用于破解较新版本的 Windows。我想Raymond Chen would chuckle and say something like "I told you so"。破解 Windows 界面是一件傻事。或者,正如您在问题中多次说的那样,“不是一种选择”。

【讨论】:

  • 如上所述,我已经尝试了0xC017的方法,但还是不行。我并不特别关心 Raymond Chen 对这个问题的看法,如果 Microsoft 不希望人们使用“未记录的黑客”来禁用“开始”按钮,那么他们应该通过组策略提供一个记录在案的方法。
  • @Josh:我发现您对阅读我的整个答案的解决方案不够感兴趣。特别是粗体部分。该方法“有效”。我什至在我的机器上试了一下。但这不是一个“完整”的解决方案,因为一个完整的解决方案是不可能的。我向您推荐陈先生的原因并不是个人的喜好,而是因为他在负责实现这些功能的 Windows Shell 团队工作。如果您使用未记录的黑客,Microsoft 并不特别在意,他们只是不保证他们会继续工作。这正是您所做似乎关心的事情。
  • 如原帖所述,我尝试使用您描述的方法(使用 FindWindowEx 和 0xC017 作为第三个参数,然后禁用此窗口),但这不起作用。我已经在其他地方看到过这个建议。您的设置可能与我的不同吗?我使用的是 Windows Aero 模式,任务栏设置为在 XP 上显示(没有分组,带有标签的小图标)。
  • @Josh:您仍然忘记了 fourth 参数,或者这只会禁用按钮,而不是单击区域并打开任务的能力酒吧。正如我在回答中提到的那样,该解决方案不会阻止用户打开“开始”菜单;做到这一点的唯一方法是将上述方法与完全禁用任务栏相结合,这是您不想做的。我从没想过要解释“这不可能”的答案会如此困难。
  • 好吧,在这种情况下,我可能不得不求助于使用 Start Killer 并完全禁用 Windows 键(我认为可以使用组策略来完成)并使用 AutoHotKey 禁用 Ctrl+Esc。这应该有望防止他们陷入困境。 (无论如何,Start Killer 是如何完全隐藏按钮并使其他所有内容都向左移动的?即使是我在 XP 上使用的方法也会在“开始”按钮所在的位置留下空白。)
【解决方案2】:

有什么特别需要禁用的开始菜单吗?您可以通过策略设置或其他各种文件权限来执行相同的操作。

【讨论】:

  • 是的。必须禁用整个开始菜单。系统用户必须通过调整大小以适应整个屏幕(任务栏除外)的信息亭实用程序打开应用程序。他们必须有权访问任务栏,以便如果他们同时打开多个程序,他们可以以正常方法在它们之间切换。我知道禁用“开始”菜单上某些特定项目的组策略,但似乎没有完全禁用“开始”菜单的策略设置。这就是为什么我需要使用 API 函数来禁用“开始”按钮。
  • 如果您的用户可以访问网络浏览器(或任何程序中的任何其他文件打开/保存对话框),他们就可以启动任何应用程序!
【解决方案3】:

使用here 列出的可用组策略之一。

您没有提及为什么要禁用开始按钮。如果您考虑您不希望用户做什么而不是告诉我们您为它选择的解决方案(即“禁用开始按钮”),您可能会想出一个更好的解决方案。

例如,如果您想阻止用户更改某些设置,请阻止那个,而不是开始按钮! 或者,如果您不希望他们看到所有已安装的应用程序,请隐藏这些应用程序而不是开始按钮! 或者……

(希望你能明白我的意思)。

【讨论】:

  • 因此,如果他的目标是阻止用户执行 40% 的任何事情,即使是遥不可及的事情,按照你的逻辑,他将不得不在接下来的 10 次生命中阻止每一个.杀死开始按钮对他来说是一个很好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 2011-03-24
  • 1970-01-01
  • 2012-03-23
相关资源
最近更新 更多