模擬CTRL+ALT+DEL

 

1.一開始,決定通過keybd_event()來模擬鍵盤

keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0);      keybd_event(VK_MENU,MapVirtualKey(VK_MENU,0),0,0);      keybd_event(VK_DELETE,MapVirtualKey(VK_DELETE,0),0,0);        keybd_event(VK_DELETE,MapVirtualKey(VK_DELETE,0),KEYEVENTF_KEYUP,0);     keybd_event(VK_MENU,MapVirtualKey(VK_MENU,0),KEYEVENTF_KEYUP,0);      keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),KEYEVENTF_KEYUP,0); 發現只能模擬ctrl+alt兩個鍵的效果,然而其他的兩個鍵的都可以模擬比如win+d。不知道是不是keybd_event()只能模擬兩鍵還是因爲ctrl+alt+delete的特殊性,望高手告之,在此謝過。

2.運用PostMessage(HWND_BROADCAST, WM_HOTKEY, 0, MAKELONG(MOD_ALT | MOD_CONTROL, VK_DELETE));
來發送虛擬鍵盤,但是在winNT以後的系統裏我們還有很多事情要做,比如:OpenDesktop()、OpenInputDesktop()、GetThreadDesktop()、SetThreadDesktop()、CloseDesktop()、GetUserObjectInformation()

代碼如下:

#include "windows.h"
BOOL simulateAltControlDel();
void main()
{  
simulateAltControlDel();
}
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;   

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;

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;
    if (!SetThreadDesktop(hdesk))       return FALSE;     PostMessage(HWND_BROADCAST,WM_HOTKEY,0,MAKELPARAM(MOD_ALT|MOD_CONTROL,VK_DELETE));

   
if (!SetProcessWindowStation(hwinstaCurrent))       return FALSE;
    if (!SetThreadDesktop(hdeskCurrent))    return FALSE;
    if (!CloseWindowStation(hwinsta))        return FALSE;   
if (!CloseDesktop(hdesk))        return FALSE;    return TRUE;}

偶一開始試驗了發現不成功,後來冰河大哥告訴我說OpenDesktop("Winlogon", ......)本身需要LocalSystem權限,果然如此,把它註冊成服務,然後效果實現。相信如何註冊成服務不用我說了吧。ok,我們想要的功能實現了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章