Здравствуйте, okman, Вы писали:
O>Здравствуйте, kovbas.
O>Воспользуйтесь поиском по форуму.
O>Сразу ссылок накидаю:
O>http://rsdn.ru/forum/winapi/4149500.aspxАвтор:
Дата: 09.02.11
O>http://rsdn.ru/forum/dotnet/3970406.aspxАвтор: Dan123
Дата: 24.09.10
O>http://rsdn.ru/forum/winapi/4005987.aspxАвтор:
Дата: 20.10.10
O>http://rsdn.ru/forum/winapi/3745539.aspxАвтор: Vis
Дата: 23.03.10
Родил следующий код:
bool SetUserDesktop ()
{
// char buf [256];
HWINSTA hWinstaOriginal = GetProcessWindowStation();
// sprintf (buf, "hWinstaOriginal=0x%x", hWinstaOriginal);
// flog.AddToBuf(buf, true);
HWINSTA hWinstaInteractive = OpenWindowStation("WinSta0", 1, MAXIMUM_ALLOWED);
bool b1 = SetProcessWindowStation(hWinstaInteractive);
// sprintf (buf, "hWinstaOriginal=0x%x SetProcessWindowStation=%d", hWinstaInteractive, b1);
// flog.AddToBuf(buf, false);
HDESK hDesktop = OpenInputDesktop(0, 1/*??*/, MAXIMUM_ALLOWED);
// sprintf (buf, "hDesktop=0x%x", hDesktop);
BOOL b2 = SetProcessWindowStation(hWinstaInteractive);
// sprintf (buf, "SetProcessWindowStation=%d", b2);
// BOOL b4 = 0;
if (!SetThreadDesktop(hDesktop))
{
// sprintf (buf, "SetThreadDesktop() GetLastError=%d", GetLastError());
// flog.AddToBuf(buf, false);
// flog.AppendAndCheckSize();
return false;
}
flog.AddToBuf("Successful SetThreadDesktop()", false);
return true;
// BOOL b = SetProcessWindowStation(hWinstaInteractive);
};
void mainEntry()
{
SetUserDesktop();
DialogBox(g_hinst, MAKEINTRESOURCE(IDD_Metr), NULL, (DLGPROC)TestAppDlgProc);
stopTask=1;
WaitForSingleObject(thread,INFINITE);
}
BOOL CALLBACK TestAppDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HMENU menu;
HWND c;
POINT point;
static int firstrun=1;
switch (uMsg)
{
case WM_INITDIALOG:
{
char buf[32];
// flog.AddToBuf("WM_INITDIALOG\n");
BOOL b1 = SetTimer(hDlg, gShowTimerId, 5000, 0);
Dialog=hDlg;
BOOL b2 = ShowWindow(Dialog, SW_SHOW);
DWORD e = GetLastError();
sprintf(buf, "WM_INITDIALOG: ShowWindow=%d\n", b2);
flog.AddToBuf(buf);
flog.AppendAndCheckSize();
// NotifyAdd(hDlg);
}
break;
...
}
Трассировка показывет, что все в порядке. Запускаю службу под пользователем с системной учетной записью.
Как <Обнаружитель интерактивных служб> реагировал на ShowWindow(), так и реагирует.
ВОПРОС: Как правильно подменить рабочий стол системных служб на рабочий стол залогиненного пользователя в Windows 7 / Vista / 2008