(转载请注明原文地址:http://blog.csdn.net/while0/article/details/11357325)
这个问题是:给定任意窗口句柄,获得创建该窗口的进程所在的运行路径。
这个需求将要实现的函数定义为: int GetFullPathByWindow(HWND hWnd, LPSTR lpFilePathBuf, int nBufSize)
hWnd: 目标窗口句柄,求该句柄所在进程路径
lpFilePathBuf: 获得路径的buffer
nBufSize: buffer长度
返回值是路径长度
介绍一个windows API:
DWORD GetModuleFileNameEx(
HANDLE hProcess, // handle to the process
HMODULE hModule, // handle to the module
LPTSTR lpFilename, // buffer that receives the path
DWORD nSize // size of the buffer);
该函数获取一个已装载模块的完整路径名称。
hProcess: 进程句柄。
hModule:一个模块的句柄。可以是一个DLL模块,或者是一个应用程序的实例句柄。
lpFileName:指定一个字串缓冲区,要在其中容纳文件的用NULL字符中止的路径名,hModule模块就是从这个文件装载进来的
nSize:装载到缓冲区lpFileName的最大字符数量
返回值: 如执行成功,返回复制到lpFileName的实际字符数量;零表示失败,会设置GetLastError。
使用这个API,实现我们要的函数GetFullPathByWindow并不难,代码如下:
int GetFullPathByWindow(HWND hWnd, LPSTR lpFilePathBuf, int nBufSize)
{
HANDLE hProcess = NULL;
DWORD dwProcessId;
int nFilePathLen = 0;
char* p = NULL;
GetWindowThreadProcessId(hWnd, &dwProcessId);
if (dwProcessId == 0)
return 0;
hProcess = OpenProcess(PROCESS_VM_READ|PROCESS_QUERY_INFORMATION, TRUE, dwProcessId);
if (hProcess == NULL)
return 0;
if ((nFilePathLen = GetModuleFileNameEx(hProcess, NULL, lpFilePathBuf, nBufSize)) == 0)
{
CloseHandle(hProcess);
return 0;
}
p = strrchr(lpFilePathBuf, '\\');
if (p != NULL)
{
p[0] = '\0';
}
CloseHandle(hProcess);
return strlen(lpFilePathBuf);
}
函数的实现步骤如下:
1)根据窗口句柄获得进程ID.
2)根据进程ID获得进程句柄hProcess
3)根据进程句柄获得路径,最后把路径保存在传入的buffer中,并返回路径长度。