Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用GetForegroundWindow函数获取ModuleBaseName?_C++_Winapi - Fatal编程技术网

C++ 如何使用GetForegroundWindow函数获取ModuleBaseName?

C++ 如何使用GetForegroundWindow函数获取ModuleBaseName?,c++,winapi,C++,Winapi,我可以从GetForegroundWindow函数获得句柄。我想得到BaseName 手感不好。所以我使用了GetModelBaseName函数。但是我猜这个函数不能正常工作 TCHAR TitleName[MAX_PATH] = TEXT(""); HANDLE hFirst = GetForegroundWindow(); GetModuleBaseName(hFirst, NULL, TitleName, MAX_PATH); _tprintf(TEXT("%s \n"), TitleNa

我可以从GetForegroundWindow函数获得句柄。我想得到BaseName 手感不好。所以我使用了GetModelBaseName函数。但是我猜这个函数不能正常工作

TCHAR TitleName[MAX_PATH] = TEXT("");
HANDLE hFirst = GetForegroundWindow();
GetModuleBaseName(hFirst, NULL, TitleName, MAX_PATH);
_tprintf(TEXT("%s \n"), TitleName);

告诉我,问题出在哪里?

您做错了,这就是为什么它返回false,而GetLastError将返回ERROR\u INVALID\u HANDLE(6)

将返回当前前景窗口,并将返回HWND类型的窗口句柄

您可以这样做来检索应用程序的文件名:

TCHAR szName[MAX_PATH];
GetModuleBaseName(GetCurrentProcess(), GetModuleHandle(NULL), szName, MAX_PATH);
此外,还可以使用GetModuleFileName或GetMappedFileName检索应用程序的完整路径

编辑:他也想做点别的事。要检索另一个进程的路径,您必须使用进程id打开该进程。例如,如果9912是Chrome的进程id,那么您可以执行以下代码来检索它的路径

HANDLE process = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, 9912);
if (process)
{
    char file_path[MAX_PATH];
    if (::GetModuleFileNameEx(process, nullptr, file_path, MAX_PATH))
    {
        std::cout << file_path << std::endl;
    }
    else
    {
        std::cout << "Error retrieving path" << std::endl;
    }

    ::CloseHandle(process);
}
handleprocess=::OpenProcess(process\u QUERY\u信息,FALSE,9912);
if(流程)
{
字符文件路径[最大路径];
if(::GetModuleFileNameEx(进程、空ptr、文件路径、最大路径))
{

std::您是否正在尝试检索当前进程的路径?如果是,则是错误的GetModuleBaseName()需要一个进程句柄。使用GetWindowProcessThreadId()将窗口句柄映射到进程ID。然后使用OpenProcess()要获取进程句柄。您必须有足够的权限像这样四处窥探,可能需要提升。谢谢您的回答。是的,我正在尝试检索当前进程的路径。我尝试了您所说的方法。但我猜GetCurrentProcess函数无法获取控制台系统中的其他应用程序。例如,运行main函数,我已执行其他应用程序,如chrome。在这种情况下,GetCurrentProcess无法获得chrome。您有解决此问题的方法吗?请教我。@Asesh:
GetCurrentProcess
不返回窗口句柄!它返回进程句柄(实际上是伪句柄);不要把一个误认为另一个,它们是完全不同的野兽-您可能有一个窗口句柄(
HWND
),它的值与“内核”句柄(
handle
)的值相同,但它们会引用完全不同的对象。@MatteoItalia抱歉,这是一个输入错误。无法编辑它,因此我已将其删除。请考虑使用
GetProcessImageFileName()
QueryFullProcessImageName()
相反,您可以使用
process\u QUERY\u LIMITED\u INFORMATION
而不是
process\u QUERY\u INFORMATION
HANDLE process = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, 9912);
if (process)
{
    char file_path[MAX_PATH];
    if (::GetModuleFileNameEx(process, nullptr, file_path, MAX_PATH))
    {
        std::cout << file_path << std::endl;
    }
    else
    {
        std::cout << "Error retrieving path" << std::endl;
    }

    ::CloseHandle(process);
}