微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.NET模拟Ctrl + Alt + Del键

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

我试过这个:

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

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

如何在Windows重启后自动启动自己的可执行文件

在.NET中更改日记操作?

如何将“唤醒时需要密码”上的值更改为错误编程?

如何在Windows窗体上显示必填字段

SetFilePointerEx API来读取MFT

在正在运行的程序中堆栈跟踪(在Windows中等同于pstack)

指定的模块无法find0x8007007E

等同于.NET中的Windows错误代码

Windows – 用C#命名pipe道性能build议

使用.net紧凑框架进行本地化

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

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

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

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

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

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

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

在VISTA中模拟Ctrl + Alt + Delete

基本上:

你的程序必须签名

您的程序必须具有指定所需特权的清单

您的程序必须位于受保护的文件夹(需要用于写入的UAC,如Program Files文件夹)

您的程序可以使用以下未公开的API来调用它:

DWORD dwRet = lpfnWmsgSendMessage(dwSessionId,0x208,(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",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,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功能可用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐