.NET Simulate Ctrl + Alt + Del Sendkeys

c# .net windows vb.net keyboard

11753 просмотра

6 ответа

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

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

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

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

Автор: GianT971 Источник Размещён: 12.11.2019 09:17

Ответы (6)


5 плюса

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

Автор: Hans Passant Размещён: 18.02.2011 10:52

5 плюса

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


Оригинальный ответ, теперь заменен вышеуказанным

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

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

Автор: David Heffernan Размещён: 18.02.2011 10:53

4 плюса

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

Автор: Robert Harvey Размещён: 18.02.2011 11:07

3 плюса

Посмотрите эту ветку для некоторой информации, которая кажется полезной:

В основном:

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

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

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

Автор: angry person Размещён: 18.02.2011 11:00

1 плюс

Решение

Наконец-то я нашел этот код 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.

Автор: GianT971 Размещён: 06.03.2012 11:36

1 плюс

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

Автор: Harry Johnston Размещён: 16.11.2015 12:21
Вопросы из категории :
32x32