EnumWindowsProc
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
进程回调函数,类似于窗口句柄的枚举
typedef struct
{
HWND hWnd;
DWORD dwProcessID;//可以根据需求修改,例如根据窗口名找到窗口
}EnumWindowsArg;
#define WINDOWNAME_BUFLEN 1000
wchar_t* g_szWindowNameBuf = NULL;
#define AUTOMARK_BACKGROUND_WINDOWNAME _T("WindowID")
CString g_sWindowName(AUTOMARK_BACKGROUND_WINDOWNAME);
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{//根据进程id获得句柄
EnumWindowsArg* pArg = (EnumWindowsArg*)lParam;//传入已知的进程id
DWORD dwProcessID = 0;
//根据句柄获得进程ID
::GetWindowThreadProcessId(hWnd, &dwProcessID);
if (dwProcessID == pArg->dwProcessID)//如果当前句柄的进程id等于传入的id
{
wmemset(g_szWindowNameBuf, 0, WINDOWNAME_BUFLEN);
::GetWindowText(hWnd, g_szWindowNameBuf, WINDOWNAME_BUFLEN);//根据句柄获得窗口名
if (g_sWindowName.CompareNoCase(g_szWindowNameBuf) == 0)
{
pArg->hWnd = hWnd;//返回当前的句柄
return FALSE; // Found
}
}
return TRUE; // Not found
}
HWND GetHwndByProcessID(DWORD dwProcessID)
{
HWND hWnd = NULL;
EnumWindowsArg ewa;
ewa.dwProcessID = dwProcessID;
ewa.hWnd = NULL;
g_szWindowNameBuf = new wchar_t[WINDOWNAME_BUFLEN];//必须要开辟新空间
EnumWindows(EnumWindowsProc, (LPARAM)& ewa);//调用回调函数,循环寻找等于当前进程id的句柄
delete[] g_szWindowNameBuf;
g_szWindowNameBuf = NULL;
if (ewa.hWnd)//不为空则找到
{
hWnd = ewa.hWnd;
}
return hWnd;
}