代码如下,请各位高人指点
keybd_event(MapVirtualKey(29,1),29,NULL,NULL); //control
keybd_event(MapVirtualKey(56,1),56,NULL,NULL); //alt
keybd_event(MapVirtualKey(83,1),83,NULL,NULL); //delkeybd_event(MapVirtualKey(29,1),29,KEYEVENTF_KEYUP,NULL); //control
keybd_event(MapVirtualKey(56,1),56,KEYEVENTF_KEYUP,NULL); //alt
keybd_event(MapVirtualKey(83,1),83,KEYEVENTF_KEYUP,NULL); //del
keybd_event(MapVirtualKey(29,1),29,NULL,NULL); //control
keybd_event(MapVirtualKey(56,1),56,NULL,NULL); //alt
keybd_event(MapVirtualKey(83,1),83,NULL,NULL); //delkeybd_event(MapVirtualKey(29,1),29,KEYEVENTF_KEYUP,NULL); //control
keybd_event(MapVirtualKey(56,1),56,KEYEVENTF_KEYUP,NULL); //alt
keybd_event(MapVirtualKey(83,1),83,KEYEVENTF_KEYUP,NULL); //del
ShellExecute(NULL, "open", "taskmgr.exe", NULL, "C:\\windows\\system32", SW_SHOWNORMAL);
那么普通的Keybd_Event是不可以的,因为这个是一个系统级的热键。
2k,xp下挺麻烦的,要用OpenDesktop等API对Winlogon这个桌面发送Ctrl+Alt+Del消息来实现,另外进程要作为服务来运行。
#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权限,
把它注册成服务,然后效果实现。
这个链接:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/virtualkeycodes.asp