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

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




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

峻峰飞阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值