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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2007, 13:01   #1
Dimon
Фрилансер
Пользователь
 
Аватар для Dimon
 
Регистрация: 12.01.2007
Сообщений: 15
По умолчанию закрытие чужого процесса

h1 := ShellExecute(h, 'open', 'C:\List.wpl', nil, nil, SW_SHOW);
OpenProcess(PROCESS_TERMINATE,True, h1);
TerminateProcess(h1,0);
почему не закрывается чужой процесс ?
если есть другой способ закрыть чужое приложение из своего прошу подсказать
Dimon вне форума Ответить с цитированием
Старый 12.01.2007, 13:10   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Одно из многочисленных готовых решений:

Код:
function ProcessTerminate(dwPID:Cardinal):Boolean;
var
 hToken:THandle;
 SeDebugNameValue:Int64;
 tkp:TOKEN_PRIVILEGES;
 ReturnLength:Cardinal;
 hProcess:THandle;
begin
 Result:=false;
 // Добавляем привилегию SeDebugPrivilege 
 // Для начала получаем токен нашего процесса
 if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
  or TOKEN_QUERY, hToken ) then
    exit;

 // Получаем LUID привилегии
 if not LookupPrivilegeValue( nil, 'SeDebugPrivilege', SeDebugNameValue ) 
  then begin
   CloseHandle(hToken);
   exit; 
  end;

 tkp.PrivilegeCount:= 1;
 tkp.Privileges[0].Luid := SeDebugNameValue;
 tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

 // Добавляем привилегию к нашему процессу
 AdjustTokenPrivileges(hToken,false,tkp,SizeOf(tkp),tkp,ReturnLength);
 if GetLastError()< > ERROR_SUCCESS  then exit;

 // Завершаем процесс. Если у нас есть SeDebugPrivilege, то мы можем
 // завершить и системный процесс
 // Получаем дескриптор процесса для его завершения
 hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, dwPID);
 if hProcess =0  then exit;
  // Завершаем процесс
   if not TerminateProcess(hProcess, DWORD(-1))
    then exit;
 CloseHandle( hProcess );
 
 // Удаляем привилегию 
 tkp.Privileges[0].Attributes := 0; 
 AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength);
 if GetLastError() < >  ERROR_SUCCESS
  then exit;
 
 Result:=true; 
end;
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 12.01.2007, 17:17   #3
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

команда taskkill - или что-то подобное было...
В командной строке пропиши taskkill.exe /? - достаточная справка как и что.

Последний раз редактировалось zetrix; 12.01.2007 в 17:20.
zetrix вне форума Ответить с цитированием
Старый 13.01.2007, 10:53   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

функция ShellExecute возвращает хендл процесса а не его PID

и на последок Функция которая получает PID по имени

Код:
function GetProcessId(pName: PChar): dword;
var
 Snap: dword;
 Process: TPROCESSENTRY32;
begin
  Result := 0;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Snap <> INVALID_HANDLE_VALUE then
     begin
      Process.dwSize := SizeOf(TPROCESSENTRY32);
      if Process32First(Snap, Process) then
         repeat
          if lstrcmpi(Process.szExeFile, pName) = 0 then
             begin
              Result := Process.th32ProcessID;
              CloseHandle(Snap);
              Exit;
             end;
         until not Process32Next(Snap, Process);
      Result := 0;
      CloseHandle(Snap);
     end;
end;
rpy3uH вне форума Ответить с цитированием
Старый 14.01.2007, 22:40   #5
Dimon
Фрилансер
Пользователь
 
Аватар для Dimon
 
Регистрация: 12.01.2007
Сообщений: 15
По умолчанию

ну как получить PID по имени теперь понятно, кстати спасибо, а как получить теперь имя процесса?
Dimon вне форума Ответить с цитированием
Старый 15.01.2007, 13:53   #6
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Список процессов:
var
Wnd: hWnd;
buff: array[0..127] of Char;
begin
ListBox1.Clear;
Wnd := GetWindow(Handle, gw_HWndFirst);
while Wnd <> 0 do begin {Не показываем:}
if (Wnd <> Application.Handle) and {-Собственное окно}
IsWindowVisible(Wnd) and {-Невидимые окна}
(GetWindow(Wnd, gw_Owner) = 0) and {-Дочернии окна}
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}
then begin
GetWindowText(Wnd, buff, sizeof(buff));
ListBox1.Items.Add(StrPas(buff));
end;
Wnd := GetWindow(Wnd, gw_hWndNext);
end;
ListBox1.ItemIndex := 0;
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 15.01.2007, 20:14   #7
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Dimon Посмотреть сообщение
ну как получить PID по имени теперь понятно, кстати спасибо, а как получить теперь имя процесса?
так же!, только условие вот такое

Код:
if Process.th32ProcessID = PID then
             begin
              Result := Process.szExeFile;
              CloseHandle(Snap);
              Exit;
             end;
rpy3uH вне форума Ответить с цитированием
Старый 12.05.2010, 12:01   #8
regman
Пользователь
 
Регистрация: 11.07.2009
Сообщений: 90
По умолчанию

помему не могу закрыть окно по его хэндлу??
Код:
h:=ShellExecute(Handle, 'open', PChar('http://ukr.net'), nil, nil, SW_SHOW);
Sleep(5000);
SendMessage(h,WM_DESTROY,0,0);

Если юзать

Код:
TerminateProcess(h, NO_ERROR);
то все прекрасно закрывается, но ненормально. Мне нужно просто закрыть приложение без ошибок и всяких диалоговых окон.
Apache/2.2.23 (Win32) PHP/5.3.18
Win7Pro 64
Vertrigo
regman вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление/закрытие процесса Djaconda Win Api 2 13.06.2008 13:11
Считать значение компонента с чужого окна chipmunk Общие вопросы Delphi 1 12.06.2008 11:22
нажать на TSpeedButton чужого СВЕРНУТОГО окна Yuran Общие вопросы Delphi 6 11.06.2008 17:14
Приоритет чужого процесса (консультация) Air Win Api 9 06.03.2008 20:05
Ждать завершения чужого процесса ERASERROR Win Api 2 04.02.2008 08:23