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

来源:互联网 发布:企业软件开发资质 编辑:程序博客网 时间:2024/05/18 17:00

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

  • 实现方法
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          //设置内存限制的权限,使用SetProcessWorkingSetSizePROCESS_SUSPEND_RESUME     //暂停或恢复进程的权限PROCESS_TERMINATE          //终止一个进程的权限,使用TerminateProcessPROCESS_VM_OPERATION       //操作进程内存空间的权限(可用VirtualProtectEx和WriteProcessMemory) PROCESS_VM_READ            //读取进程内存空间的权限,可使用ReadProcessMemoryPROCESS_VM_WRITE           //读取进程内存空间的权限,可使用WriteProcessMemorySYNCHRONIZE                //等待进程终止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);

1 0
原创粉丝点击