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,我們想要的功能實現了。