Как проверить запущена ли программа

Как проверить, запущена ли программа, по ее имени с помощью Qt (C++).

Будет QProcess::pid сделать работу? Я не знаю, как это использовать. Пожалуйста, предложите.

Этот вопрос кажется, соответствует вашим потребностям, пока у вас есть объект. — chris

Да, но я не знаю, как использовать QProcess::state(), вот так? QProcess::state(«chrome.exe»); ?? — Random78952

Предположительно, вы можете получить QProcess объект по имени процесса, используя некоторую функцию, а затем вызовите ее для этого. — chris

Можете ли вы привести пример, пожалуйста? и большое спасибо за ваши ответы 🙂 — Random78952

Эта медитация может помочь, я думаю. Я не видел ничего, чтобы получить процесс по имени или получить список всех запущенных процессов с помощью функции Qt. — chris

3 ответы

Насколько я знаю, QProcess не позволит вам сделать это (если только вы сами не породите процесс), и на самом деле ничего в Qt не позволит. Однако Win32 API предоставляет способ добиться того, чего вы хотите, с помощью EnumProcesses Функция и полный пример того, как ее использовать, представлены на веб-сайте Microsoft:

Как узнать кто, когда и зачем заходил в ваш компьютер

Для получения вам необходимо заменить PrintProcessNameAndID на следующую функцию:

bool matchProcessName( DWORD processID, std::string processName) < TCHAR szProcessName[MAX_PATH] = TEXT(«»); // Get a handle to the process. HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); // Get the process name. if (NULL != hProcess ) < HMODULE hMod; DWORD cbNeeded; if ( EnumProcessModules( hProcess, cbNeeded) ) < GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) ); >> // Compare process name with your string bool matchFound = !_tcscmp(szProcessName, processName.c_str() ); // Release the handle to the process. CloseHandle( hProcess ); return matchFound; >

Читайте также:
Программа чтоб убрать фон вокруг предмета

Источник: stackovergo.com

Как проверить, работает ли программа по имени с помощью Qt (C ++)

Как проверить, запущена ли программа по имени с помощью Qt (C ++).

Будет QProcess::pid сделать работу? Я не знаю, как его использовать. Пожалуйста, предложите.

Решение

Насколько я знаю, QProcess не позволит вам сделать это (если вы сами не породили этот процесс), и на самом деле ничего в Qt не позволит. Однако Win32 API предоставляет способ достичь того, что вы хотите через EnumProcesses Функция и полный пример ее использования представлены на веб-сайте Microsoft:

Чтобы получить вам необходимо заменить PrintProcessNameAndID на следующую функцию:

bool matchProcessName( DWORD processID, std::string processName) < TCHAR szProcessName[MAX_PATH] = TEXT(«»); // Get a handle to the process. HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); // Get the process name. if (NULL != hProcess ) < HMODULE hMod; DWORD cbNeeded; if ( EnumProcessModules( hProcess, cbNeeded) ) < GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) ); >> // Compare process name with your string bool matchFound = !_tcscmp(szProcessName, processName.c_str() ); // Release the handle to the process. CloseHandle( hProcess ); return matchFound; >

Другие решения

Быстрый и грязный способ сделать это будет просто проверить вывод tasklist , что-то вроде:

Как проверить скачанный образ Windows? Контрольные суммы файлов


bool isRunning(const QString QProcess tasklist; tasklist.start( «tasklist», QStringList()

С помощью EnumProcesses это, вероятно, лучший способ (то есть более «чистый»; безусловно, более производительный), но это может быть «достаточно хорошо», если это не вызывается в большом цикле или как-то еще. Эту же идею можно перенести и на другие платформы, хотя очевидно, что командный инструмент и логика синтаксического анализа будут другими.

Читайте также:
Как добавить иконку в программу

//How to Run App bool ok = QProcess::startDetached(«C:\TTEC\CozxyLogger\CozxyLogger.exe»); qDebug()

Источник: web-answers.ru

Как проверить, запускается ли программа из консоли?

Я пишу приложение, которое выводит некоторую диагностику на стандартный вывод.

Я бы хотел, чтобы приложение работало так:

  • Если он запускается из отдельной командной строки (через cmd.exe ) или имеет стандартный вывод, перенаправленный / переданный в файл, завершите работу сразу же после его завершения,
  • В противном случае (если оно запускается из окна, а окно консоли создается автоматически), затем дополнительно дождитесь нажатия клавиши перед выходом (чтобы пользователь мог прочитать диагностику), прежде чем окно исчезнет.

Как мне сделать это различие? Я подозреваю, что проверка родительского процесса может быть способом, но я не очень в WinAPI, поэтому вопрос.

Я нахожусь на MinGW GCC.

user399317 25 янв ’12 в 19:54 2012-01-25 19:54
2012-01-25 19:54

4 ответа

1) Сначала вы должны получить текущий дескриптор окна консоли, используя GetConsoleWindow функция.

2) Затем вы получаете владелец процесса дескриптора окна консоли.

3) Наконец, вы сравниваете возвращенный PID с PID вашего приложения.

Проверьте этот образец (VS C++)

#include «stdafx.h» #include using namespace std; #if _WIN32_WINNT < 0x0500 #undef _WIN32_WINNT #define _WIN32_WINNT 0x0500 #endif #include #include «Wincon.h» int _tmain(int argc, _TCHAR* argv[]) < HWND consoleWnd = GetConsoleWindow(); DWORD dwProcessId; GetWindowThreadProcessId(consoleWnd, if (GetCurrentProcessId()==dwProcessId) < cout else < cout return 0; >
user91299 25 янв ’12 в 20:29 2012-01-25 20:29
2012-01-25 20:29
if (isatty (STDOUT_FILENO)) < / * это терминал */ >
user140750 25 янв ’12 в 19:58 2012-01-25 19:58
2012-01-25 19:58

Мне нужно это в C#. Вот перевод:

[DllImport(«kernel32.dll»)] static extern IntPtr GetConsoleWindow(); [DllImport(«kernel32.dll»)] static extern IntPtr GetCurrentProcessId(); [DllImport(«user32.dll»)] static extern int GetWindowThreadProcessId(IntPtr hWnd, ref IntPtr ProcessId); static int Main(string[] args) < IntPtr hConsole = GetConsoleWindow(); IntPtr hProcessId = IntPtr.Zero; GetWindowThreadProcessId(hConsole, ref hProcessId); if (GetCurrentProcessId().Equals(hProcessId)) < Console.WriteLine(«I have my own console, press any key to exit»); Console.ReadKey(); >else Console.WriteLine(«This console is not mine, good bye»); return 0; >
user1660761 10 сен ’12 в 16:51 2012-09-10 16:51
2012-09-10 16:51

Читайте также:
Мультиварка поларис инструкция по применению 12 программ

Гуру I18N Майкл Каплан (Michael Kaplan) из Microsoft представил в своем блоге серию методов, позволяющих вам проверить кучу вещей на консоли, включая то, была ли перенаправлена ​​консоль или нет.

Они написаны на C#, но перенос на C или C++ будет очень простым, поскольку все это делается с помощью вызовов Win32 API.

user27528 25 янв ’12 в 20:07 2012-01-25 20:07
2012-01-25 20:07

Попробовав довольно много разных api и вызовов, я обнаружил только один рабочий подход:

bool isConsole = isatty(fileno(stdin));

Stdout нельзя использовать, поскольку вы можете запустить консольное приложение и перенаправить вывод в файл, используя >log.txt переключатель. Подозреваю, что также возможно перенаправить ввод, но при запуске консольных приложений эта функция используется довольно редко.

Источник: stackru.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru