.NET Simulate Ctrl + Alt + Del Sendkeys - PullRequest
       28

.NET Simulate Ctrl + Alt + Del Sendkeys

7 голосов
/ 19 февраля 2011

все сказано в названии, как мне смоделировать комбинацию Ctrl + Alt + DEL ?

Я пробовал это:

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

Но никто не работал. Я работаю на VB.NET и Windows XP SP3

Ответы [ 6 ]

5 голосов
/ 19 февраля 2011

Начиная с Windows Vista, вы можете использовать функцию SendSAS.


Исходный ответ, теперь замененный вышеуказанным

Функция, которая вам нужна, называется SimulateSAS.Вам необходимо отправить электронное письмо по адресу saslib@microsoft.com и попросить об этом.Похоже, Microsoft не документирует это, а просто проводит веб-поиск для SimulateSAS, и вы поймете, что я имею в виду.

Другие объяснили, почему на самом деле это не проблема безопасностиразрешить приложениям запускать CTRL + ALT + DEL , но вы, безусловно, не сможете сделать это с SendKeys.

5 голосов
/ 19 февраля 2011

Вы не можете.Это делается на уровне драйвера устройства, вы не можете подделать ввод для драйвера клавиатуры.Также причина, по которой вы не можете отключить его.Разумеется, допустить его подделку было бы очень серьезным недостатком безопасности.

4 голосов
/ 19 февраля 2011

Лучше всего было бы загрузить исходный код TightVNC, и посмотреть, как они это делают.

3 голосов
/ 19 февраля 2011

См. Эту ветку для получения информации, которая кажется полезной:

В основном:

  • Ваша программа должна быть подписана
  • В вашей программе должен быть манифест с указанием необходимых прав доступа
  • Ваша программа должна находиться в защищенной папке (той, для которой требуется UAC для записи в, как папка Program Files)
  • Ваша программа может затем использовать следующий недокументированный API для ее вызова:

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

Обратите внимание, я только дистиллировалвеб-страницу, на которую я ссылаюсь, я понятия не имею, работает ли она, или есть еще ошибки.

1 голос
/ 16 ноября 2015

Начиная с Windows Vista, доступна функция SendSAS.

1 голос
/ 06 марта 2012

Наконец-то я нашел этот код C ++ в CodeProject, который хорошо работает при запуске как Системный пользователь . Поэтому я преобразовал код в dll и вызвал функцию из моего кода.

Вот код c ++ (вы можете использовать пример функции ErrorExit , которая использует GetLastError из MSDN в случае возникновения проблемы):

#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.

...