procedure TScreenSpy.CtrlAltDelEnt; var old_desktop: HDESK; hwndCtrlAltDel: hwnd; begin old_desktop := GetThreadDesktop(GetCurrentThreadId()); SelectDesktop('Winlogon'); hwndCtrlAltDel := FindWindow('SAS window class', 'SAS window'); if hwndCtrlAltDel = 0 then hwndCtrlAltDel := HWND_BROADCAST; PostMessage(hwndCtrlAltDel, WM_HOTKEY, 0, MAKELONG(MOD_ALT or MOD_CONTROL, VK_DELETE)); if old_desktop <> 0 then selecthdesk(old_desktop); end; 当然可以模拟啊。。你新建一条线程然后把这个线程切换到Winlogon桌面。
function SelectDesktop(name: PChar):Boolean; var desktop: HDESK; begin if IsWinNT() then begin if (name <> nil) then begin //打开指定的桌面 desktop := OpenDesktop(name, 0, FALSE, DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or DESKTOP_WRITEOBJECTS or DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP or GENERIC_WRITE); end else begin //没有指定桌面,所以打开输入桌面 desktop := OpenInputDesktop(0, FALSE, DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or DESKTOP_WRITEOBJECTS or DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP or GENERIC_WRITE); end; WriteLog(IntToStr(desktop)); //打开桌面失败 if (desktop = 0) then begin Result := False; exit; end; //切换到新的桌面 if (not SelectHDESK(desktop)) then if (not CloseDesktop(desktop)) then begin Result := False; exit; end; Result := True; end; Result := (name = nil); end;
procedure TScreenSpy.CtrlAltDelEnt;
var
old_desktop: HDESK;
hwndCtrlAltDel: hwnd;
begin
old_desktop := GetThreadDesktop(GetCurrentThreadId()); SelectDesktop('Winlogon');
hwndCtrlAltDel := FindWindow('SAS window class', 'SAS window');
if hwndCtrlAltDel = 0 then
hwndCtrlAltDel := HWND_BROADCAST;
PostMessage(hwndCtrlAltDel, WM_HOTKEY, 0, MAKELONG(MOD_ALT or MOD_CONTROL, VK_DELETE));
if old_desktop <> 0 then
selecthdesk(old_desktop);
end;
当然可以模拟啊。。你新建一条线程然后把这个线程切换到Winlogon桌面。
function SelectDesktop(name: PChar):Boolean;
var
desktop: HDESK;
begin
if IsWinNT() then
begin
if (name <> nil) then
begin
//打开指定的桌面
desktop := OpenDesktop(name, 0, FALSE,
DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or
DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or
DESKTOP_WRITEOBJECTS or DESKTOP_READOBJECTS or
DESKTOP_SWITCHDESKTOP or GENERIC_WRITE);
end else
begin
//没有指定桌面,所以打开输入桌面
desktop := OpenInputDesktop(0, FALSE,
DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or
DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or
DESKTOP_WRITEOBJECTS or DESKTOP_READOBJECTS or
DESKTOP_SWITCHDESKTOP or GENERIC_WRITE);
end;
WriteLog(IntToStr(desktop));
//打开桌面失败
if (desktop = 0) then
begin
Result := False;
exit;
end; //切换到新的桌面
if (not SelectHDESK(desktop)) then
if (not CloseDesktop(desktop)) then
begin
Result := False;
exit;
end;
Result := True;
end;
Result := (name = nil);
end;