3

このctrlaltdelをシミュレートして、機能するようにするにはどうすればよいですか?

私のコードは次のとおりです。

INPUT入力; /*「キーダウン」を生成します*/

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));
4

2 に答える 2

6

CTRL + ALT + DELはセキュアアテンションシーケンス(SAS)であり、で偽造することはできませんSendInput。関数はあなたSendSASが呼び出す必要があるものです。

ただし、これはWindows 7でのみ使用できます。古いバージョンのWindowsの場合、正しく思い出せば、SASを生成するためにMSに特別なライブラリを要求する必要があります。私の記憶は私を失敗させています、しかし私はそれがSASLIBと呼ばれていると思います。その仕事をするSasLibExとして知られている商用製品もあります。古いバージョンのWindowsをサポートする必要がある場合のさらに別の方法は、VNCのソースコードを調べて、それらがどのように機能するかを確認することです。

于 2012-03-21T14:05:52.910 に答える
4

Windows XPの場合、SendSASは使用できないため、次のようになります。

#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.\n", GetLastError());

    return 1;

  }

  if (!SetProcessWindowStation(hw)) {

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

    return 1;

  }

  h = OpenDesktop("Winlogon", 0, FALSE, GENERIC_ALL);

  if (!h) {

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

    return 1;

  }

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

    err = GetLastError();

    if (err != 0) {

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

      return 1;

    }

  }

  if (saswindow == NULL) {

    printf("SAS window not found.\n");

    return 1;

  }

  if (!PostMessage(saswindow, WLX_WM_SAS, WLX_SAS_TYPE_CTRL_ALT_DEL, 0)) {

    printf("Error %u posting message.\n", 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;

}
于 2012-03-22T01:41:03.117 に答える