怎样获得任意窗口所在的进程路径?

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




你可能感兴趣的:(怎样获得任意窗口所在的进程路径?)