如何模拟这个ctrl alt del以便它可以工作?
我的代码如下:
输入输入; / *生成“按下键”* /
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));
答案 0 :(得分:5)
CTRL + ALT + DEL是安全注意序列(SAS),您无法使用SendInput
伪造它。 SendSAS
函数是您需要调用的函数。
但是,这仅适用于Windows 7.对于旧版本的Windows,如果我没记错,您需要从MS请求一个特殊的库才能生成SAS。我的记忆让我失望,但我认为它叫做SASLIB。还有一种称为SasLibEx的商业产品可以完成这项工作。如果您需要支持旧版Windows,另一个途径是查看VNC的源代码,看看他们是如何做到的。
答案 1 :(得分: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;
}