Re[2]: иконки интерактивных служб под Windows 7
От: kovbas  
Дата: 20.04.11 12:16
Оценка:
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.