windows - Send Ctrl Alt Del gennem INPUT Structure virker ikke?

Indlæg af Hanne Mølgaard Plasc

Problem



Hvordan simulere denne ctrl alt del så det vil fungere?


Min kode er som følger:


INPUT-indgang;
/* Generer en 'nøgle ned' */


Input.type  = INPUT\_KEYBOARD;
Input.ki.dwFlags  = KEYEVENTF\_SCANCODE; 
Input.ki.wScan=29;
Input.ki.dwExtraInfo=0;
Input.ki.wVk=0;
Input.ki.time=0;
SendInput(1, &Input, sizeof(Input));


Input.type  = INPUT\_KEYBOARD;
Input.ki.dwFlags  = KEYEVENTF\_SCANCODE; 
Input.ki.wScan=56;
Input.ki.dwExtraInfo=0;
Input.ki.wVk=0;
Input.ki.time=0;
SendInput(1, &Input, sizeof(Input));


Input.type  = INPUT\_KEYBOARD;
Input.ki.dwFlags  = KEYEVENTF\_EXTENDEDKEY | KEYEVENTF\_SCANCODE; 
Input.ki.wScan=83;
Input.ki.dwExtraInfo=0;
Input.ki.wVk=0;
Input.ki.time=0;
SendInput(1, &Input, sizeof(Input));


Input.type  = INPUT\_KEYBOARD;
Input.ki.dwFlags  = KEYEVENTF\_SCANCODE | KEYEVENTF\_KEYUP; 
Input.ki.wScan=29;
Input.ki.dwExtraInfo=0;
Input.ki.wVk=0;
Input.ki.time=0;
SendInput(1, &Input, sizeof(Input));


Input.type  = INPUT\_KEYBOARD;
Input.ki.dwFlags  = KEYEVENTF\_SCANCODE  | KEYEVENTF\_KEYUP; 
Input.ki.wScan=56;
Input.ki.dwExtraInfo=0;
Input.ki.wVk=0;
Input.ki.time=0;
SendInput(1, &Input, sizeof(Input));


Input.type  = INPUT\_KEYBOARD;
Input.ki.dwFlags  = KEYEVENTF\_EXTENDEDKEY | KEYEVENTF\_SCANCODE  | KEYEVENTF\_KEYUP; 
Input.ki.wScan=83;
Input.ki.dwExtraInfo=0;
Input.ki.wVk=0;
Input.ki.time=0;
SendInput(1, &Input, sizeof(Input));

Bedste reference


For Windows XP, da SendSAS ikke er tilgængelig:


#define \_WIN32\_WINNT 0x0500

#include <windows.h>
#include <winwlx.h>

#include <stdio.h>

BOOL CALLBACK parents(HWND hwnd, LPARAM dummy);

HWND saswindow = NULL;

int main(int argc, char ** argv) {

  HDESK h;

  HWINSTA hw;

  DWORD err;

  hw = OpenWindowStation("winsta0", FALSE, GENERIC\_ALL);

  if (!hw) {

    printf("Error \%u calling OpenWindowStation.
", GetLastError());

    return 1;

  }

  if (!SetProcessWindowStation(hw)) {

    printf("Error \%u calling SetProcessWindowStation.
", GetLastError());

    return 1;

  }

  h = OpenDesktop("Winlogon", 0, FALSE, GENERIC\_ALL);

  if (!h) {

    printf("Error \%u calling OpenDesktop.
", GetLastError());

    return 1;

  }

  if (!EnumDesktopWindows(h, parents, 0)) {

    err = GetLastError();

    if (err != 0) {

      printf("Error \%u enumerating top-level windows.
", err);

      return 1;

    }

  }

  if (saswindow == NULL) {

    printf("SAS window not found.
");

    return 1;

  }

  if (!PostMessage(saswindow, WLX\_WM\_SAS, WLX\_SAS\_TYPE\_CTRL\_ALT\_DEL, 0)) {

    printf("Error \%u posting message.
", GetLastError());

    return 1;

  }

  return 0;

}

BOOL CALLBACK parents(HWND hwnd, LPARAM dummy) {  

  static int n;

  static char wintext[16];

  n = GetWindowText(hwnd, wintext, sizeof(wintext));

  if (n == 0) return TRUE;

  if (strcmp(wintext, "SAS window") != 0) return TRUE;

  saswindow = hwnd;

  SetLastError(0);

  return FALSE;

}

Andre referencer 1


CTRL + ALT + DEL er den sikre opmærksomhedssekvens (SAS), og du kan ikke fake den med SendInput. Funktionen SendSAS er det, du skal ringe. [5]


Dette er dog kun tilgængeligt på Windows 7. For ældre versioner af Windows, skal jeg, hvis jeg husker korrekt, anmode om et særligt bibliotek fra MS for at generere SAS. Min hukommelse fejler mig, men jeg tror, ​​det hedder SASLIB. Der er også et kommercielt produkt kendt som SasLibEx, der gør jobbet. Endnu en anden vej, hvis du har brug for at understøtte ældre versioner af Windows, er at se på kildekoden for VNC for at se, hvordan de gør det. [6]