Перевод компа в спящий режим (C++)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Noman, 20 Apr 2007.

  1. Noman

    Noman Elder - Старейшина

    Joined:
    10 Oct 2006
    Messages:
    112
    Likes Received:
    23
    Reputations:
    2
    Ребят, подскажите решение следующей проблемы:
    Для перехода компа в спящий одно приложение надо выгружать. Решил написать программку, чтобы можно было одним нажатием убивать выбранный процесс и переходить в спящий.
    Проблема в том, что я не знаю, какой функцией пользоваться для убивания процесса и перехода в спящий. Если выполнять это средствами MSDOS, то тогда понятно:
    Code:
    taskkill /IM имя.exe
    rundll32.exe powrprof.dll,SetSuspendState
    Как это можно выполнить средствами C++?
     
  2. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,194
    Reputations:
    252
    Гы, получается ты ничего не знаешь т.к. вся твоя программа в этом и состоит :)
     
  3. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Напишите за меня прогу=)
     
  4. Noman

    Noman Elder - Старейшина

    Joined:
    10 Oct 2006
    Messages:
    112
    Likes Received:
    23
    Reputations:
    2
    Эээ... Ну почти что так :)
    Не, писать за меня не надо. Меня интересует, с помощью какой ф-ции можно выполинить вышеуказанные действия.
    Для завершения процесса вроде TerminateProcess(),
    А для того, чтобы его усыпить?
     
  5. os1r1s

    os1r1s Elder - Старейшина

    Joined:
    2 Feb 2007
    Messages:
    18
    Likes Received:
    28
    Reputations:
    -4
    Вызов функции Windows API "SetSuspendState" для перехода в ждущий или спящий режим.
    ; Windows 95/NT4: поскольку этой функции нет, последующий код не произведёт эффекта.
    ; Параметр №1: 1 - спящий, 0 - ждущий.
    ; Параметр №2: 1 - ждущий режим немедленно, 0 - опросить все приложения о разрешении.
    ; Параметр №3: 1 - все "пробуждающие" события отключены, 0 - включены.

    http://msdn2.microsoft.com/en-us/library/aa373201.aspx
     
    #5 os1r1s, 20 Apr 2007
    Last edited: 20 Apr 2007
    1 person likes this.
  6. da_ff

    da_ff Elder - Старейшина

    Joined:
    11 Jul 2006
    Messages:
    118
    Likes Received:
    22
    Reputations:
    26
    а что значит усыпить процес?
     
  7. Noman

    Noman Elder - Старейшина

    Joined:
    10 Oct 2006
    Messages:
    112
    Likes Received:
    23
    Reputations:
    2
    С убийством процесса я разобрался.
    os1r1s спасибо за помощь.

    Ребят, я может совсем идиот, но все же - подскажите откуда мне взять PowrProf.lib

    Не процесс))) Комп.
     
  8. bxN5

    bxN5 Elder - Старейшина

    Joined:
    8 Jan 2006
    Messages:
    687
    Likes Received:
    138
    Reputations:
    32
    Средствами с++ функии main можно вызывать аргументы смд.Т.е вроде реально в с++ выполнить taskkill /IM имя.exe
    rundll32.exe powrprof.dll,SetSuspendState это.Так теория.... Я только учусь
     
  9. Noman

    Noman Elder - Старейшина

    Joined:
    10 Oct 2006
    Messages:
    112
    Likes Received:
    23
    Reputations:
    2
    Да, это вроде возможно. Но хотелось бы выполнить используя winapi, ведь в самой винде это выполнено.
    Проблема в том, что я никак не соображу где найти нужную библиотеку....
     
  10. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    GetProcAddress(LoadLibrary("PowrProf.dll"), "SetSuspendState");

    Added: SetSystemPowerState(BOOL fSuspend, BOOL fForce) А эта есть в кернеле32.
     
    #10 hidden, 20 Apr 2007
    Last edited: 20 Apr 2007
  11. Noman

    Noman Elder - Старейшина

    Joined:
    10 Oct 2006
    Messages:
    112
    Likes Received:
    23
    Reputations:
    2
    А я немного по-другому сделал
    Вроде работает.
     
  12. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    BroadcastSystemMessage() c SC_MONITORPOWER рубит монитор например.
     
  13. Noman

    Noman Elder - Старейшина

    Joined:
    10 Oct 2006
    Messages:
    112
    Likes Received:
    23
    Reputations:
    2
    sn0w, спасибо, пригодиться.
    Скоро я наконец допишу прогу, и выложу сюда. Как-никак первая серьезная (ну, немного серьезная) программа =)
    Сейчас пытаюсь сообразить, как сделать ввод данных из ini файла обратно в TEdit и в массив. Вся проблема в том, что эти данные строковые, а значить StrToInt уже не прокатит...
    Кстати, запись в файл выполнена средствами TIniFile (WriteString), и в теории вывод надо делать с помощью ReadString, но как, я пока так и не понял...
     
  14. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Code:
    var
      myini :TIniFile;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      myini := TIniFile.Create('C:\123.ini');
      Edit1.Text := myini.ReadString('MySection', 'MyIdent', 'It is default text')
    end;
    
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      myini.WriteString('MySection', 'MyIdent', Edit1.Text);
      myini.Destroy;
    end;
    )))
     
  15. Noman

    Noman Elder - Старейшина

    Joined:
    10 Oct 2006
    Messages:
    112
    Likes Received:
    23
    Reputations:
    2
    hidden, это если не ошибаюсь делфи? Хотя с с++ они очень похожи. Иными словами получается так:
    Code:
    void __fastcall TSettingBox::FormCreate(TObject *Sender)
    {
    TIniFile *read = new TIniFile( ExtractFilePath( Application->ExeName ) + "data.ini" );
       Edit1->Text = read->ReadString("Options", "Process_1", 0);
       delete read;
    }
    void __fastcall TSettingBox::SaveButtonClick(TObject *Sender)
    {
    TIniFile *ini = new TIniFile( ExtractFilePath( Application->ExeName ) + "data.ini" );
       ini->WriteString("Options", "Process_1", Edit1->Text);
       ini->UpdateFile();
    delete ini;
    }
    
    И должно бы работать... А не работает :(

    Added: вот блин, я дал... Hidden спасибо!!! Я совсем идиот стал))) Взял и поместил ф-ию чтения на кнопку сохранения и закрытия))))) Код исправил, как надо.
    Hidden, еще раз, спасибо)))
     
    #15 Noman, 26 Apr 2007
    Last edited: 26 Apr 2007
  16. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Не посмотрел на заголовак, увидел что юзаешь TIniFile и WriteString, а видел я их только в Delphi)), не думал что в С++ точно так-же называется))), так-как в последнее время только на API пишу)))
     
    1 person likes this.
  17. Noman

    Noman Elder - Старейшина

    Joined:
    10 Oct 2006
    Messages:
    112
    Likes Received:
    23
    Reputations:
    2
    Хех, весь инет облазил, а помог родной аЧат =)))

    2Hidden, я сам на делфи не работал, но сейчас, когда искал нужный мне материал часто сталкивался, и пришел к выводу, что они очень похожи. Разумееется мое мнение мнение очень поверхностно, но на первый взгляд отличие только в операторах объявления.

    На API? Ммм... Такой вопрос, я нашел код для убийства процесса такого вида:
    Code:
    
    //По имени ехе узнаем пид процесса
    DWORD GetProcessByExeName(AnsiString ExeN)
    {
    DWORD id;
    HANDLE hProcessSnap = NULL;
    PROCESSENTRY32 pe32 = {0};
    AnsiString temp="";
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    pe32.dwSize=sizeof(PROCESSENTRY32);
    if(Process32First(hProcessSnap,&pe32)) temp = pe32.szExeFile;
    pe32.dwSize=sizeof(PROCESSENTRY32);
    while(Process32Next(hProcessSnap,&pe32))
    {
    temp = pe32.szExeFile;
    pe32.dwSize = sizeof(PROCESSENTRY32);
    if (temp == ExeN)
    {
    id = pe32.th32ProcessID;
    CloseHandle(hProcessSnap);
    return id;
    }
    }
    CloseHandle(hProcessSnap);
    MessageBox(NULL, "Процесс не найден!", "Внимание!", MB_OK|MB_ICONWARNING);
    return false;
    }
    //Зная пид убиваем процесс
    bool KillProcByPid(DWORD id)
    {
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, id);
    if(INVALID_HANDLE_VALUE != hProcess)
    {
    TerminateProcess(hProcess, 0);
    CloseHandle(hProcess);
    }
    return 0;
    }
    {
    AnsiString ExeName; //имя ехе
    DWORD Pid = 0; // PID процесса
    ExeName = "process.exe";
    Pid = GetProcessByExeName(ExeName);
    KillProcByPid(Pid);
    { 
    
    Но его минус в том, что его можно использовать только для уничтожения одного процесса. А мне нужно на несколько. Я написал на один форум по C++, и там мне ответили, что можно воспользоваться broadcast'ом.
    Почитал на сайте мелкомягких про это, но толком ничего не понял. Можешь объяснить, что это такое?
     
  18. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Ты не это читал?: http://msdn2.microsoft.com/en-us/library/ms686722.aspx
    Никогда этим не пользовался, но думаю что-то вроде этого:
    Code:
    BroadcastSystemMessage(BSF_IGNORECURRENTTASK + BSF_NOTIMEOUTIFNOTHUNG, BSM_APPLICATIONS, WM_DESTROY, 0, 0);
    По идее, оно разошлёт сообщения о завершении(WM_DESTROY, 0, 0) всем приложениям(BSM_APPLICATIONS), имеющие окна(включая невидимые), кроме себя(BSF_IGNORECURRENTTASK), затем дождётся завершения их всех(BSF_NOTIMEOUTIFNOTHUNG)
     
  19. Noman

    Noman Elder - Старейшина

    Joined:
    10 Oct 2006
    Messages:
    112
    Likes Received:
    23
    Reputations:
    2
    2hidden, спасибо. Буду пробовать =)
     
  20. Noman

    Noman Elder - Старейшина

    Joined:
    10 Oct 2006
    Messages:
    112
    Likes Received:
    23
    Reputations:
    2
    Спустя 2 недели я все-таки добрался доделать прогу, и как и обещал, выкладываю ссылку сюда. Там же и ее исходники. Сильно не пинайте =)
    _http://winsource.mirahost.ru/moi-programmy/rubilnik-ver-10-beta/
     
    1 person likes this.