.NET Simula Ctrl + Alt + Del Sendkeys

tutto è detto nel titolo, come posso simulare la combinazione Ctrl + Alt + CANC ?

Ho provato questo:

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

Ma nessuno ha funzionato. Sto lavorando su VB.NET e Windows XP SP3

Non puoi Questo viene fatto a livello di driver di periferica, non è ansible falsificare l’input per il driver della tastiera. Anche il motivo per cui non puoi disabilitarlo. Consentire che sia simulato sarebbe ovviamente un grave difetto di sicurezza.

A partire da Windows Vista, è ansible utilizzare la funzione SendSAS .


Risposta originale, ora sostituita da quanto sopra

La funzione di cui hai bisogno si chiama SimulateSAS . È necessario inviare un’e-mail a [email protected] e richiederlo. Microsoft non sembra documentarlo, ma basta fare una ricerca sul web per SimulateSAS e vedrai cosa intendo.

Altri hanno spiegato il motivo per cui in realtà non è un problema di sicurezza che consente alle app di triggersre CTRL + ALT + CANC , ma certamente non è ansible farlo con SendKeys .

La soluzione migliore potrebbe essere quella di scaricare il codice sorgente TightVNC e vedere come lo fanno.

Vedi questo thread per alcune informazioni che sembrano utili:

  • Simula Ctrl + Alt + Elimina in VISTA

Fondamentalmente:

  • Il tuo programma deve essere firmato
  • Il tuo programma deve avere un manifest specificando i privilegi necessari
  • Il tuo programma deve trovarsi in una cartella protetta (quella che richiede il controllo dell’account utente per la scrittura, come la cartella Programmi)
  • Il tuo programma può quindi utilizzare la seguente API non documentata per invocarlo:

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

Nota, ho solo distillato la pagina web a cui mi collego, non ho idea se funzioni, o se ci sono altri trucchi.

Ho finalmente trovato questo codice C ++ su CodeProject, che funziona bene quando lanciato come utente di sistema . Pertanto, ho convertito il codice in una DLL e chiamato la funzione dal mio codice.

Ecco il codice c ++ (è ansible utilizzare la funzione di esempio ErrorExit che utilizza GetLastError da MSDN in caso si verifichi un problema):

 #include "windows.h" #include  __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; } 

È inoltre necessario aggiungere un file .def al progetto per esportare correttamente la funzione (il progetto è denominato AltCtrlDelCpp) e indicare al linker che il file di definizione del modulo è questo file

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

Quindi, nella soluzione .NET, si aggiunge la dll al progetto, la si configura in modo che venga sempre copiata nella directory di output e si utilizzi semplicemente DllImport per importare la funzione:

Codice C #

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

Codice VB.NET

  _ Private Function SimulateAltControlDel() As Boolean 

In VB.NET, devi anche aggiungere l’attributo al Sub Main:

  _ Sub Main() 

Quindi devi solo chiamare la funzione SimulateAltControlDel ed ecco fatto. Si prega di notare che ho avuto questo lavoro solo per le app di console , non ha funzionato nelle app Winform.

A partire da Windows Vista, la funzione SendSAS è disponibile.