Диалог завершения работы
От: Аноним  
Дата: 18.08.04 04:33
Оценка:
Я думаю, для многих не секрет, что в библиотеке shell32.dll есть функция под номером 60. Но не каждый знает, что эта функция выводит диалог завершения работы ОС.
Так вот, когда я её вызываю — диалог завершения работы выводится, но когда выбираю какое-нибудь действие, то диалог просто закрывается и ничего не происходит.
Почему?


Вот код:


typedef void (_stdcall *SHShutDownDialogProc)(HWND);

if(Надо вывести диалог завершения работы)
{
    // получаем версию
    OSVERSIONINFO osvi;
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&osvi);

    // если 9x, то просто запоминаем в глобальной переменной
    if(osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
    {
        WinVer = VER_PLATFORM_WIN32_WINDOWS;
    }
    // если NT, то устанавливаем привилегии на завершение работы
    else if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
    {
        WinVer = VER_PLATFORM_WIN32_NT;

        HANDLE hToken; 
        TOKEN_PRIVILEGES tkp; 

        if(!OpenProcessToken(GetCurrentProcess(),
            TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
            PrintError("OpenProcessToken");

        if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
            &tkp.Privileges[0].Luid))
            PrintError("LookupPrivilegeValue");

        tkp.PrivilegeCount = 1;            // one privilege to set
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

        if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
            (PTOKEN_PRIVILEGES)NULL, 0))
            PrintError("AdjustTokenPrivileges");
    }
    //иначе ошибка
    else
    {
        MessageBox(0,"Данная версия ОС не поддерживает эту операцию.",
            0,MB_OK|MB_ICONSTOP);
        return 1;
    }


    // ищем в shell32.dll функцию, которая выводит диалог завершения работы
    // и вызываем её
    SHShutDownDialogProc SHShutDownDialog;
    HMODULE hDll;

    hDll = LoadLibrary("shell32.dll");
    if(!hDll)PrintError("LoadLibrary");

    SHShutDownDialog = (SHShutDownDialogProc)GetProcAddress(hDll,(LPCSTR)60);
    if(!SHShutDownDialog)PrintError("GetProcAddress");

    SHShutDownDialog(GetDesktopWindow());
    FreeLibrary(hDll);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.