.NET模拟Ctrl + Alt + Del键

所有在标题中说,我怎样才能模拟组合Ctrl + Alt + DEL

我试过这个:

SendKeys.Send("^(%({DEL}))") SendKeys.Send("^(%{DEL})") SendKeys.Send("^%{DEL}") 

但没有工作。 我正在使用VB.NET和Windows XP SP3

Solutions Collecting From Web of ".NET模拟Ctrl + Alt + Del键"

你不能。 这是在设备驱动程序级别完成的,不能为键盘驱动程序伪造输入。 也是你不能禁用它的原因。 让它伪造当然是一个非常严重的安全漏洞。

从Windows Vista开始,您可以使用SendSAS功能。


原来的答案,现在被上面的代替

你需要的功能叫做SimulateSAS 您需要通过电子邮件saslib@microsoft.com并要求提供。 微软似乎没有记录这一点,但只是做一个网络搜索SimulateSAS ,你会明白我的意思。

其他人已经解释了为什么它实际上不是一个安全问题,允许应用程序触发CTRL + ALT + DEL ,但你肯定无法使用SendKeys

你最好的选择可能是下载TightVNC源代码,看看他们是如何做到的。

看到这个线程的一些看起来很有用的信息:

  • 在VISTA中模拟Ctrl + Alt + Delete

基本上:

  • 你的程序必须签名
  • 您的程序必须具有指定所需特权的清单
  • 您的程序必须位于受保护的文件夹(需要用于写入的UAC,如Program Files文件夹)
  • 您的程序可以使用以下未公开的API来调用它:

     DWORD dwRet = lpfnWmsgSendMessage(dwSessionId,0x208, 0, (LPARAM)&lParam); //Undocument API. 

请注意,我只是蒸馏了我链接到的网页,我不知道它是否工作,或者如果有更多的陷阱。

我终于在CodeProject上找到了这个C ++代码 ,在以System用户身份启动时运行良好。 因此,我将代码转换为一个dll,并从我的代码中调用该函数。

这里是c ++代码(如果发生问题,可以使用MSDN中GetLastErrorErrorExit示例函数 ):

 #include "windows.h" #include <strsafe.h> __declspec(dllexport) BOOL SimulateAltControlDel() { HDESK hdeskCurrent; HDESK hdesk; HWINSTA hwinstaCurrent; HWINSTA hwinsta; // // Save the current Window station // hwinstaCurrent = GetProcessWindowStation(); if (hwinstaCurrent == NULL) return FALSE; // // Save the current desktop // hdeskCurrent = GetThreadDesktop(GetCurrentThreadId()); if (hdeskCurrent == NULL) return FALSE; // // Obtain a handle to WinSta0 - service must be running // in the LocalSystem account // hwinsta = OpenWindowStation("winsta0", FALSE, WINSTA_ACCESSCLIPBOARD | WINSTA_ACCESSGLOBALATOMS | WINSTA_CREATEDESKTOP | WINSTA_ENUMDESKTOPS | WINSTA_ENUMERATE | WINSTA_EXITWINDOWS | WINSTA_READATTRIBUTES | WINSTA_READSCREEN | WINSTA_WRITEATTRIBUTES); if (hwinsta == NULL) return FALSE; // // Set the windowstation to be winsta0 // if (!SetProcessWindowStation(hwinsta)) return FALSE; // // Get the default desktop on winsta0 // hdesk = OpenDesktop("Winlogon", 0, FALSE, DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | DESKTOP_JOURNALPLAYBACK | DESKTOP_JOURNALRECORD | DESKTOP_READOBJECTS | DESKTOP_SWITCHDESKTOP | DESKTOP_WRITEOBJECTS); if (hdesk == NULL) return FALSE; // // Set the desktop to be "default" // if (!SetThreadDesktop(hdesk)) return FALSE; PostMessage(HWND_BROADCAST,WM_HOTKEY,0,MAKELPARAM(MOD_ALT|MOD_CONTROL,VK_DELETE)); // // Reset the Window station and desktop // if (!SetProcessWindowStation(hwinstaCurrent)) return FALSE; if (!SetThreadDesktop(hdeskCurrent)) return FALSE; // // Close the windowstation and desktop handles // if (!CloseWindowStation(hwinsta)) return FALSE; if (!CloseDesktop(hdesk)) return FALSE; return TRUE; } 

您还需要将一个.def文件添加到项目中以正确导出该函数(该项目名为AltCtrlDelCpp)并告诉链接器该模块的定义文件是该文件

 ;altctrldel.def LIBRARY AltCtrlDelCpp ;CODE PRELOAD MOVEABLE DISCARDABLE ;DATA PRELOAD MOVEABLE EXPORTS SimulateAltControlDel 

然后,在.NET解决方案中,将dll添加到项目中,将其配置为始终将其复制到输出目录中,然后使用DllImport导入该函数:

C#代码

 [DllImport(@"AltCtrlDelCpp.dll")] static extern bool SimulateAltControlDel(); 

VB.NET代码

 <DllImport("AltCtrlDelCpp.dll")> _ Private Function SimulateAltControlDel() As Boolean 

在VB.NET中,您还需要将该属性添加到Sub Main:

 <MTAThread()> _ Sub Main() 

然后你只需要调用SimulateAltControlDel函数,就可以开始了。 请注意,我只有一个控制台应用程序的这项工作,它不适用于winform应用程序。

从Windows Vista开始, SendSAS功能可用。