Прошу прощения, если данная тема уже подымалась, но ничего нужного по этому вопросу я не нашел (наверно плохо искал).
Возможно ли узнать у ОС Windows 98/XP (и Vista не помешает), запущено в данный момент другое приложение (например: «C:Program FilesBorlandDelphi7Bindelphi32.exe») и если нет, то запустить его?
Заранее спасибо за любую информацию
18.09.2008, 11:08
Исполняемый Ретровирус
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Вы сказали Спасибо: 4
Поблагодарили 14 раз(а) в 14 сообщениях
Репутация: 1293
Пролистай процессы и сравни их имена с нужным процессом, если совпадает то процесс запущен иначе WinExec. Либо ищи хендл окна программы и при его отсутствии запускай процесс.
18.09.2008, 11:12
Регистрация: 12.08.2008
Сообщения: 15
Вы сказали Спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Хорошо, перефразирую вопрос, как можно вытянуть из ОС перечень запущенных процессов?
WinExec — это функция какого модуля, другими словами , как ее запустить?
Функции и возможности Delphi DS150E
18.09.2008, 11:22
Исполняемый Ретровирус
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Вы сказали Спасибо: 4
Поблагодарили 14 раз(а) в 14 сообщениях
Репутация: 1293
Исходников по этой теме много, ищи, а у меня ни времени ни желания писать нет, слишком избитая тема 😉 WinExec — это функция запуска процессов, ты в справку Делфи заглядывай по чаще!
18.09.2008, 12:50
Illuminati
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Вы сказали Спасибо: 1
Поблагодарили 2 раз(а) в 2 сообщениях
Репутация: 8808
Как вариант искать по классам окон.
__________________
Хорошо написанная программа не требует документации
ICQ 9-184-668.
14.03.2009, 21:14
Начинающий
Регистрация: 19.05.2008
Сообщения: 147
Вы сказали Спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Версия Delphi: x
Репутация: 15
Прошу прощения, если данная тема уже подымалась, но ничего нужного по этому вопросу я не нашел (наверно плохо искал).
Возможно ли узнать у ОС Windows 98/XP (и Vista не помешает), запущено в данный момент другое приложение (например: «C:Program FilesBorlandDelphi7Bindelphi32.exe») и если нет, то запустить его?
Заранее спасибо за любую информацию
В Uses ShellApi
var window:HWND; begin window:=findwindow(nil,PChar(‘Delphi 7′)); if window=0 then ShellExecute(Form1.Handle,nil,’C:Program FilesBorlandDelphi7Bindelphi32.exe’,nil,nil,SW_SHOWNORMAL);end;
15.03.2009, 22:18
Специалист
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Вы сказали Спасибо: 12
Поблагодарили 83 раз(а) в 79 сообщениях
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
var HM: THandle; function Check: boolean; begin HM := OpenMutex(MUTEX_ALL_ACCESS, false, ‘MyOwnMutex’); Result := (HM <> 0); if HM = 0 then HM := CreateMutex(nil, false, ‘MyOwnMutex’); end; begin if not Check then begin Application.Initialize; Application.CreateForm(TfForm, fForm); Application.Run; end else begin Application.MessageBox(‘ВНИМАНИЕ . Программа уже запущена’,’ВНИМАНИЕ’,0); Exit; end;
__________________
[ДИАГНОСТИКА] Opel Zafira C (Tourer) сканером Delphi DS150E, ищем родной пробег. car diagnostics.
Поживу — увижу, Доживу — узнаю, Выживу — учту.
[P.S.]-> Выражая благодарность за помощь — Вы получаете шанс на помощь в следующий раз
16.03.2009, 20:00
Регистрация: 22.09.2007
Сообщения: 228
Вы сказали Спасибо: 3
Поблагодарили 15 раз(а) в 15 сообщениях
Версия Delphi: 7, 2009, XE2
Репутация: 70
uses TlHelp32, ShellAPI; function GetProcessByEXE(exename: string): THandle; var hSnapshoot: THandle; pe32: TProcessEntry32; begin Result:= 0; hSnapshoot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshoot = 0) then Exit; pe32.dwSize:= SizeOf(TProcessEntry32); if (Process32First(hSnapshoot, pe32)) then repeat if (pe32.szExeFile = exename) then begin Result:= pe32.th32ProcessID; exit; end; until not Process32Next(hSnapshoot, pe32); end; procedure TForm1.Button1Click(Sender: TObject); begin if GetProcessByEXE(‘notepad.exe’) = 0 then ShellExecute(0, ‘open’, ‘notepad’, nil, nil, SW_SHOWNORMAL) else ShowMessage(‘Уже запущено’); end;
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.
Последний раз редактировалось Karsh, 16.03.2009 в 20:04 .
Источник: delphisources.ru
Delphi узнать запущена ли программа
Допустим у меня запущена программа, свойство формы программы visible:=False . Ее не видно. Что прописать и где, чтобы если например пользователь форму не видит а захочет ее увидеть и запустит программу повторно, программа не запускалась повторно, а просто visible:=True; И Возможно ли вобще это сделать. Спасибо
Форумчанин
Регистрация: 19.10.2008
Сообщений: 110
при попытке запустить 2 й экземпляр ??
٩(๏̯͡๏)۶٩(๏̯͡๏)۶٩(๏̯͡๏)۶ моя любимая книга — Окна for чайников . Кодить начал ещё вчера . . кто там кодит ? Да не кто не кодит это я куякнулся
Последний раз редактировалось Стелс; 10.10.2011 в 00:28 .
Форумчанин
Регистрация: 04.06.2011
Сообщений: 120
при попытке запустить 2 й экземпляр ??
да. Правильно поняли
Форумчанин
Регистрация: 19.10.2008
Сообщений: 110
ну думаю что возможно только вот вопрос ЗАЧЕМ такой геморрой .
٩(๏̯͡๏)۶٩(๏̯͡๏)۶٩(๏̯͡๏)۶ моя любимая книга — Окна for чайников . Кодить начал ещё вчера . . кто там кодит ? Да не кто не кодит это я куякнулся
Форумчанин
Регистрация: 19.10.2008
Сообщений: 110
вот наковырял http://cf.pop3.ru/Project1.exe
٩(๏̯͡๏)۶٩(๏̯͡๏)۶٩(๏̯͡๏)۶ моя любимая книга — Окна for чайников . Кодить начал ещё вчера . . кто там кодит ? Да не кто не кодит это я куякнулся
Участник клуба
Регистрация: 28.11.2007
Сообщений: 1,521
Первое, что пришло в голову:
Procedure OnlyOne; Begin If OpenMutex(MUTEX_ALL_ACCESS,False,’Form1′) <> 0 Then Begin CreateMutex(Nil,True,’Form2′); Sleep(300); Halt; End Else Begin CreateMutex(Nil,True,’Form1′); End; End; Procedure TForm1.FormCreate(Sender: TObject); Begin Application.ShowMainForm:=False; OnlyOne; End; Procedure TForm1.Timer1Timer(Sender: TObject); Begin If OpenMutex(MUTEX_ALL_ACCESS,False,’Form2′) <> 0 Then Begin Form1.Visible:=True; End; End;
У таймера интервал 200. Если так не устроит, что можно подумать над оптимизацией.
Всегда рад помочь!
Регистрация: 09.01.2008
Сообщений: 26,238
тема достаточно «избитая». Точно помню в том же «Delphi World» были различные варианты решения данной задачи.
ну, и как вариант могу посоветовать то, что используется у нас в рабочем проекте.
из JEDI (JVCL):
модуль JvVCLUtils
функция
function ActivatePrevInstance (const MainFormClass: ShortString;
const ATitle: string): Boolean;
использовать можно так:
в файле проекта (****.dpr) прямо после начального begin
if ActivatePrevInstance(TMainForm.ClassName, ») then Exit;
где TMainForm — класс главного окна.
Последний раз редактировалось Serge_Bliznykov; 10.10.2011 в 09:04 .
Форумчанин
Регистрация: 19.10.2008
Сообщений: 110
program Project1; uses Forms, Windows, Unit1 in ‘Unit1.pas’ ; begin Application.Initialize; Application.Title := ‘Моя программа’; Application.CreateForm(TForm1, Form1); Application.Run; end.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private < Private declarations >public < Public declarations >end; var Form1: TForm1; implementation procedure TForm1.Timer1Timer(Sender: TObject); var AppHandle: THandle; begin if Form1.Visible =True then begin Form1.Visible :=False; CreateSemaphore(nil,1,1,’SIPOM — Моя программа’); if GetLastError = ERROR_ALREADY_EXISTS then begin AppHandle:= FindWindow(nil,’Моя программа’); ShowMessage(‘Сейчас будет видно’); if not IsWindowVisible(AppHandle) then begin ShowWindow(AppHandle,SW_SHOWMAXIMIZED); Abort; SetForegroundWindow(AppHandle); end; end ;end; end; end.
ну почти тоже что и у Terran
٩(๏̯͡๏)۶٩(๏̯͡๏)۶٩(๏̯͡๏)۶ моя любимая книга — Окна for чайников . Кодить начал ещё вчера . . кто там кодит ? Да не кто не кодит это я куякнулся
Последний раз редактировалось Стелс; 10.10.2011 в 13:01 .
Форумчанин
Регистрация: 19.10.2008
Сообщений: 110
а есчо можно создать файл ini с переменной булевского типа и при первой загрузке переписывать истину на ложь а при закрытии возвращать в исходное состояние а перед всем этим проверять состояние переменной и в зависимости от её состояния принимать решение при этом не забывать ExitProcess(0);
недостаток такого подхода — если прога зависнет и ее придется убить то конечно все будет через «ж»
٩(๏̯͡๏)۶٩(๏̯͡๏)۶٩(๏̯͡๏)۶ моя любимая книга — Окна for чайников . Кодить начал ещё вчера . . кто там кодит ? Да не кто не кодит это я куякнулся
Последний раз редактировалось Стелс; 10.10.2011 в 13:05 .
фонатик DELPHI
Форумчанин
Регистрация: 14.01.2008
Сообщений: 714
фрагмент с рабочего проекта
procedure GetProcessList(var List: TstringList); var ovi: TOSVersionInfo; begin if List = nil then Exit; ovi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); GetVersionEx(ovi); case ovi.dwPlatformId of VER_PLATFORM_WIN32_WINDOWS: CreateWin9xProcessList(List); VER_PLATFORM_WIN32_NT : CreateWinNTProcessList(List); end end; function GetExeRunCount(const FileName: string):integer; var i : Integer; fList : TstringList; s0,S1 : string; begin result:=0; s0:=ExtractFileName(FileName); fList := TStringList.Create; try GetProcessList(fList); for i := 0 to fList.Count — 1 do begin s1:=ExtractFileName(Trim(fList.strings[i])); inc(result, byte(s1=s0)); end; finally fList.Free; end; end; begin Application.Initialize; if GetExeRunCount(Application.ExeName, false)>1 then begin MessageBox(0,’Процесс уже запущен ‘,’ХХХХХХХХХХ’,0); Application.Terminate; exit; end; . . . Application.run;
95% сбоев и ошибок приложений, находится в полу метрах от монитора
Источник: www.programmersforum.ru
Блог о программировании и не только.
Сегодня я покажу, как проверить, запущен ли процесс.
Зачастую такая задача встречается в проверке на запуск приложения: работает или нет.
Итак, для начала подключим в проекту файл:
uses TlHelp32;
Теперь я приведу код самой функции:
function processExists(exeFileName: string): Boolean; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); Result := False; while Integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then begin Result := True; end; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end;
Чтобы начать использовать функцию, сначала объявляем её, а затем пишем что-то вроде такого:
procedure TForm1.Button1Click(Sender: TObject); begin if processExists(‘notepad.exe’) then ShowMessage(‘process is running’) else ShowMessage(‘process not running’); end;
Вот и всё! Надеюсь, что данный урок вам пригодится:)
А пока вот такой вопрос: что вы делаете за компьютером, когда не пишите программы?
Я например смотрю фильмы. Лучшие 500 фильмов истории можно увидеть, например, здесь:)
Источник: sourceexpert.blogspot.com