2011-02-18 57 views
5

todo está dicho en el título, ¿cómo puedo simular la combinación Ctrl +Alt +DEL?.NET Simular Ctrl + Alt + Del Sendkeys

yo probamos este:

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

Pero nada funcionó. Estoy trabajando en VB.NET y Windows XP SP3

+2

@mdmullinax: Técnicamente, no. Él pregunta cómo simular las llaves, no las atrapa. – mellamokb

+0

my bad, comment removed – MikeM

+0

¿Desea simular realmente las claves, o simplemente desea llamar al diálogo de seguridad estándar? Si esto último, puede invocar [el método 'WindowsSecurity'] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb774126%28v=vs.85%29.aspx) en el objeto de envío de shell. –

Respuesta

1

Finalmente encontré this C++ code en CodeProject, que funciona bien cuando se inicia como Usuario del sistema. Por lo tanto, convertí el código en un dll y llamé a la función desde mi código.

Este es el código C++ (se puede utilizar la función ErrorExit ejemplo que utiliza GetLastError de MSDN en caso de un problema ocurrió):

#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; 
} 

También es necesario agregar un archivo .def al proyecto para exportar la función correcta (el proyecto se denomina AltCtrlDelCpp) y decirle al enlazador que el archivo de definición del módulo es este archivo

;altctrldel.def 
LIBRARY AltCtrlDelCpp 

;CODE PRELOAD MOVEABLE DISCARDABLE 
;DATA PRELOAD MOVEABLE 

EXPORTS 
    SimulateAltControlDel 

a continuación, en la solución de .NET, se agrega el DLL al proyecto, lo configura de modo que siempre se copia en el directorio de salida, y sólo tiene que utilizar DllImport importar la función:

C# Código

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

Código VB.NET

<DllImport("AltCtrlDelCpp.dll")> _ 
Private Function SimulateAltControlDel() As Boolean 

En VB.NET, también necesita agregar el atributo al Sub principal:

<MTAThread()> _ 
Sub Main() 

Luego solo tiene que llamar a la función SimulateAltControlDel y listo. Tenga en cuenta que tuve este trabajo solo para las aplicaciones de consola , no funcionó en las aplicaciones de winform.

+0

El código anterior hace suposiciones no documentadas sobre cómo se registra la combinación de teclas Ctrl + Alt + Supr. (También asume que solo hay una ventana en el escritorio seguro que registra una tecla de acceso directo con ID cero). –

+0

Bueno, en realidad solo funciona cuando se ejecuta como sistema; si lo usa como administrador, no tendrá éxito. Tenga en cuenta también que este código no es mío (publiqué el enlace a la página en codeproject) y no soy un desarrollador de C++, por lo que no puedo decir si tiene razón o no :) – GianT971

+0

Sólo digo que el método anterior no está garantizado para funcionar en versiones futuras de Windows. Simplemente advirtiendo a cualquiera que esté pensando en usar esto en su producto: deben informar a sus clientes que el producto está haciendo suposiciones no documentadas sobre el sistema que pueden dejar de funcionar en versiones futuras de Windows. –

5

No puede. Esto se hace en el nivel del controlador del dispositivo, no se puede falsificar la entrada para el controlador del teclado. También la razón por la que no puedes deshabilitarlo. Permitir que se falsifique sería un defecto de seguridad muy serio.

+0

¿Cómo funciona Logmein o gotomypc hacerlo? – mellamokb

+0

¿Quién dice que lo hacen? –

+0

@David: Lo hacen. Es una opción de menú. –

5

A partir de Windows Vista, puede utilizar la función SendSAS.


Respuesta original, ahora reemplazado por el anterior

La función que necesita se llama SimulateSAS. Debe enviar un correo electrónico a [email protected] y solicitarlo. Microsoft no parece documentar esto, pero simplemente haga una búsqueda web para SimulateSAS y verá lo que quiero decir.

Otros han explicado por qué no lo es en realidad un problema de seguridad para permitir que las aplicaciones desencadenan CTRL +ALT +DEL, pero desde luego no pueden hacerlo con SendKeys.

+1

¿Quieres un poco de sal? – mellamokb

+0

Actualización: [documentada] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd979761.aspx) y ahora generalmente disponible a partir del SDK de Windows 7, incluso para Vista. –

2

Ver este tema por alguna información que parece útil:

Básicamente:

  • Su programa debe ser firmado
  • su programa debe tener una Especificación de manifiesto los privilegios necesarios
  • Su programa debe estar ubicado en una carpeta protegida (uno que requiere UAC para escribir, al igual que la carpeta Archivos de programa)
  • Su programa puede utilizar la siguiente API no documentada a lo invocan:

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

Nota, solo destilé la página web a la que me enlace, no tengo idea de si funciona o si hay más errores.

4

Su mejor opción es descargar TightVNC source code, y ver cómo lo hacen.

+0

Estás desesperado ¿no? !! ;-) –

+0

@David: Bueno, no sé cómo hacerlo. No escribo controladores de dispositivo para ganarme la vida. Dame algunos representantes, maldición! –

+0

Ahí tienes, si Hans tiene algo, ¿por qué no? –

1

A partir de Windows Vista, la función SendSAS está disponible.

Cuestiones relacionadas