2012-03-21 52 views
3

如何模擬此ctrl alt del以便它能正常工作?發送Ctrl Alt Del通過INPUT結構不起作用?

我的代碼如下:

INPUT 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

對於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; 

} 
+0

它不起作用,並給出「錯誤5調用OpenDesktop」,這意味着訪問被拒絕。 – Mak 2012-03-22 06:26:25

+0

在Windows XP上以管理員身份運行時? – 2012-03-22 16:51:18

+0

只有當我的應用程序作爲服務運行時纔有效。 – Mak 2012-03-23 12:08:36

5

CTRL + ALT + DEL是安全注意序列(SAS),你可以不SendInput捏造事實。 SendSAS函數是你需要調用的。

但是,這僅在Windows 7上可用。對於舊版本的Windows,如果我記得正確,則需要從MS請求特殊庫以生成SAS。我的記憶讓我失望,但我認爲它被稱爲SASLIB。還有一種名爲SasLibEx的商業產品可以完成這項工作。如果您需要支持較舊版本的Windows,另一個途徑是查看VNC的源代碼以瞭解它們是如何實現的。

+0

ü可以給我舉例 – Mak 2012-03-21 14:12:54

+0

什麼例子? SendSAS是微不足道的。只需按照我的鏈接。 – 2012-03-21 14:25:45

+0

@David:可以在Windows XP中發送一個SAS,帶有一些駭客 - 請參閱我的答案。不知道Vista。 – 2012-03-22 01:42:50

相關問題