获取当前焦点所在窗口句柄,通过 句柄获取执行路径
- 实现方法
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;
}
- 运行效果
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 );