【转载】进程,窗口,可执行文件名的相互获取
【转自】http://blog.donews.com/zwell/articles/37069.aspx
下面是如何由进程得到窗口标题文字的例子:
typedef struct tagWNDINFO
{
DWORD dwProcId;
HWND hWnd;
} WNDINFO, *LPWNDINFO;
BOOL CALLBACK MyEnumProc(HWND hWnd,LPARAM lParam)
{
DWORD dwProcId;
GetWindowThreadProcessId(hWnd, &dwProcId);
LPWNDINFO pInfo = (LPWNDINFO)lParam;
if(dwProcId == pInfo->dwProcId)
{
pInfo->hWnd = hWnd;
return FALSE;
}
return TRUE;
}
HWND GetProcessMainWnd(DWORD dwProcId)
{
WNDINFO wi;
wi.dwProcId = dwProcId;
wi.hWnd = NULL;
EnumWindows(MyEnumProc,(LPARAM)&wi);
return wi.hWnd;
}
通过函数GetProcessMainWnd得到窗口的句柄后,就可以
调用GetWindowText(Hwnd)得到窗口标题了。
注:具体函数的调用参数请参考MSDN Library!
如何由窗口得到可执行文件名 :
下面是如何由窗口得到可执行文件名的例子:
void __fastcall GetExeByWnd(HWND hWnd)
{
HANDLE hProc;
char szProcessName [80];
HMODULE hMod;
DWORD dwProcId;
hMod = GetClassLong(hWnd,GCL_HMODULE);</P><P> GetWindowThreadProcessId(hWnd,&dwProcId);</P><P> hProc = OpenProcess (PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,
FALSE,
dwProcId);
if (hProc)
{
if (GetModuleBaseName (hProc,
hMod,
szProcessName,
sizeof(szProcessName)))
{
//加入自己的处理程序
}
else
{
//加入自己的处理程序
}
CloseHandle (hProc);
}
}</P><P> GetModuleBaseName可以用GetModuleFileNameEx这个函数替换,
它可以查指定进程中任何模块的文件名,而且带有路径。
但这个函数在Win9X下有时候不行,这样的话,只有枚举进程来得到文件名及路径信息了。
注:具体函数的调用参数请参考MSDN Library!
如何由进程得到可执行文件名 :
下面是如何由进程得到可执行文件名的简单例子:
void __fastcall GetExeByProcId(DWORD dProcID)
{
HANDLE hProc;
char szProcessName [80];
HMODULE ahMod [10];
DWORD dwNeeded;
hProc = OpenProcess (PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,
FALSE,
dProcID);
if (hProc)
{
if (EnumProcessModules (hProc,
ahMod,
sizeof(ahMod),
&dwNeeded))
{
if (GetModuleBaseName (hProc,
ahMod[0],
szProcessName,
sizeof(szProcessName)))
{
//加入自己的处理程序
}
else
{
//加入自己的处理程序
}
}
CloseHandle (hProc);
}
}</P><P>
有关进程ID获取的API函数:
::GetCurrentProcessId() 得到当前运行程序的进程ID;
下面三个API函数可枚取系统中所有的进程ID:
::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0),
::Process32First(hSnapshot,&lpProc),
::Process32Next(hSnapshot,&lpProc)
注:具体函数的调用参数请参考MSDN Library!
posted on 2009-10-23 11:57 IamEasy_Man 阅读(659) 评论(0) 编辑 收藏 举报