(转载请注明原文地址: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中,并返回路径长度。