На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> управление питанием РС , как это проделать
    доброе время суток.

    подскажите как с помощью АРI реализовать такие функции управления питание ПК так что б они работали и работали ПРАВИЛЬНО во всех WIN32.
    функции такие:
    1. выключить ПК
    2. перезагрузить ПК
    3. завершить сеанс пользователя
    4. ждущий режим
    5. спящий режим



    смотрел в DRKB и в ФАКах: те примеры работают только под ОКНА 98/МЕ и то не правильно. основное внимание надо дать ХР/2К/2003

    спасибо за помощь.
    Сообщение отредактировано: Skynet -
      Исходники не дам.

      Вот функции:
      АctionModule index 3 name 'ActionModule', // procedure ActionModule(mAction:PChar);
      AboutModule index 4 name 'AboutModule'; // function AboutModule:PChar;

      Вот команды (mAction:PChar)
      'POWEROFF', - Выключить питание
      'REBOOT', - Перезагрузить компьютер
      'LOGOFF', - Завершить сеанс пользователя
      'MONOFF', - Выключить монитор
      'SLEEPA', - Ждущий режим
      'SLEEPB' - Спящий режим


      Работает на всех виндозов
      Прикреплённый файлПрикреплённый файлPower.dll (25.5 Кбайт, скачиваний: 255)
        а на 98 не работает PowerOff! в чем проблемма? как это исправить? какой 98 (SE или нет) не знаю?
          Цитата Skynet @
          а на 98 не работает PowerOff! в чем проблемма? как это исправить? какой 98 (SE или нет) не знаю?


          'POWEROFF', - Выключить питание
          'REBOOT', - Перезагрузить компьютер
          'LOGOFF', - Завершить сеанс пользователя
          'MONOFF', - Выключить монитор

          Работают и в 9x и в Nt.

          А

          'SLEEPA', - Ждущий режим
          'SLEEPB' - Спящий режим

          Только в Nt, тк поддержка таких функций в 9x не встроены.
            Исправлено.
            Полностью работает и в Nt и в 9x.

            Слегка модифицированный модуль.

            ExpandedWrap disabled
               function GetAutor:PChar;       stdcall; index 1 external 'Power.dll';
               function GetVersion:PChar;     stdcall; index 2 external 'Power.dll';
               function GetInfo:PChar;        stdcall; index 4 external 'Power.dll';
               function GetDisplayName:PChar; stdcall; index 5 external 'Power.dll';
               
               function ModAction(const Action:PChar):PChar; stdcall; index 8 external 'Power.dll';


            Команда Action:
            'POWEROFF' - Выключение питания
            'REBOOT' - Перезагрузка
            'LOGOOFF' - Завершение сеанса
            'MONOFF' - Выключения монитора
            'SLEEP1' - Ждущий режим
            'SLEEP2' - Спящий режим
            'MINALLWINDOW' - Свернуть все окна // Тестированный вариант. Может не работать
            'FORCE' - Форсированное выполнение команд:
            'POWEROFF'
            'REBOOT'
            'LOGOOFF'
            Суть:
            Модуль записывает в рееср значение.
            При вызове одной из этих 3х функций получает из реестра значение.
            То Если вызвали один раз - модуль записывает значение 1
            Если 2 и более, то записывает значение 0 и тд (1..0..1..0)

            Значение (0/1):
            Тип Reg_Binary
            RootKey HKey_Current_User
            SubKey 'Software\n0wheremany\VolumeC\Plugins';
            Key 'Power_ForseAction';

            Модуль к программе VolumeC
            http://www.nowhere10.russian.ru/content/volumec.html

            Добавлено
            Да к стати Модуль в Result выдаёт ошибку вида 'SMessage'TEXT, где TEXT-текст ошибки. в случае нормального выполнения - ''
            Прикреплённый файлПрикреплённый файлPower.dll (24 Кбайт, скачиваний: 254)
              OFFTOP:
              С указанной ссылки, download VolumeC ведет в никуда! Очень хотелось взглянуть на VolumeC. :(
              И опять-же на указанном сайте не нашел как связаться с автором программы/сайта. Поэтому пишу об этом сюда.
                Цитата Петрович @
                С указанной ссылки, download VolumeC ведет в никуда! Очень хотелось взглянуть на VolumeC


                Пока программа находится в разработе. Гдето Чз неделю доделаю.

                russian.ru - реально глючный сервак. может съел этот файл. в скором времени сайт переедет.

                Если что пиши на nowhere10@russian.ru.
                  Цитата n0wheremany @
                  Исходники не дам.

                  Что за блажь? Нафига писать целую библиотеку? А если вот тут посмотреть: Перезагрузка/выключение Windows. Как?
                    Rouse_ - это не блаж, бублиотека идёт как модуль к программе.

                    s-mike - host russian вообще закрыли по ходу а bip пока не выклал файлы.
                    Ссылка под каждым моим сообщением.
                      Блин, но какой смысл выделять код из 5 тире 15-ти строк в виде отдельной библиотеки? Типа это круто?
                        Цитата n0wheremany @
                        Ссылка под каждым моим сообщением

                        А ты сам-то по своей ссылке на VolumeC ходить пробовал?
                          Rouse_ - а зачем тогда палагины к программам? Пускай все программы будут тогда без них и если нужно чтото добавить надо будет прогу заново компилить, не нужно будет скачивать допустим палагин, а надо будет скачивать поностью прогу...

                          Петрович - пробовал, всё ок.

                          Если не канает Вот держи : http://n0where10.bip.ru/Content/volumec.html
                            Цитата Rouse_ @
                            Что за блажь? Нафига писать целую библиотеку? А если вот тут посмотреть: Перезагрузка/выключение Windows. Как?

                            а вот почему
                            Цитата Skynet @
                            3. завершить сеанс пользователя
                            4. ждущий режим
                            5. спящий режим



                            Цитата Rouse_ @
                            Блин, но какой смысл выделять код из 5 тире 15-ти строк в виде отдельной библиотеки? Типа это круто?


                            если не круто опубликуй код 8-)
                              Цитата Skynet @
                              если не круто опубликуй код

                              А по ссылочке в FAQ уже лень сходить?
                              Жми сюда: Перезагрузка/выключение Windows. Как?

                              Добавлено
                              Цитата n0wheremany @
                              Rouse_ - а зачем тогда палагины к программам?

                              А это разве плагин? А где стандартизация интерфейся плагина?
                                Цитата Rouse_ @
                                Цитата (Skynet @ Сегодня, 12:40)
                                если не круто опубликуй код

                                А по ссылочке в FAQ уже лень сходить?
                                Жми сюда: Перезагрузка/выключение Windows. Как?



                                эту ссылку я и раньше смотрел!

                                но она работае !!!не всегда и не везде!!!. и там нет
                                Цитата Skynet @
                                4. ждущий режим
                                5. спящий режим
                                .

                                а библой все работает отлично.

                                если ты другово мнения напиши аналог этой библиотеки и выложи исходник, я буду очень благодерен, потому как в 2000 Винде возникают проблемы с нахождением библиотеки.!!!
                                  Лови:

                                  ExpandedWrap disabled
                                    unit Unit1;
                                     
                                    interface
                                     
                                    uses
                                      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
                                      Dialogs, StdCtrls;
                                     
                                    type
                                      TForm1 = class(TForm)
                                        Button1: TButton;
                                        Button2: TButton;
                                        Button3: TButton;
                                        Button4: TButton;
                                        Button5: TButton;
                                        procedure Button1Click(Sender: TObject);
                                        procedure Button2Click(Sender: TObject);
                                        procedure FormCreate(Sender: TObject);
                                        procedure Button3Click(Sender: TObject);
                                        procedure Button4Click(Sender: TObject);
                                        procedure Button5Click(Sender: TObject);
                                      end;
                                     
                                    var
                                      Form1: TForm1;
                                     
                                    implementation
                                     
                                    {$R *.dfm}
                                     
                                    function SetPrivilege(aPrivilegeName: String; aEnabled: Boolean): Boolean;
                                    var
                                      TPPrev,TP: TTokenPrivileges;
                                      Token: THandle;
                                      dwRetLen: DWord;
                                    begin
                                      Result:=False;
                                      OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token);
                                      TP.PrivilegeCount := 1;
                                      if LookupPrivilegeValue(nil, PChar(aPrivilegeName), TP.Privileges[0].LUID) then
                                      begin
                                        if aEnabled then
                                          TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
                                        else
                                          TP.Privileges[0].Attributes := 0;
                                       dwRetLen := 0;
                                       Result:=AdjustTokenPrivileges(Token, False, TP, SizeOf(TPPrev), TPPrev, dwRetLen);
                                      end;
                                      CloseHandle(Token);
                                    end;
                                     
                                    procedure TForm1.FormCreate(Sender: TObject);
                                    begin
                                      SetPrivilege('SeShutdownPrivilege', True);
                                    end;
                                     
                                    // Выключить комп
                                    procedure TForm1.Button1Click(Sender: TObject);
                                    begin
                                      ExitWindowsEx(EWX_POWEROFF, 0);
                                    end;
                                     
                                    // Перезагрузить
                                    procedure TForm1.Button2Click(Sender: TObject);
                                    begin
                                      ExitWindowsEx(EWX_REBOOT, 0)
                                    end;
                                     
                                    // Завершить сеанс
                                    procedure TForm1.Button3Click(Sender: TObject);
                                    begin
                                      ExitWindows(EWX_LOGOFF, 0)
                                    end;
                                     
                                    // Ждущий режим
                                    procedure TForm1.Button4Click(Sender: TObject);
                                    begin
                                      SetSystemPowerState(True, False);
                                    end;
                                     
                                    // Спящий режим
                                    procedure TForm1.Button5Click(Sender: TObject);
                                    begin
                                     SetSystemPowerState(False, False);
                                    end;
                                     
                                    end.
                                    А у меня такой вопрос - как запретить системе впадать в sleep ?
                                    Программно, в смысле ?
                                      Цитата n0wheremany @
                                      Петрович - пробовал, всё ок

                                      Да, теперь почти хорошо. Почему почти? Да потому что ссылка на темы (http://n0where10.bip.ru/Download/themes.exe) висячая. :)
                                        Цитата WildBear @
                                        А у меня такой вопрос - как запретить системе впадать в sleep ?

                                        Хм, могу ошибиться, но боюсь из User Mode это не возможно...
                                          Петрович - не висячая, а просто сервак на Unixe a я прогил на Windows >> В Unixe файлы с разным регистром - разные файлы в отличии от Windows. Всё равно уже исправил.

                                          Rouse_ [Хм, могу ошибиться, но боюсь из User Mode это не возможно... ] А можно подменой в библиотеке?
                                            Rouse_ тот исходник что ты выложил работает не весь.
                                            в 98 не работает "Выключение" программа виполняет ЛогОфф. как это исправить?
                                            если возможно исправь. а вообщето написано хорошо и просто. 8-)
                                              Skynet - возможно ты чтото напутал с флагами... Для выключения используется флаг EWX_POWEROFF
                                                n0wheremany с флагами ничего не напутано!
                                                просто работает не правильно. а почему, не въеду... :huh:
                                                как ты писал в своей библе???
                                                  сообщение №23 это мое.
                                                  просто я заигрался немного :wacko:
                                                    Используешь ExitWindowsEx или ExitWindows?
                                                      Rouse_
                                                      как ты выложил так и пользую.
                                                      а есть разница???
                                                      если да то как правильно программно определить какая Винда установленна (NT/2000/XP или 95/98/ME)& :huh:
                                                      Сообщение отредактировано: Skynet -
                                                        ExpandedWrap disabled
                                                          function IsWindowsNT:boolean;
                                                          var osVerInfo : TOSVersionInfo;
                                                          begin
                                                           result := false;
                                                           osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
                                                           if GetVersionEx(osVerInfo) then
                                                            if osVerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then
                                                             result := true;
                                                          end;


                                                        Я использовал EWX_SHUTDOWN.

                                                        Да кстати Rouse_ читал когдпто EWX_POWEROFF типа выходит к экрану типа "выключите теперь комп", это так?
                                                        Почемута у меня в любом слючае работает, а когда даёш кому нид другому вылетает такая хрень.
                                                          Цитата n0wheremany @
                                                          Да кстати Rouse_ читал когдпто EWX_POWEROFF типа выходит к экрану типа "выключите теперь комп", это так?

                                                          Нужно эксперементировать, точно не смогу сказать...


                                                          Цитата Skynet @
                                                          как правильно программно определить какая Винда установленна

                                                          ExpandedWrap disabled
                                                            unit Unit1;
                                                             
                                                            interface
                                                             
                                                            uses
                                                              Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
                                                              Dialogs, Registry, StdCtrls;
                                                             
                                                            type
                                                              _OSVERSIONINFOEX = record
                                                                dwOSVersionInfoSize : DWORD;
                                                                dwMajorVersion      : DWORD;
                                                                dwMinorVersion      : DWORD;
                                                                dwBuildNumber       : DWORD;
                                                                dwPlatformId        : DWORD;
                                                                szCSDVersion        : array[0..127] of AnsiChar;
                                                                wServicePackMajor   : WORD;
                                                                wServicePackMinor   : WORD;
                                                                wSuiteMask          : WORD;
                                                                wProductType        : BYTE;
                                                                wReserved           : BYTE;
                                                              end;
                                                              TOSVERSIONINFOEX = _OSVERSIONINFOEX;
                                                             
                                                              TForm1 = class(TForm)
                                                                Button1: TButton;
                                                                procedure Button1Click(Sender: TObject);
                                                              end;
                                                             
                                                              function GetVersionExA(var lpVersionInformation: TOSVersionInfoEX): BOOL; stdcall;
                                                                external kernel32;
                                                             
                                                            const
                                                              VER_NT_WORKSTATION    :Integer = 1;
                                                              VER_SUITE_ENTERPRISE  :Integer = 2;
                                                              VER_NT_SERVER         :Integer = 3;
                                                              VER_SUITE_DATACENTER  :Integer = 128;
                                                              VER_SUITE_PERSONAL    :Integer = 512;
                                                             
                                                            var
                                                              Form1: TForm1;
                                                             
                                                            implementation
                                                             
                                                            {$R *.dfm}
                                                             
                                                            function OSInfo:String;
                                                            var
                                                              NTBres, BRes: Boolean;
                                                              OSVI: TOSVERSIONINFO;
                                                              OSVI_NT: TOSVERSIONINFOEX;
                                                              TmpStr: String;
                                                            begin
                                                              Result := 'Error';
                                                              NTBRes := False;
                                                              try
                                                                OSVI_NT.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFOEX);
                                                                NTBRes := GetVersionExA(OSVI_NT);
                                                                OSVI.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
                                                                BRes := GetVersionEx(OSVI);
                                                              except
                                                                OSVI.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
                                                                BRes := GetVersionEx(OSVI);
                                                              end;
                                                              if (not BRes) and (not NTBres) then Exit;
                                                              Move(OSVI, OSVI_NT, SizeOf(TOSVersionInfo));
                                                             
                                                              case OSVI_NT.dwPlatformId of
                                                                VER_PLATFORM_WIN32_NT:
                                                                begin
                                                                  if OSVI_NT.dwMajorVersion <= 4 then Result := 'Windows NT ';
                                                                  if  (OSVI_NT.dwMajorVersion = 5) and
                                                                    (OSVI_NT.dwMinorVersion = 0) then Result := 'Windows 2000 ';
                                                                  if  (OSVI_NT.dwMajorVersion = 5) and
                                                                    (OSVI_NT.dwMinorVersion = 1) then Result := 'Windows XP ';
                                                                  if NTBres then
                                                                  begin
                                                                    if OSVI_NT.wProductType = VER_NT_WORKSTATION then
                                                                    begin
                                                                      if OSVI_NT.wSuiteMask = VER_SUITE_PERSONAL then
                                                                        Result := Result + 'Personal'
                                                                      else
                                                                        Result := Result + 'Professional';
                                                                    end
                                                                    else
                                                                      if OSVI_NT.wProductType = VER_NT_SERVER then
                                                                      begin
                                                                        if OSVI_NT.wSuiteMask = VER_SUITE_DATACENTER then
                                                                          Result := Result + 'DataCenter Server'
                                                                        else
                                                                          if OSVI_NT.wSuiteMask = VER_SUITE_ENTERPRISE then
                                                                            Result :=  Result + 'Advanced Server'
                                                                          else
                                                                            Result := Result + 'Server';
                                                                    end;
                                                                  end
                                                                  else
                                                                  begin
                                                                    with TRegistry.Create do
                                                                    try
                                                                      RootKey := HKEY_LOCAL_MACHINE;
                                                                      if OpenKeyReadOnly('SYSTEM\CurrentControlSet\Control\ProductOptions') then
                                                                      try
                                                                        TmpStr := UpperCase(ReadString('ProductType'));
                                                                        if TmpStr = 'WINNT' then
                                                                          Result := Result + 'Workstation';
                                                                        if TmpStr = 'SERVERNT' then
                                                                          Result := Result + 'Server';
                                                                      finally
                                                                        CloseKey;
                                                                      end;
                                                                    finally
                                                                      Free;
                                                                    end;
                                                                  end;
                                                                end;
                                                                VER_PLATFORM_WIN32_WINDOWS :
                                                                begin
                                                                  if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 0) then
                                                                  begin
                                                                    Result := 'Windows 95 ';
                                                                    if OSVI.szCSDVersion[1] = 'C' then
                                                                      Result := Result + 'OSR2';
                                                                  end;
                                                                  if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 10) then
                                                                  begin
                                                                    Result := 'Windows 98 ';
                                                                    if OSVI.szCSDVersion[1] = 'A' then
                                                                      Result := Result + 'SE';
                                                                  end;
                                                                  if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 90) then
                                                                    Result := 'Windows Me';
                                                                end;
                                                                VER_PLATFORM_WIN32s:
                                                                  Result := 'Microsoft Win32s';
                                                              else
                                                                Result := 'Unknown';
                                                              end;      
                                                             
                                                            end;
                                                             
                                                            procedure TForm1.Button1Click(Sender: TObject);
                                                            begin
                                                              ShowMessage(OSInfo);
                                                            end;
                                                             
                                                            end.
                                                            Rouse_
                                                            спасибо тебе за исходник я его себе сохранил. еще раз убеждаюсь в великодушности программистов! ;)
                                                            но есть очень маленькое Но....
                                                            мне ненужен такой огромный код, мне бы всего навсего узнать Винда линейки НТ или нет, для того чтоб знать какой функцией пользоватся. :)
                                                              n0wheremany, вот эту конструкцию
                                                              ExpandedWrap disabled
                                                                  if osVerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then
                                                                   result := true;

                                                              Гораздо красивее и логичнее переписать как:
                                                              ExpandedWrap disabled
                                                                  Result := osVerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT;


                                                              Добавлено
                                                              Цитата Skynet @
                                                              мне ненужен такой огромный код, мне бы всего навсего узнать Винда линейки НТ или нет, для того чтоб знать какой функцией пользоватся

                                                              Есть такая переменная Win32Platform вот какие значения она может примерять:
                                                              Цитата
                                                              VER_PLATFORM_WIN32s System is Win32s.
                                                              VER_PLATFORM_WIN32_WINDOWS System is Windows 95.
                                                              VER_PLATFORM_WIN32_NT System is Windows NT.

                                                              Поэтому тебе достаточно лишь проверять ее состояние не прибегая к написанию своих функций...
                                                                2n0wheremany
                                                                Пробую выклчить монитор используя библиотеку power.dll... выходит ошиПка обращения к памяти...



                                                                Может кто поможет ?
                                                                  n0wheremany, фигассе! Таскать библиотеку 25 кб чтобы выключить/перезагрузить комп... нет уж, спасибо :)

                                                                  Цитата Skynet @
                                                                  мне бы всего навсего узнать Винда линейки НТ или нет

                                                                  Можно ещё так:
                                                                  ExpandedWrap disabled
                                                                    IsWin9xOrMe := (GetVersion and $80000000) <> 0;
                                                                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                                  0 пользователей:


                                                                  Рейтинг@Mail.ru
                                                                  [ Script execution time: 0,0949 ]   [ 15 queries used ]   [ Generated: 8.12.25, 18:58 GMT ]