自定义taskKill and find

来源:互联网 发布:软件开发笔试题 编辑:程序博客网 时间:2024/04/29 13:06


由于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;
}

0 0
原创粉丝点击