通过单击图标,在控制台中键入其名称或从批处理文件中区分程序是否运行

rsk*_*k82 4 c++ windows console

我正在编写的程序是一个简单的控制台应用程序,它获取参数,计算,然后返回数据.

我问这个是因为我正在尝试实现一个智能"press enter to exit"消息,只有在通过在资源管理器中单击其图标来调用控制台程序时才会运行该消息.没有它,结果是程序只闪烁一秒钟,但如果程序是从已经打开的控制台的上下文运行,那么同样的事情就变成了烦恼.当程序在bat或cmd文件中运行时会出现类似的事情,然后在最后暂停也不受欢迎,因为bat文件具有应该执行的'pause'命令.


所以,我们有两种模式:

  • 程序说"press enter to exit"什么时候开始:
    • 直接点击资源管理器
    • 单击快捷方式
  • 只需退出时:
    • 它的名字在控制台中输入
    • 它是从bat/cmd文件运行的
    • 它从另一个控制台应用程序运行

tco*_*ovo 5

使用Windows API:

您可以使用GetConsoleProcessList API函数(仅适用于Windows XP/2003及更高版本).它返回附加到当前控制台的进程列表.当您的程序以"无控制台"模式启动时,您的程序是附加到当前控制台的唯一进程.当您的程序从另一个已有控制台的进程启动时,将有多个进程附加到当前控制台.

在这种情况下,我们不关心函数返回的进程ID列表,我们只关心返回的计数.

示例程序(我使用带控制台应用程序模板的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;
}
Run Code Online (Sandbox Code Playgroud)

我们只需要列出最多2个进程,因为我们只关心是否存在1more than 1.


使用Windows 2000中的Windows API:

GetConsoleWindow返回与当前进程关联的控制台的窗口句柄(如果有).GetWindowThreadProcessId可以告诉你哪个进程创建了一个窗口.最后,GetCurrentProcessId告诉您当前进程的id.您可以根据以下信息进行一些有用的推演:

#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;
}
Run Code Online (Sandbox Code Playgroud)

这种技术似乎不如第一种技术精确,但我认为在实践中它应该表现得同样好.