Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать если запущена программа? Если да то выключить ее 
:(
    Опции темы
Pavelbej
Дата 16.8.2006, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6



Как можно узнать, по ее EXE, что программа  запущена (например FlaskGet.exe) и если работает, то выключить ее.
PM MAIL   Вверх
_hunter
Дата 16.8.2006, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



можно сделать список процессов и поискать в нем


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Rennigth
Дата 16.8.2006, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



Поиск...

или вот:

Код

function GetLastErrorString: string;
var
  lz: Cardinal;
  lErr: array[0..512] of Char;
begin
  lz := GetLastError;
  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, lz, 0, @lErr, 512, nil);
  Result := string(lErr);
end;

function GetProcessID(const AProcessName: string): DWord;
var
  lSnapHandle: THandle;
  lProcStruct: PROCESSENTRY32;
  lProcessName, lSnapProcessName: string;
  lOSVerInfo: TOSVersionInfo;
begin
  Result := INVALID_HANDLE_VALUE;
  lSnapHandle := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  if lSnapHandle = INVALID_HANDLE_VALUE then
    Exit;

  lProcStruct.dwSize := SizeOf(PROCESSENTRY32);

  lOSVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  GetVersionEx(lOSVerInfo);
  case lOSVerInfo.dwPlatformId of
    VER_PLATFORM_WIN32_WINDOWS: lProcessName := AProcessName;
    VER_PLATFORM_WIN32_NT: lProcessName := ExtractFileName(AProcessName);
  end;

  if Process32First(lSnapHandle, lProcStruct) then
  begin
    try
      repeat
        lSnapProcessName := lProcStruct.szExeFile;
        if AnsiUpperCase(lSnapProcessName) = AnsiUpperCase(lProcessName) then
        begin
          Result := lProcStruct.th32ProcessID;
          Break;
        end;
      until not Process32Next(lSnapHandle, lProcStruct);
    finally
      CloseHandle(lSnapHandle);
    end;
  end;
end;

function KillProcess(const AProcessName: string): Boolean;
var
  lPID, lCurrentProcPID: DWord;
  lProcHandle: DWord;
begin
  Result := False;
  try
    lCurrentProcPID := GetCurrentProcessId;
    lPID := GetProcessID(AProcessName);
    if (lPID <> INVALID_HANDLE_VALUE) and (lCurrentProcPID <> lPID) then
    begin
      lProcHandle := OpenProcess(PROCESS_TERMINATE, False, lPID);
      Windows.TerminateProcess(lProcHandle, 0);
      WaitForSingleObject(lProcHandle, Infinite);
      CloseHandle(lProcHandle);
      Result := True;
    end;
  except
    raise EExternalException.Create(GetLastErrorString);
  end;
end;



Это сообщение отредактировал(а) Rennigth - 16.8.2006, 16:37


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Sunvas
Дата 16.8.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Цитата(Pavelbej @  16.8.2006,  16:25 Найти цитируемый пост)
 то выключить ее

А что значит "Выключить"? (убить процес, приостановить ...)


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Pavelbej
Дата 16.8.2006, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6



Sunvas,  нужно приостановить программу с возможностью сохранения данных.


Rennigth,  спасибо, вроде то что надо, но как я уже говорил нужно приостановить программу и не могу разобратся как всетаки узнать запущена программа или нет. То есть ProcessID я узнаю, а как создать условие не пойму.

Обьясню подробнее: В программе имеется CheckListBox в котором находятся программы. Если возле имени программы стоит галочка то нужно ее запускать но прежде надо проверить не работает ли она уже. Вот собственно и все.
PM MAIL   Вверх
Rennigth
Дата 16.8.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



Цитата(Pavelbej @  16.8.2006,  17:44 Найти цитируемый пост)
То есть ProcessID я узнаю, а как создать условие не пойму.

Код

function ProcessIsRun(const AName: string): Boolean;
begin
   Result := GetProcessID('Flashget.exe') <> INVALID_HANDLE_VALUE;
end;



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Alexeis
Дата 16.8.2006, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Pavelbej @  16.8.2006,  17:44 Найти цитируемый пост)
 но прежде надо проверить не работает ли она уже

Код

if FindWindow('Имя класса главного окна', 'заголовок окна')
then
  showmessage('запущена');

--------------------------
Пожалуй вариант Rennigth лучше, поскольку не все программы имеют окна   smile 


Это сообщение отредактировал(а) alexeis1 - 16.8.2006, 19:30


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rennigth
Дата 16.8.2006, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



т.е.
Код

function ProcessIsRun(const AName: string): Boolean;
begin
   Result := GetProcessID(AName) <> INVALID_HANDLE_VALUE;
end;




Это сообщение отредактировал(а) Rennigth - 16.8.2006, 17:53


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
BUGOR
Дата 16.8.2006, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 12.3.2006

Репутация: 5
Всего: 16



Цитата

Sunvas,  нужно приостановить программу с возможностью сохранения данных.


Не совсем понятно, но как вариант это создавать новый поток и в нём перечисляя все треды останавливать их(ессно кроме текущего):

Код

Procedure StopThreads;
var
 h, CurrTh, ThrHandle, CurrPr: dword;
 Thread: TThreadEntry32;
begin
 CurrTh := GetCurrentThreadId;
 CurrPr := GetCurrentProcessId;
 h := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
 if h <> INVALID_HANDLE_VALUE then
   begin
    Thread.dwSize := SizeOf(TThreadEntry32);
    if Thread32First(h, Thread) then
    repeat
     if (Thread.th32ThreadID <> CurrTh) and (Thread.th32OwnerProcessID = CurrPr) then
      begin
       ThrHandle := OpenThread(THREAD_SUSPEND_RESUME, false, Thread.th32ThreadID);
       if ThrHandle>0 then
         begin
          SuspendThread(ThrHandle);
          CloseHandle(ThrHandle);
         end;
       end;
    until not Thread32Next(h, Thread);
   CloseHandle(h);
   end;
end;


Код

Procedure RunThreads;
var
 h, CurrTh, ThrHandle, CurrPr: dword;
 Thread: TThreadEntry32;
begin
 CurrTh := GetCurrentThreadId;
 CurrPr := GetCurrentProcessId;
 h := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
 if h <> INVALID_HANDLE_VALUE then
   begin
    Thread.dwSize := SizeOf(TThreadEntry32);
    if Thread32First(h, Thread) then
    repeat
     if (Thread.th32ThreadID <> CurrTh) and (Thread.th32OwnerProcessID = CurrPr) then
      begin
       ThrHandle := OpenThread(THREAD_SUSPEND_RESUME, false, Thread.th32ThreadID);
       if ThrHandle>0 then
         begin
          ResumeThread(ThrHandle);
          CloseHandle(ThrHandle);
         end;
       end;
    until not Thread32Next(h, Thread);
   CloseHandle(h);
   end;
end;



--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
Pavelbej
Дата 16.8.2006, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6



Всем спасибо, вроде все работает. Подарю вам по плюсику но после ста постов.
PM MAIL   Вверх
COOLHack
Дата 15.6.2008, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 281
Регистрация: 8.2.2008

Репутация: нет
Всего: 0



Цитата

if FindWindow('Имя класса главного окна', 'заголовок окна')
then
  showmessage('запущена');


А если я знаю только имя процесса, как узнать запущен ли он в данный момент?
PM MAIL   Вверх
Rennigth
Дата 15.6.2008, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



Цитата(COOLHack @  15.6.2008,  01:36 Найти цитируемый пост)
А если я знаю только имя процесса, как узнать запущен ли он в данный момент? 

А если топик повнимательнее посмотреть?  smile Даю наводку 
Цитата(Rennigth @  16.8.2006,  17:52 Найти цитируемый пост)
ProcessIsRun

 smile 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
MetalFan
Дата 15.6.2008, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(Rennigth @  16.8.2006,  17:52 Найти цитируемый пост)
function ProcessIsRun(const AName: string): Boolean;
begin
   Result := GetProcessID(AName) <> INVALID_HANDLE_VALUE;
end;

хм, а ничо, что:
Цитата(MSDN)
GetProcessId
Retrieves the process identifier of the specified process.

DWORD WINAPI GetProcessId(
  HANDLE Process
);

Parameters
Process 
[in] A handle to the process. The handle must have the PROCESS_QUERY_INFORMATION access right. 



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
dumb
Дата 15.6.2008, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



MetalFan, в данном случае это своя функция(пост). хотя и негоже, Rennigth, имена такие давать своим функциям. smile
PM MAIL   Вверх
MetalFan
Дата 15.6.2008, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



dumb, точно,  не увидел сего ньанса. да, согласен, не очень хорошо давать своим функциям имена виндовых системных.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1598 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.