模拟ctrl+alt+delete三键
在我們編寫遠程控制軟件的時候,我們會發現要想解鎖server端我們就得發送這三個鍵的虛擬。
下面我說一下解決過程
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;??? //???? // Obtain a handle to WinSta0 - service must be running??? // in the LocalSystem account??? //???? 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;
??? //???? // Get the default desktop on winsta0??? //???? 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;
??? //???? // Set the desktop to be "default"??? //???? if (!SetThreadDesktop(hdesk))?????? return FALSE;??? PostMessage(HWND_BROADCAST,WM_HOTKEY,0,MAKELPARAM(MOD_ALT|MOD_CONTROL,VK_DELETE));
??? //???? // Reset the Window station and desktop??? //???? if (!SetProcessWindowStation(hwinstaCurrent))?????? return FALSE;
??? if (!SetThreadDesktop(hdeskCurrent))??? return FALSE;
??? //???? // Close the windowstation and desktop handles??? //???? if (!CloseWindowStation(hwinsta))??????? return FALSE;??? if (!CloseDesktop(hdesk))??????? return FALSE;??? return TRUE;}
偶一開始試驗了發現不成功,后來冰河大哥告訴我說OpenDesktop("Winlogon", ......)本身需要LocalSystem權限,果然如此,把它注冊成服務,然后效果實現。相信如何注冊成服務不用我說了吧。ok,我們想要的功能實現了。
3.還有一種方法Dos下鍵盤的完全控制 ------- 一系列的BIOS級別的鍵盤控制函數!我沒有試驗,不知道可否,哪位大哥試驗后告訴我一聲
在此再次感謝黃鑫大哥!!
總結
以上是生活随笔為你收集整理的模拟ctrl+alt+delete三键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于源码仿建视频解析网站
- 下一篇: dos窗口ping命令测试实战