关于Win32控制台应用程序检测是否从资源管理器运行的问题,可以使用Windows API函数GetConsoleProcessList
来实现。
GetConsoleProcessList
函数可以获取附加到当前控制台的进程的列表。在应用程序中调用此函数,并检查返回的进程列表中是否包含当前进程的ID。如果当前进程的ID在列表中,则说明应用程序是从资源管理器运行的。
示例代码如下:
#include<Windows.h>
#include<iostream>
#include<vector>
bool IsRunningFromExplorer()
{
DWORD dwProcessId = GetCurrentProcessId();
DWORD dwProcessCount = 0;
DWORD* pProcessList = nullptr;
// 获取附加到当前控制台的进程列表
if (!GetConsoleProcessList(pProcessList, dwProcessCount))
{
return false;
}
// 分配足够的内存存储进程列表
std::vector<DWORD> processList(dwProcessCount);
if (!GetConsoleProcessList(processList.data(), dwProcessCount))
{
return false;
}
// 检查当前进程ID是否在进程列表中
for (DWORD dwPid : processList)
{
if (dwPid == dwProcessId)
{
return true;
}
}
return false;
}
int main()
{
if (IsRunningFromExplorer())
{
std::cout << "This application is running from Explorer."<< std::endl;
}
else
{
std::cout << "This application is not running from Explorer."<< std::endl;
}
return 0;
}
这段代码首先获取当前进程的ID,然后调用GetConsoleProcessList
函数获取附加到当前控制台的进程列表。最后,遍历进程列表,检查当前进程ID是否在列表中。如果在列表中,则说明应用程序是从资源管理器运行的。
需要注意的是,这种方法并不是完全可靠的,因为用户可以手动启动控制台应用程序,或者通过其他方式附加到控制台。但是,在大多数情况下,这种方法可以满足检测控制台应用程序是否从资源管理器运行的需求。
领取专属 10元无门槛券
手把手带您无忧上云