Ребят, подскажите решение следующей проблемы: Для перехода компа в спящий одно приложение надо выгружать. Решил написать программку, чтобы можно было одним нажатием убивать выбранный процесс и переходить в спящий. Проблема в том, что я не знаю, какой функцией пользоваться для убивания процесса и перехода в спящий. Если выполнять это средствами MSDOS, то тогда понятно: Code: taskkill /IM имя.exe rundll32.exe powrprof.dll,SetSuspendState Как это можно выполнить средствами C++?
Эээ... Ну почти что так Не, писать за меня не надо. Меня интересует, с помощью какой ф-ции можно выполинить вышеуказанные действия. Для завершения процесса вроде TerminateProcess(), А для того, чтобы его усыпить?
Вызов функции Windows API "SetSuspendState" для перехода в ждущий или спящий режим. ; Windows 95/NT4: поскольку этой функции нет, последующий код не произведёт эффекта. ; Параметр №1: 1 - спящий, 0 - ждущий. ; Параметр №2: 1 - ждущий режим немедленно, 0 - опросить все приложения о разрешении. ; Параметр №3: 1 - все "пробуждающие" события отключены, 0 - включены. http://msdn2.microsoft.com/en-us/library/aa373201.aspx
С убийством процесса я разобрался. os1r1s спасибо за помощь. Ребят, я может совсем идиот, но все же - подскажите откуда мне взять PowrProf.lib Не процесс))) Комп.
Средствами с++ функии main можно вызывать аргументы смд.Т.е вроде реально в с++ выполнить taskkill /IM имя.exe rundll32.exe powrprof.dll,SetSuspendState это.Так теория.... Я только учусь
Да, это вроде возможно. Но хотелось бы выполнить используя winapi, ведь в самой винде это выполнено. Проблема в том, что я никак не соображу где найти нужную библиотеку....
GetProcAddress(LoadLibrary("PowrProf.dll"), "SetSuspendState"); Added: SetSystemPowerState(BOOL fSuspend, BOOL fForce) А эта есть в кернеле32.
sn0w, спасибо, пригодиться. Скоро я наконец допишу прогу, и выложу сюда. Как-никак первая серьезная (ну, немного серьезная) программа =) Сейчас пытаюсь сообразить, как сделать ввод данных из ini файла обратно в TEdit и в массив. Вся проблема в том, что эти данные строковые, а значить StrToInt уже не прокатит... Кстати, запись в файл выполнена средствами TIniFile (WriteString), и в теории вывод надо делать с помощью ReadString, но как, я пока так и не понял...
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; )))
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, еще раз, спасибо)))
Не посмотрел на заголовак, увидел что юзаешь TIniFile и WriteString, а видел я их только в Delphi)), не думал что в С++ точно так-же называется))), так-как в последнее время только на API пишу)))
Хех, весь инет облазил, а помог родной аЧат =))) 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'ом. Почитал на сайте мелкомягких про это, но толком ничего не понял. Можешь объяснить, что это такое?
Ты не это читал?: 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)
Спустя 2 недели я все-таки добрался доделать прогу, и как и обещал, выкладываю ссылку сюда. Там же и ее исходники. Сильно не пинайте =) _http://winsource.mirahost.ru/moi-programmy/rubilnik-ver-10-beta/