【轉自】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!