所有在标题中说,我怎样才能模拟组合Ctrl + Alt + DEL ?
我试过这个:
SendKeys.Send("^(%({DEL}))") SendKeys.Send("^(%{DEL})") SendKeys.Send("^%{DEL}")
但没有工作。 我正在使用VB.NET和Windows XP SP3
你不能。 这是在设备驱动程序级别完成的,不能为键盘驱动程序伪造输入。 也是你不能禁用它的原因。 让它伪造当然是一个非常严重的安全漏洞。
从Windows Vista开始,您可以使用SendSAS
功能。
原来的答案,现在被上面的代替
你需要的功能叫做SimulateSAS
。 您需要通过电子邮件saslib@microsoft.com并要求提供。 微软似乎没有记录这一点,但只是做一个网络搜索SimulateSAS
,你会明白我的意思。
其他人已经解释了为什么它实际上不是一个安全问题,允许应用程序触发CTRL + ALT + DEL ,但你肯定无法使用SendKeys
。
你最好的选择可能是下载TightVNC源代码,看看他们是如何做到的。
看到这个线程的一些看起来很有用的信息:
基本上:
您的程序可以使用以下未公开的API来调用它:
DWORD dwRet = lpfnWmsgSendMessage(dwSessionId,0x208, 0, (LPARAM)&lParam); //Undocument API.
请注意,我只是蒸馏了我链接到的网页,我不知道它是否工作,或者如果有更多的陷阱。
我终于在CodeProject上找到了这个C ++代码 ,在以System用户身份启动时运行良好。 因此,我将代码转换为一个dll,并从我的代码中调用该函数。
这里是c ++代码(如果发生问题,可以使用MSDN中GetLastError
的ErrorExit示例函数 ):
#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
功能可用。