#define WIn32_LEAN_AND_MEAN #include #include int __cdecl wmain(int argc, wchar_t** argv) { if(argc > 1) { TCHAR* slashChar = wcschr(argv[1], L'\\'); HWINSTA hObject = NULL; if(slashChar) { const int charsInWinSta = (slashChar - argv[1]); WCHAR* winsta = (WCHAR*)LocalAlloc(LPTR, (charsInWinSta + 1) * sizeof(WCHAR)); WCHAR* desk = StrDup(slashChar + 1); if(winsta && desk) { HWINSTA hWin = NULL; StrCpyN(winsta, argv[1], charsInWinSta + 1); winsta[charsInWinSta] = 0; hWin = OpenWindowStation(winsta, FALSE, READ_CONTROL); if(hWin) { if(SetProcessWindowStation(hWin)) { HDESK hDesk = OpenDesktop(desk, 0, FALSE, DESKTOP_SWITCHDESKTOP); if(!hDesk) { wprintf(L"Couldn't open %s desktop\n", desk); } else { SwitchDesktop(hDesk); CloseDesktop(hDesk); } } CloseWindowStation(hWin); } else { wprintf(L"Couldn't open %s WindowStation\n", winsta); } LocalFree(winsta); LocalFree(desk); } else { LocalFree(winsta); _putws(L"Error out of memory"); } } else { HDESK hDesk = OpenDesktop(argv[1], 0, FALSE, DESKTOP_SWITCHDESKTOP); if(!hDesk) { wprintf(L"Couldn't open %s desktop\n", argv[1]); } else { SwitchDesktop(hDesk); CloseDesktop(hDesk); } } } else { puts("Usage: DeskSwitcher [desktop]"); } return 0; }