由于FindWindow(Ex) 只能够查找具体的窗体 不能够模糊查找,因此有了下文。
主要是利用EnumWindows 查找className 并用strstr模糊匹配 再查找title 从而进一步确认要找的进程
struct WINDOWINFO_FIND
{
char *className;
char *titleName;
HWND hWnd;
};
BOOL CALLBACK EnumWindowsProcFind(HWND hWnd, LPARAM lParam) // 回调函数
{
TCHAR szTitle[200];
TCHAR szClass[200];
WINDOWINFO_FIND* par = (WINDOWINFO_FIND *)lParam;
GetClassName(hWnd, szClass, sizeof(szClass) / sizeof(TCHAR)); // 窗口类
if(!par->hWnd && strstr(szClass, par->className) != NULL ) //终止
{
printf("szClass:%s\n", szClass);
// ::SendMessage(hWnd,WM_GETTEXT,sizeof(szTitle) / sizeof(TCHAR),(LPARAM)szTitle);
GetWindowText(hWnd, szTitle, sizeof(szTitle));
if(strstr(szTitle, par->titleName) != NULL ) //终止
{
printf("EnumWind:%s-%s\n", szClass, szTitle);
par->hWnd = hWnd;
}
}
return true;
}
//kill task----------------------------------
bool taskkill(char *szClassName, char *szTitleName)
{
BOOL bResult = false;
WINDOWINFO_FIND* par = new WINDOWINFO_FIND;
par->className=szClassName;
par->titleName=szTitleName;
par->hWnd = NULL;
EnumWindows(EnumWindowsProcFind, (LPARAM)par); // 枚举窗口 use EnumWindows because EnumChildWindows is no used all win syste
if(par->hWnd)
{
DWORD ProcessID;
GetWindowThreadProcessId(par->hWnd, &ProcessID);
HANDLE hProcessHandle = ::OpenProcess(PROCESS_TERMINATE, FALSE, ProcessID);
bResult=TerminateProcess(hProcessHandle, 0);
}
delete par;
return bResult;
}
//find task
bool taskFind(char *szClassName, char *szTitleName, HWND &rstHwnd)
{
BOOL bResult = false;
WINDOWINFO_FIND* par = new WINDOWINFO_FIND;
par->className=szClassName;
par->titleName=szTitleName;
par->hWnd = NULL;
EnumWindows(EnumWindowsProcFind, (LPARAM)par); // 枚举窗口 use EnumWindows because EnumChildWindows is no used all win syste
if(par->hWnd)
{
bResult=true;
rstHwnd = par->hWnd;
}
delete par;
return bResult;
}