Использование Windows API:
Вы можете использовать функцию API GetConsoleProcessList (доступна только в Windows XP / 2003 и выше ). Возвращает список процессов, которые подключены к текущей консоли. Когда ваша программа запускается в режиме «без консоли», она является единственным процессом, подключенным к текущей консоли. Когда ваша программа запускается из другого процесса, который уже имеет консоль, к текущей консоли будет подключено более одного процесса.
В этом случае мы не заботимся о списке идентификаторов процессов, возвращаемых функцией, мы заботимся только о количестве возвращаемых значений.
Пример программы (я использовал Visual C ++ с шаблоном консольного приложения):
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
DWORD procIDs[2];
DWORD maxCount = 2;
DWORD result = GetConsoleProcessList((LPDWORD)procIDs, maxCount);
cout << "Number of processes listed: " << result << endl;
if (result == 1)
{
system("pause");
}
return 0;
}
Нам нужно только перечислить до 2 процессов, потому что нам важно только, есть ли 1
или more than 1
.
Использование API-интерфейсов Windows, присутствующих в Windows 2000:
GetConsoleWindow возвращает дескриптор окна консоли, связанной с текущим процессом (если есть). GetWindowThreadProcessId может сказать вам, какой процесс создал окно. И наконец, GetCurrentProcessId сообщает вам идентификатор текущего процесса. На основании этой информации вы можете сделать несколько полезных выводов:
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
HWND consoleWindow = GetConsoleWindow();
if (consoleWindow != NULL)
{
DWORD windowCreatorProcessId;
GetWindowThreadProcessId(consoleWindow, &windowCreatorProcessId);
if (windowCreatorProcessId == GetCurrentProcessId())
{
cout << "Console window was created by this process." << endl;
system("pause");
}
else
cout << "Console window was not created by this process." << endl;
}
else
cout << "No console window is associated with this process." << endl;
return 0;
}
Эта техника кажется немного менее точной, чем первая, но я думаю, что на практике она должна работать одинаково хорошо.