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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2015, 19:51   #1
Girei
Пользователь
 
Аватар для Girei
 
Регистрация: 22.10.2013
Сообщений: 72
По умолчанию Отслеживание процессов

Доброго времени суток. Пишу программу, которая по заданному сочетанию клавиш убивает активный в данный момент процесс. Делал так: зарегестрировал хоткей, дальше пытался перехватить handle активного окна через GetForegroundWindow(). Работало как надо. Но, получить handle процесса для его дальнейшей аннигиляции я не смог.

Код:
#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <string>
#include <Windows.h>
using namespace std;

 
 
int main()
{
	MSG msg = {0};
	RegisterHotKey(NULL,0x00F,MOD_ALT,'X');
	while (GetMessage(&msg, NULL, 0, 0) != 0)
    {
        if (msg.message == WM_HOTKEY)
        {
			HWND WH = GetForegroundWindow();
            cout << WH << endl;           
			TerminateProcess(WH, NULL);
        }
    } 
	
}
Я уже понял, что по хендлу окна, процесс будет не завершить, но GetCurrentProcess() всё время возвращает 0xFFFFFFF.
Girei вне форума Ответить с цитированием
Старый 26.05.2015, 20:10   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
что по хендлу окна, процесс будет не завершить
Почему? По хендлу окна можно узнать главную нить процесса. GetWindowThreadProcessId() попробуй.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.05.2015, 20:35   #3
Girei
Пользователь
 
Аватар для Girei
 
Регистрация: 22.10.2013
Сообщений: 72
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Почему? По хендлу окна можно узнать главную нить процесса. GetWindowThreadProcessId() попробуй.
Спасибо, минуты две назад сделал. Тестирую. Я к тому, что хендл окна таким ребятам как ExitProcess() и TerminateProcess() как козе баян. Между прочим, как лучше закрыть процесс, чтобы ресурсы (в данном случае - оператива) освободились максимально быстро? MSDN не очень хочет мне рассказывать, а в гугле я нашёл только статьи в стиле: уверуй и спасёшься, никогда не используй ExitProcess()
Girei вне форума Ответить с цитированием
Старый 26.05.2015, 21:49   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Girei Посмотреть сообщение
никогда не используй ExitProcess()
Наверно все же TerminateProcess... но это - самый быстрый способ закрыть процесс. Конечно, есть риск повредить данные, но раз спешим, придется рисковать.

Лучше пошлите WM_CLOSE главным окнам процесса.
waleri вне форума Ответить с цитированием
Старый 26.05.2015, 22:43   #5
Girei
Пользователь
 
Аватар для Girei
 
Регистрация: 22.10.2013
Сообщений: 72
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Наверно все же TerminateProcess... но это - самый быстрый способ закрыть процесс. Конечно, есть риск повредить данные, но раз спешим, придется рисковать.

Лучше пошлите WM_CLOSE главным окнам процесса.
Как узнать, какое из окон главное? Если у меня, скажем, блокнот или полноэкранное приложение. Если кому надо - исходник приложения. Реагирует на Alt+X
Код:
#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <string>
#include <Windows.h>
using namespace std;

 
 
int main()
{
	HWND WH;
	HANDLE PH;
	DWORD PID,TID;
	MSG msg = {0};
	RegisterHotKey(NULL,0x00F,MOD_ALT,'X');
	while (GetMessage(&msg, NULL, 0, 0) != 0)
    {
        if (msg.message == WM_HOTKEY)
        {
			WH = GetForegroundWindow();
			TID = GetWindowThreadProcessId(WH,&PID);
			PH = OpenProcess(PROCESS_TERMINATE,FALSE,PID);
            cout << WH << "  " << PID << "  " << PH << "  " << GetWindowText(WH,NULL,100) << endl;           
			TerminateProcess(PH, NULL);
        }
    }
Girei вне форума Ответить с цитированием
Старый 26.05.2015, 23:16   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

EnumWindows() выдаст вам все top-level окна.
Как получить процесс из окна уже знаете.
Остается всем найденным окнам послать WM_CLOSE, а уже тем процессам, которые артачаться можно делать TerminateProcess
waleri вне форума Ответить с цитированием
Старый 27.05.2015, 00:21   #7
Girei
Пользователь
 
Аватар для Girei
 
Регистрация: 22.10.2013
Сообщений: 72
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
EnumWindows() выдаст вам все top-level окна.
Как получить процесс из окна уже знаете.
Остается всем найденным окнам послать WM_CLOSE, а уже тем процессам, которые артачаться можно делать TerminateProcess
Спасибо за ответ. Сейчас пытаюсь докрутить вывод имени окна завершаемого процесса и код упирается как может. Никак не могу разобраться. Подскажите, что не так в исполняемой функции?
Код:
LPSTR Wname(HWND wh)
{
	//WCHAR BF2[20];
	int LT = GetWindowTextLength(wh) + 1;
    LPSTR BF[30];
	GetWindowText(wh,BF,LT);
}
Girei вне форума Ответить с цитированием
Старый 27.05.2015, 06:48   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Girei Посмотреть сообщение
Подскажите, что не так в исполняемой функции?
А что она должна делать?
waleri вне форума Ответить с цитированием
Старый 28.05.2015, 04:16   #9
Girei
Пользователь
 
Аватар для Girei
 
Регистрация: 22.10.2013
Сообщений: 72
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А что она должна делать?
Функция должна получать заголовок окна по известному хендлу, после чего, передавать в main для вывода в консоль.
Вся программа написана для быстрого завершения программ, которые по долгу тупят перед выходом: игоры там всякие, лиса и иже с ними. Чтобы не пялиться в зависшее приложение\черный экран, пользую terminateprocess для тотального уничтожения неугодного процесса. Проблема с количеством оперативы: комп довольно старый, а матплата просто не заводится с 2+ числом плашек. Такой выход кажется мне наиболее рациональным.
Girei вне форума Ответить с цитированием
Старый 28.05.2015, 08:47   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Данная функция заголовок получает и ничего с ним не делает.
waleri вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отслеживание переходов bpystep Помощь студентам 1 01.04.2012 13:40
Создание задания, добавление процессов, удаление процессов RAZOR1703 Win Api 12 16.02.2012 18:07
Отслеживание USB FitzPNZ C++ Builder 0 18.12.2011 20:02
Отслеживание impulsgraw Работа с сетью в Delphi 3 12.06.2011 12:24
Отслеживание процессов. NSUstudent Безопасность, Шифрование 0 22.09.2010 19:41