Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2018, 15:13   #1
1_4yma_1
Новичок
Джуниор
 
Регистрация: 07.06.2018
Сообщений: 3
Восклицание Как закрыть стороннюю программу программно

Такая тема, есть программа которая открывает по нажатию кнопки презентацию (1.pptx) и есть 2 кнопка (закрыть) ну и нужно чтобы по нажатию кнопки процесс PowerPoint крякался или сама презентация закрывалась, я пробовал через код
--------------------------------------------------
Код:
h:=FindWindow(nil, 'Microsoft PowerPoint'); 
 if h=0 then exit;                                       
 SendMessage(h, WM_DESTROY, 0,0)
Пожалуйста, оформляйте Ваш код согласно правилам.
--------------------------------------------------
но там просто верхняя полоска где крестик полосочка и окошко исчезает а презенташка остаётся открытой
Исходник прикреплён!
Вложения
Тип файла: rar Презенташка.rar (170.2 Кб, 11 просмотров)

Последний раз редактировалось Вадим Мошев; 07.06.2018 в 20:42.
1_4yma_1 вне форума Ответить с цитированием
Старый 07.06.2018, 20:32   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Код:
function TServiceManager.KillTask(const aTaskFileName: string): Integer;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
  FExeName: string;
  ExePos: integer;
begin
  ExePos := pos('.exe', aTaskFileName);
  if ExePos > 0 then
    FExeName := Copy(aTaskFileName, 1, ExePos + 3);
  Result := 0;
  if aTaskFileName <> '' then
  begin
    FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
    ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
    while Integer(ContinueLoop) <> 0 do
    begin
      if (UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(FExeName))
          or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(FExeName))
      then
        Result := Integer(TerminateProcess(
      OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
      ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
    end;
    CloseHandle(FSnapshotHandle);
  end
end; // KillProcess
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 08.06.2018, 12:54   #3
1_4yma_1
Новичок
Джуниор
 
Регистрация: 07.06.2018
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Код:
function TServiceManager.KillTask(const aTaskFileName: string): Integer;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
  FExeName: string;
  ExePos: integer;
begin
  ExePos := pos('.exe', aTaskFileName);
  if ExePos > 0 then
    FExeName := Copy(aTaskFileName, 1, ExePos + 3);
  Result := 0;
  if aTaskFileName <> '' then
  begin
    FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
    ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
    while Integer(ContinueLoop) <> 0 do
    begin
      if (UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(FExeName))
          or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(FExeName))
      then
        Result := Integer(TerminateProcess(
      OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
      ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
    end;
    CloseHandle(FSnapshotHandle);
  end
end; // KillProcess
Проблемы по этому коду? И 2 вопрос, как подключить этот процесс к кнопке?
А и ещё вопрос как сделать так чтобы значение счетчика обратного отсчёта сохранялось при закрытии, а потом при дальнейшем использовании программы он начинал с того места с которого закончил? Заранее спасибо)
1_4yma_1 вне форума Ответить с цитированием
Старый 08.06.2018, 13:00   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от 1_4yma_1 Посмотреть сообщение
Проблемы по этому коду?
У меня - никаких, работает.


Цитата:
Сообщение от 1_4yma_1 Посмотреть сообщение
И 2 вопрос, как подключить этот процесс к кнопке?
Вызывать эту функцию по событию кнопки OnClick


Цитата:
Сообщение от 1_4yma_1 Посмотреть сообщение
как сделать так чтобы значение счетчика обратного отсчёта сохранялось при закрытии
Сохранять в файл, например. Или в реестр.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 08.06.2018, 13:40   #5
1_4yma_1
Новичок
Джуниор
 
Регистрация: 07.06.2018
Сообщений: 3
По умолчанию

А uses надо что нибудь прописывать?
1_4yma_1 вне форума Ответить с цитированием
Старый 08.06.2018, 13:43   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

У меня так:

Код:
uses
  System.Classes, System.SysUtils, Windows, WinSvc, Tlhelp32;
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запустить стороннюю программу с ПРАВАМИ АДМИНИСТРАТОРА - Delphi WinAPI yurius Общие вопросы Delphi 6 15.05.2016 15:19
Mono: как программно закрыть окно Mixim Общие вопросы .NET 5 02.09.2012 12:13
Как программно закрыть другое приложение(программу) masicev C# (си шарп) 14 07.07.2012 15:57
Как закрыть программу?! Abnimka Общие вопросы Delphi 2 10.06.2010 14:56
Как программно закрыть все открытые модальные формы перед сворачиванием главной формы в трей? SkAndrew Общие вопросы Delphi 8 27.01.2010 22:44