使用 Win32 应用程序在 Windows 7 中禁用 CONTROL + ALT + DELETE 和 Windows(win) 键[重复]

Posted

技术标签:

【中文标题】使用 Win32 应用程序在 Windows 7 中禁用 CONTROL + ALT + DELETE 和 Windows(win) 键[重复]【英文标题】:Disable CONTROL + ALT + DELETE and Windows(win) Key in Windows 7 using Win32 application [duplicate] 【发布时间】:2010-12-25 07:09:39 【问题描述】:

我正在编写一个像kiosk 一样运行的应用程序,并且应该允许用户退出应用程序。在Windows 7 中,当他按下 Win 键或 CTRL + ALT+ DELETE 时,会出现程序。我需要以编程方式禁用Windows 7 中的 Ctrl+ ALT + DELETE 组合键和 Win 键。

【问题讨论】:

在 serverfault 上问这个问题可能会更好 - 有一些方法可以通过策略将 Windows 置于 kiosk 模式。 【参考方案1】:

按下 Alt+Tab 也将退出应用程序。 Ctrl+Esc 是打开“开始”菜单的备用快捷方式。 Alt+Esc 在运行的应用程序之间切换。有许多不同的按键序列可以做到这一点; Windows 成为多任务操作系统的自然结果。

要解决这个问题,您必须安装一个可以捕获这些任务键的低级键盘挂钩。该钩子将监视用于切换任务的任何常用键序列。每当它检测到其中一个序列时,它将通过不将输入传递到钩子链来忽略输入。 Paul DiLascia 在 2002 年 9 月版的 MSDN 杂志上写了一个article that addresses this very question。您关心的部分开始于页面的一半左右,但为了方便起见并获得语法突出显示的乐趣,我在这里重印了它:

TaskKeyHook.h:

////////////////////////////////////////////////////////////////
// MSDN Magazine — September 2002
// If this code works, it was written by Paul DiLascia.
// If not, I don't know who wrote it.
// Compiles with Visual Studio 6.0 and Visual Studio .NET on Windows XP.
//
#define DLLIMPORT __declspec(dllimport)

DLLIMPORT BOOL DisableTaskKeys(BOOL bEnable, BOOL bBeep);
DLLIMPORT BOOL AreTaskKeysDisabled();

TaskKeyHook.cpp

////////////////////////////////////////////////////////////////
// MSDN Magazine — September 2002
// If this code works, it was written by Paul DiLascia.
// If not, I don't know who wrote it.
// Compiles with Visual Studio 6.0 and Visual Studio .NET on Windows XP.
//
// This file implements the low-level keyboard hook that traps the task 
// keys.
//
#define _WIN32_WINNT 0x0500 // for KBDLLHOOKSTRUCT
#include <afxwin.h>         // MFC core and standard components

#define DLLEXPORT __declspec(dllexport)

//////////////////
// App (DLL) object
//
class CTaskKeyHookDll : public CWinApp 
public:
   CTaskKeyHookDll()   
   ~CTaskKeyHookDll()  
 MyDll;

////////////////
// The section is SHARED among all instances of this DLL.
// A low-level keyboard hook is always a system-wide hook.
// 
#pragma data_seg (".mydata")
HHOOK g_hHookKbdLL = NULL; // hook handle
BOOL  g_bBeep = FALSE;     // beep on illegal key
#pragma data_seg ()
#pragma comment(linker, "/SECTION:.mydata,RWS") // tell linker: make it 
                                                // shared

/////////////////
// Low-level keyboard hook:
// Trap task-switching keys by returning without passing along.
//
LRESULT CALLBACK MyTaskKeyHookLL(int nCode, WPARAM wp, LPARAM lp)

   KBDLLHOOKSTRUCT *pkh = (KBDLLHOOKSTRUCT *) lp;

   if (nCode==HC_ACTION) 
      BOOL bCtrlKeyDown =
         GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) * 8) - 1);

      if ((pkh->vkCode==VK_ESCAPE && bCtrlKeyDown) || // Ctrl+Esc
          // Alt+TAB
          (pkh->vkCode==VK_TAB && pkh->flags & LLKHF_ALTDOWN) ||   
          // Alt+Esc
          (pkh->vkCode==VK_ESCAPE && pkh->flags & LLKHF_ALTDOWN)|| 
          (pkh->vkCode==VK_LWIN || pkh->vkCode==VK_RWIN))  // Start Menu
         if (g_bBeep && (wp==WM_SYSKEYDOWN||wp==WM_KEYDOWN))
            MessageBeep(0); // only beep on downstroke if requested
         return 1; // gobble it: go directly to jail, do not pass go
      
   
   return CallNextHookEx(g_hHookKbdLL, nCode, wp, lp);


//////////////////
// Are task keys disabled—ie, is hook installed?
// Note: This assumes there's no other hook that does the same thing!
//
DLLEXPORT BOOL AreTaskKeysDisabled()

   return g_hHookKbdLL != NULL;


//////////////////
// Disable task keys: install low-level kbd hook.
// Return whether currently disabled or not.
//
DLLEXPORT BOOL DisableTaskKeys(BOOL bDisable, BOOL bBeep)

   if (bDisable) 
      if (!g_hHookKbdLL) 
         g_hHookKbdLL = SetWindowsHookEx(WH_KEYBOARD_LL,
            MyTaskKeyHookLL, MyDll.m_hInstance, 0);
      

    else if (g_hHookKbdLL != NULL) 
      UnhookWindowsHookEx(g_hHookKbdLL);
      g_hHookKbdLL = NULL;
   
   g_bBeep = bBeep;

   return AreTaskKeysDisabled();

他还提供了禁用任务栏的示例代码(从而阻止 Windows 键显示开始菜单)和使用这些库的完整示例应用程序。

就防止 Ctrl+Alt+Del(安全注意序列,或 SAS)而言,上述方法不会工作。原因是操作系统将 SAS 生成的硬件中断与其他键分开捕获,特别是为了防止程序挂钩序列并欺骗登录提示。您将无法使用键盘挂钩禁用此功能。我在上面链接的文章确实在顶部详细介绍了此要求,但这些策略仅经过测试,很可能仅适用于 Windows XP。本文建议的另一种方法是禁用任务管理器,但请注意,这不会阻止用户关闭系统等。正确的方法是编写键盘驱动程序.

【讨论】:

感谢 Cody....我使用 msgina.dll 让它工作了.....感谢您的详细回答... msgina 是否适用于 Windows 7? @SparcU:没有。Windows Vista 或更高版本(包括 Windows 7)中没有 msgina。这不是 Windows XP 之外的选项。 "钩子必须作为 DLL 实现" 呃,不。我不这么认为。你有这方面的证据吗? @IronManMark20 在 Win 10 上可以确认,这个不需要放在 DLL 中。将MyDll.m_hInstance 替换为GetModuleHandle(NULL) 就可以了【参考方案2】:

AFAIK,您无法在 win32 中使用 CTRL + ALT + DELETE 组合键。不过,如果您愿意,有一些方法可以规避这个问题。

【讨论】:

我试图抓住这个组合,它从来没有奏效......【参考方案3】:

我认为这可以通过替换主要的 Windows 键盘驱动程序 kbdclass.sys 来实现。它应该可以在其中处理 Delete 键按下,例如,当 Ctrl 和 Alt 键已经按下时避免进一步传输它。

【讨论】:

以上是关于使用 Win32 应用程序在 Windows 7 中禁用 CONTROL + ALT + DELETE 和 Windows(win) 键[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Win32 应用程序是不是也可以在 Windows 7 和 Windows 8/8.1 上运行?

在某些特殊情况下,Win32 ShowWindow api 在 Windows 7 SP1 上的行为是不是不同?

使用 Win32/C++ API 更改 Windows 7 壁纸(操作未实现异常)

Windows 7 GUI 参考

在windows7 64位 安装MySQL-python-1.2.5.win32-py2.7.exe

Visual Studio、Windows 7 x64 中的“生成 Win32 资源时出错”