Пример программы, показывающей работу с VBE Power Management. Эта программа определяет возможности сохранения электроэнергии, и по возможности гасит экран монитора, потом ждет нажатия клавиши и включает монитор. #include #include #include #define ON 0 #define OFF 4 #define STANDBY 1 #define SUSPEND 2 #define REDUCED 8 // Описание функций int SetPowerState(unsigned char); int GetPowerState(unsigned char *); int AnalyseResult(union REGS); int PowerCapabilities(unsigned char *, unsigned char *, unsigned char *); void main(void) { int iResult; unsigned char ucMode, ucModes, ucMinorVer, ucMajorVer; clrscr(); // Определяем возможность управления // энергопотреблением iResult = PowerCapabilities(&ucModes, &ucMajorVer, &ucMinorVer); if( !iResult ) { printf("Версия VBE Power Management %d.%d", ucMajorVer, ucMinorVer); printf("\nДоступны режимы: \n" " STANDBY - %s\n" " SUSPEND - %s\n" " OFF - %s\n" " REDUCES - %s\n", (ucModes & STANDBY) ? "да" : "нет", (ucModes & SUSPEND) ? "да" : "нет", (ucModes & OFF) ? "да" : "нет", (ucModes & REDUCED) ? "да" : "нет"); } else if( iResult < 0 ) { printf( "\nВозможность управления " "энергопотреблением недоступна"); return; } else if( iResult > 0 ) { printf( "\nОшибка при вызове функции VBE Power " "Management"); return; } // Определяем текущий режим iResult = GetPowerState(&ucMode); printf( "\nФункция GetPowerState возвращает %d", iResult); printf( "\nGetPowerState = %x", ucMode); printf( "\nТекущий режим: %s\n", !ucMode ? "ON" : ucMode == 1 ? "STANDBY" : ucMode == 2 ? "SUSPEND" : ucMode == 4 ? "OFF" : ucMode == 8 ? "REDUCED ON" : "Неопределен" ); printf( "\nПосле нажатия на клавиатуру гасим " "изображение (режим STANDBY)" "\nДля продолжения работы нажмите любую " "клавишу"); getch(); // Ожидаем нажатия клавиши // Гасим экран монитора iResult = SetPowerState(STANDBY); printf( "\nФункция SetPowerState(STANDBY) " "возвращает %d", iResult); getch(); // Ждем нажатия клавиши // Включаем монитор iResult = SetPowerState(ON); printf( "\nФункция SetPowerState(ON) возвращает " "%d", iResult); return; } int SetPowerState(unsigned char ucMode) { union REGS regs; int iResult; regs.h.ah = 0x4F; regs.h.al = 0x10; regs.h.bl = 1; regs.h.bh = ucMode; int86(0x10, ®s, ®s); iResult = AnalyseResult(regs); return iResult; } int GetPowerState(unsigned char *ucMode) { union REGS regs; int iResult; regs.h.ah = 0x4F; regs.h.al = 0x10; regs.h.bl = 2; int86(0x10, ®s, ®s); *ucMode = regs.h.bh; iResult = AnalyseResult(regs); return iResult; } int PowerCapabilities(unsigned char *ucModes, unsigned char *ucMajorVer, unsigned char *ucMinorVer) { union REGS regs; struct SREGS segregs; int iResult; regs.h.ah = 0x4F; regs.h.al = 0x10; regs.h.bl = 0; segregs.es = 0; regs.x.di = 0; int86x(0x10, ®s, ®s, &segregs); *ucModes = regs.h.bh; *ucMinorVer = regs.h.bl & 0x0F; *ucMajorVer = (regs.h.bl & 0xF0) >> 4; iResult = AnalyseResult(regs); return iResult; } int AnalyseResult(union REGS regs) { int iResult; // Функция VBE Power Management завершилась успешно if( regs.h.al == 0x4F && !regs.h.ah ) iResult = 0; // Функция недоступна else if( regs.h.al != 0x4F ) iResult = -1; // Ошибка при выполнении функции else iResult = 1; return iResult; }