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

vitfil

IT-интегратор
02.04.2004
2 062
0
#1
Код:
#include<windows.h>

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

admin

Well-known member
08.08.2003
2 754
0
#2
vitfil
так а привелегий хватает? и ACPI настроено нормально?
 
S

Serge

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

vitfil

IT-интегратор
02.04.2004
2 062
0
#4
С этим уже разобрался. привелегий не хватало. кому интересно:
Код:
#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;
}
Теперь вопрос в другом. Как обновить трей? Пробовал:
Код:
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 работает, а в ХР - нет.
 
S

Serge

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