Как проверить, запущена ли программа, по ее имени с помощью 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
Гуру 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