Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Перевод компа в спящий режим (C++) (https://forum.antichat.xyz/showthread.php?t=38416)

Noman 20.04.2007 15:07

Перевод компа в спящий режим (C++)
 
Ребят, подскажите решение следующей проблемы:
Для перехода компа в спящий одно приложение надо выгружать. Решил написать программку, чтобы можно было одним нажатием убивать выбранный процесс и переходить в спящий.
Проблема в том, что я не знаю, какой функцией пользоваться для убивания процесса и перехода в спящий. Если выполнять это средствами MSDOS, то тогда понятно:
Код:

taskkill /IM имя.exe
rundll32.exe powrprof.dll,SetSuspendState

Как это можно выполнить средствами C++?

Isis 20.04.2007 15:56

Гы, получается ты ничего не знаешь т.к. вся твоя программа в этом и состоит :)

Fata1ex 20.04.2007 16:04

Цитата:

Решил написать программку, чтобы можно было одним нажатием убивать выбранный процесс и переходить в спящий.
Проблема в том, что я не знаю, какой функцией пользоваться для убивания процесса и перехода в спящий.
Напишите за меня прогу=)

Noman 20.04.2007 16:13

Цитата:

Гы, получается ты ничего не знаешь т.к. вся твоя программа в этом и состоит
Эээ... Ну почти что так :)
Цитата:

Напишите за меня прогу=)
Не, писать за меня не надо. Меня интересует, с помощью какой ф-ции можно выполинить вышеуказанные действия.
Для завершения процесса вроде TerminateProcess(),
А для того, чтобы его усыпить?

os1r1s 20.04.2007 16:59

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

http://msdn2.microsoft.com/en-us/library/aa373201.aspx

da_ff 20.04.2007 19:11

а что значит усыпить процес?

Noman 20.04.2007 19:26

С убийством процесса я разобрался.
os1r1s спасибо за помощь.

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

Цитата:

а что значит усыпить процес?
Не процесс))) Комп.

bxN5 20.04.2007 19:34

Средствами с++ функии main можно вызывать аргументы смд.Т.е вроде реально в с++ выполнить taskkill /IM имя.exe
rundll32.exe powrprof.dll,SetSuspendState это.Так теория.... Я только учусь

Noman 20.04.2007 19:59

Цитата:

Средствами с++ функии main можно вызывать аргументы смд.Т.е вроде реально в с++ выполнить taskkill /IM имя.exe
rundll32.exe powrprof.dll,SetSuspendState это.Так теория.... Я только учусь
Да, это вроде возможно. Но хотелось бы выполнить используя winapi, ведь в самой винде это выполнено.
Проблема в том, что я никак не соображу где найти нужную библиотеку....

hidden 20.04.2007 20:17

GetProcAddress(LoadLibrary("PowrProf.dll"), "SetSuspendState");

Added: SetSystemPowerState(BOOL fSuspend, BOOL fForce) А эта есть в кернеле32.

Noman 20.04.2007 20:29

А я немного по-другому сделал
Цитата:

{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Get a token for this process.
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_ PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
SetSystemPowerState(false,false);
}
Вроде работает.

sn0w 26.04.2007 17:28

BroadcastSystemMessage() c SC_MONITORPOWER рубит монитор например.

Noman 26.04.2007 19:48

sn0w, спасибо, пригодиться.
Скоро я наконец допишу прогу, и выложу сюда. Как-никак первая серьезная (ну, немного серьезная) программа =)
Сейчас пытаюсь сообразить, как сделать ввод данных из ini файла обратно в TEdit и в массив. Вся проблема в том, что эти данные строковые, а значить StrToInt уже не прокатит...
Кстати, запись в файл выполнена средствами TIniFile (WriteString), и в теории вывод надо делать с помощью ReadString, но как, я пока так и не понял...

hidden 26.04.2007 20:33

Цитата:

Сообщение от Noman
Кстати, запись в файл выполнена средствами TIniFile (WriteString), и в теории вывод надо делать с помощью ReadString, но как, я пока так и не понял...

Код:

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;

)))

Noman 26.04.2007 22:21

hidden, это если не ошибаюсь делфи? Хотя с с++ они очень похожи. Иными словами получается так:
Код:

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, еще раз, спасибо)))

hidden 26.04.2007 22:30

Цитата:

Сообщение от Noman
hidden, это если не ошибаюсь делфи? Хотя с с++ они очень похожи. Иными словами получается так:
Код:

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, еще раз, спасибо)))

Не посмотрел на заголовак, увидел что юзаешь TIniFile и WriteString, а видел я их только в Delphi)), не думал что в С++ точно так-же называется))), так-как в последнее время только на API пишу)))

Noman 26.04.2007 22:40

Хех, весь инет облазил, а помог родной аЧат =)))

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

На API? Ммм... Такой вопрос, я нашел код для убийства процесса такого вида:
Код:


//По имени ехе узнаем пид процесса
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'ом.
Почитал на сайте мелкомягких про это, но толком ничего не понял. Можешь объяснить, что это такое?

hidden 26.04.2007 23:07

Цитата:

Сообщение от Noman
Я написал на один форум по C++, и там мне ответили, что можно воспользоваться broadcast'ом.
Почитал на сайте мелкомягких про это, но толком ничего не понял. Можешь объяснить, что это такое?

Ты не это читал?: http://msdn2.microsoft.com/en-us/library/ms686722.aspx
Никогда этим не пользовался, но думаю что-то вроде этого:
Код:

BroadcastSystemMessage(BSF_IGNORECURRENTTASK + BSF_NOTIMEOUTIFNOTHUNG, BSM_APPLICATIONS, WM_DESTROY, 0, 0);
По идее, оно разошлёт сообщения о завершении(WM_DESTROY, 0, 0) всем приложениям(BSM_APPLICATIONS), имеющие окна(включая невидимые), кроме себя(BSF_IGNORECURRENTTASK), затем дождётся завершения их всех(BSF_NOTIMEOUTIFNOTHUNG)

Noman 27.04.2007 00:06

2hidden, спасибо. Буду пробовать =)

Noman 12.05.2007 20:09

Спустя 2 недели я все-таки добрался доделать прогу, и как и обещал, выкладываю ссылку сюда. Там же и ее исходники. Сильно не пинайте =)
_http://winsource.mirahost.ru/moi-programmy/rubilnik-ver-10-beta/

Ky3bMu4 12.05.2007 20:37

Для первого релиза неплохо. +

Noman 14.05.2007 00:03

Ky3bMu4, спасибо =)

Noman 25.05.2007 16:59

Если кому интересно - дописал новую версию. Основное изменение - интерфейс и изменил название. Подробнее на новом сайте здесь


Время: 09:23