b7a9415a58
The intent is to avoid a problem on Windows XP. On that OS, sending a "Select All" command to freeze one console window also interrupts any "window activity" (e.g. moving/closing/scrolling/right-clicking/...) on all other console windows. My hope is that putting the console into a special window station will isolate it enough to avoid this problem. I noticed that the problem didn't happen when I ran the TestNetServer as a service, which ran both the TestNetServer and Agent processes with a special window station. Note that even though the Agent runs in a special window station, the shell and its children run in the normal window station.
79 lines
2.0 KiB
C++
79 lines
2.0 KiB
C++
/*
|
|
* Creates a window station and starts a process under it. The new process
|
|
* also gets a new console.
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
int main()
|
|
{
|
|
BOOL success;
|
|
|
|
SECURITY_ATTRIBUTES sa;
|
|
memset(&sa, 0, sizeof(sa));
|
|
sa.bInheritHandle = TRUE;
|
|
|
|
HWINSTA originalStation = GetProcessWindowStation();
|
|
printf("originalStation == 0x%x\n", originalStation);
|
|
HWINSTA station = CreateWindowStation(NULL,
|
|
0,
|
|
WINSTA_ALL_ACCESS,
|
|
&sa);
|
|
printf("station == 0x%x\n", station);
|
|
if (!SetProcessWindowStation(station))
|
|
printf("SetWindowStation failed!\n");
|
|
HDESK desktop = CreateDesktop("Default", NULL, NULL,
|
|
/*dwFlags=*/0, GENERIC_ALL,
|
|
&sa);
|
|
printf("desktop = 0x%x\n", desktop);
|
|
|
|
char stationName[256];
|
|
stationName[0] = '\0';
|
|
success = GetUserObjectInformation(station, UOI_NAME,
|
|
stationName, sizeof(stationName),
|
|
NULL);
|
|
printf("stationName = [%s]\n", stationName);
|
|
|
|
char startupDesktop[256];
|
|
sprintf(startupDesktop, "%s\\Default", stationName);
|
|
|
|
STARTUPINFO sui;
|
|
PROCESS_INFORMATION pi;
|
|
memset(&sui, 0, sizeof(sui));
|
|
memset(&pi, 0, sizeof(pi));
|
|
sui.cb = sizeof(STARTUPINFO);
|
|
sui.lpDesktop = startupDesktop;
|
|
|
|
// Start a cmd subprocess, and have it start its own cmd subprocess.
|
|
// Both subprocesses will connect to the same non-interactive window
|
|
// station.
|
|
|
|
const char program[] = "c:\\windows\\system32\\cmd.exe";
|
|
char cmdline[256];
|
|
sprintf(cmdline, "%s /c cmd", program);
|
|
success = CreateProcess(program,
|
|
cmdline,
|
|
NULL,
|
|
NULL,
|
|
/*bInheritHandles=*/FALSE,
|
|
/*dwCreationFlags=*/CREATE_NEW_CONSOLE,
|
|
NULL, NULL,
|
|
&sui,
|
|
&pi);
|
|
|
|
printf("pid == %d\n", pi.dwProcessId);
|
|
|
|
// This sleep is necessary. We must give the child enough time to
|
|
// connect to the specified window station.
|
|
Sleep(5000);
|
|
|
|
SetProcessWindowStation(originalStation);
|
|
CloseWindowStation(station);
|
|
CloseDesktop(desktop);
|
|
Sleep(5000);
|
|
|
|
return 0;
|
|
}
|