SetSystemPowerState - в чем я неправ?

Тема в разделе "MS Visual C++", создана пользователем vitfil, 29 июн 2004.

  1. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Код (Text):
    #include<windows.h>

    void main(){
    if (SetSystemPowerState(false,true)){
      return;
    }
    return;
    }
    компилится без ошибок (компилятор от борланда). Запускаю программу - ничего не происходит. в чем я не прав?
     
  2. admin

    admin Well-Known Member

    Регистрация:
    8 авг 2003
    Сообщения:
    2.811
    Симпатии:
    0
    vitfil
    так а привелегий хватает? и ACPI настроено нормально?
     
  3. Serge

    Serge Гость

    Вообще тут может следующее:
    SetSystemPowerState сработает тогда, когда все задачи подтвердят о готовности прекратить работу, но если этого не происходит, то она возвращает false и посылает всем приложениям и драйверам сообщение, PBT_APMQUERYSUSPENDFAILED, уведомляющее все приложения о том, что остановка отклонена каким либо приложением или драйвером. Просто, попробуйте выполнить SetSystemPowerState(false,false), а когда она вернет истину, выполните с SetSystemPowerState(false,true). Если так не сработает, то у вас на машине висит программа, которая постоянно задействует процессор в привилегии выше средней. Думаю, что так.
     
  4. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    С этим уже разобрался. привелегий не хватало. кому интересно:
    Код (Text):
    #include <stdio.h>
    #include <windows.h>
    #include <tlhelp32.h>
    #include <vdmdbg.h>
    #include <tchar.h>
    #include <process.h>
    BOOL MySystemSleep()
    {
     HANDLE hToken;
     TOKEN_PRIVILEGES tkp;

     BOOL fResult;

     if (!OpenProcessToken(GetCurrentProcess(),
       TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
      return FALSE;

     LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
       &tkp.Privileges[0].Luid);

     tkp.PrivilegeCount = 1;
     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

     AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
      (PTOKEN_PRIVILEGES) NULL, 0);

     if (GetLastError() != ERROR_SUCCESS)
      return FALSE;

     fResult = SetSystemPowerState(FALSE,TRUE);

     if (!fResult)
      return FALSE;

     tkp.Privileges[0].Attributes = 0;
     AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
       (PTOKEN_PRIVILEGES) NULL, 0);

     return TRUE;
    }
    int main(){
    if (MySystemSleep())
    return 0;
    return 1;
    }
    Теперь вопрос в другом. Как обновить трей? Пробовал:
    Код (Text):
    HWND
    hWnd(FindWindowEx(FindWindowEx(FindWindow("Shell_TrayWnd", ""), 0, "TrayNotifyWnd", ""), 0, "ToolbarWindow32", ""));
    for ( int xx(2+8), yy(2+8); xx < 1024; xx += 16 ){
     PostMessage(hWnd, WM_MOUSEMOVE, 0, MAKELPARAM(xx, yy));
    }
    В 2000 работает, а в ХР - нет.
     
  5. Serge

    Serge Гость

    Может попробовать через SendMessage, для пущей убедительности в критические секции загнать?
     
Загрузка...

Поделиться этой страницей