获取当前焦点所在窗口句柄,通过 句柄获取执行路径

9 篇文章 1 订阅

获取当前焦点所在窗口句柄,通过 句柄获取执行路径

  • 实现方法
void CShowFocusDlg::Initstr()
{
    CWinThread* pThread = AfxBeginThread(CShowFocusDlg::MYThread, this);
    CloseHandle(pThread->m_hThread);
}

UINT CShowFocusDlg::MYThread(LPVOID lParam)
{
    CShowFocusDlg* p = (CShowFocusDlg*)lParam;
    HWND m_hwnd;
    char WindowTitle[200] = { 0 };
    char path[MAX_PATH + 1] = { 0 };
    while (true)
    {
        m_hwnd = ::GetForegroundWindow();
        ::GetWindowText(m_hwnd, WindowTitle, 200);

        DWORD idProcess;
        GetWindowThreadProcessId(m_hwnd, &idProcess);
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, idProcess);

        p->GetDlgItem(IDC_PATH)->SetWindowText("");
        p->GetDlgItem(IDC_NAME)->SetWindowText("");
        if (NULL != hProcess)
        {
            HMODULE hMod;
            DWORD cbNeeded;
            if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
            {
                GetModuleFileNameEx(hProcess, hMod, path, MAX_PATH);
                p->GetDlgItem(IDC_PATH)->SetWindowText(path);
            }

        }
        p->GetDlgItem(IDC_NAME)->SetWindowText(WindowTitle);
        p->UpdateData(FALSE);
        CloseHandle(hProcess);
        Sleep(100);
    }

    return 1;
}
  1. 运行效果
    这里写图片描述
  2. API解释

    static CWnd* PASCAL GetForegroundWindow( );//返回指向前台窗口(使用用户当前)的窗口。
    DWORD WINAPI GetWindowThreadProcessId(
     _In_      HWND    hWnd,            //A handle to the window.
     _Out_opt_ LPDWORD lpdwProcessId    //返回的窗口进程ID
    );
    
    //在得到窗口句柄后,我们可以通过句柄获取 该窗口所属进程ID和线程ID,从而判断创建窗口的进程和线程。
    HANDLE WINAPI OpenProcess(
     _In_ DWORD dwDesiredAccess,
     _In_ BOOL  bInheritHandle,
     _In_ DWORD dwProcessId
    );
    
    参数说明:
    1、dwDesiredAccess:想拥有的该进程访问权限
    PROCESS_ALL_ACCESS  //所有能获得的权限
    PROCESS_CREATE_PROCESS  //需要创建一个进程
    PROCESS_CREATE_THREAD   //需要创建一个线程
    PROCESS_DUP_HANDLE      //重复使用DuplicateHandle句柄
    PROCESS_QUERY_INFORMATION   //获得进程信息的权限,如它的退出代码、优先级
    PROCESS_QUERY_LIMITED_INFORMATION  /*获得某些信息的权限,如果获得了PROCESS_QUERY_INFORMATION,也拥有PROCESS_QUERY_LIMITED_INFORMATION权限*/
    PROCESS_SET_INFORMATION    //设置某些信息的权限,如进程优先级
    PROCESS_SET_QUOTA          //设置内存限制的权限,使用SetProcessWorkingSetSize
    PROCESS_SUSPEND_RESUME     //暂停或恢复进程的权限
    PROCESS_TERMINATE          //终止一个进程的权限,使用TerminateProcess
    PROCESS_VM_OPERATION       //操作进程内存空间的权限(可用VirtualProtectEx和WriteProcessMemory) 
    PROCESS_VM_READ            //读取进程内存空间的权限,可使用ReadProcessMemory
    PROCESS_VM_WRITE           //读取进程内存空间的权限,可使用WriteProcessMemory
    SYNCHRONIZE                //等待进程终止
    
    2、bInheritHandle:表示所得到的进程句柄是否可以被继承
    
    3、dwProcessId:被打开进程的PID
    
    如果函数调用成功将返回一个进程句柄值,否则将返回NULL
    注意:在使用完所获得的进程句柄后一定要调用CloseHandle(handle)来关闭进程的句柄。
    BOOL WINAPI EnumProcessModules(
     _In_  HANDLE  hProcess,    //A handle to the process.
     _Out_ HMODULE *lphModule,  //An array that receives the list of module handles.
     _In_  DWORD   cb,          //The size of the lphModule array, in bytes.
     _Out_ LPDWORD lpcbNeeded   //he number of bytes required to store all module handles in the lphModule array.
    );
    DWORD WINAPI GetModuleFileNameEx(
     _In_     HANDLE  hProcess, //A handle to the process that contains the module.
     _In_opt_ HMODULE hModule,
     _Out_    LPTSTR  lpFilename,
     _In_     DWORD   nSize
    );

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值