枚举全部窗口及关闭等任意操作
枚举全部窗口及关闭等任意操作 功能展示 系统运行时会同时运行多个程序,或打开多个窗口,在设备改造时需要对正在运行的上位机软件进行操作,如关闭,点击指定按钮等,当前例程实现获取运行中的全部窗口,并关闭指定窗口功能,效果如图,点击<枚举窗口>按钮,例程会将当前可见窗口罗列在列表框中,在获取窗口过程中对指定窗口进行关闭操作; 要点提示 窗口的枚举功能实现,例程中是通过两函数EnumWindows,EnumWindowsProc完成,在函数EnumWindowsProc()中我们就可以获取全部的窗口句柄,例程中用一个数据链进行了保存。有了全部的窗口句柄我们就可以从中进行遍历,通过函数GetWindowText()查找窗口标题,通过函数GetClassName()查找类名,然后向满足条件的窗口发送一系列的消息,控制满足条件的窗口 实现功能
1.新建基于对话框的应用程序
2.添加一列表控件,ID保存默认<IDC_LIST1>,添加一按钮控件<枚举窗口>关联按钮的点击函数 - void CGkbc8Dlg::OnEnumerate()
- {
- CListBox *pListBox = (CListBox *)GetDlgItem(IDC_LIST1);
- char cTitle[MAX_PATH];
- char cClassName[MAX_PATH];
- CString sText;
- ::EnumWindows(EnumWindowsProc,NULL);//枚举全部可见窗口
- int nCount = hWnd_List.GetCount();
- for(int i=0;i<nCount;i++)
- {
- HWND hWnd = hWnd_List.GetAt(hWnd_List.FindIndex(i));
- ::GetWindowText(hWnd,cTitle,MAX_PATH);
- if(strcmp(cTitle,"Windows Task Manager") ==0 )//额外实现想要功能,如关闭窗口
- ::PostMessage(hWnd,WM_CLOSE,0,0);
- ::GetClassName(hWnd,cClassName,MAX_PATH-1);
- sText.Format("%d 标题:%s 类名%s",i,cTitle,cClassName);
- pListBox->AddString(sText);
- }
- }
复制代码
3.上面的函数中调用了hWnd_List,EnumWindowsProc(),所以再在函数前边添加以下代码 - #include<Afxtempl.h >
- CList<HWND,HWND> hWnd_List;
- BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
- {
- if(::GetWindowLong(hWnd,GWL_STYLE)& WS_VISIBLE)
- {
- hWnd_List.AddHead(hWnd);
- }
- return true;
- }
复制代码我们来演示下功能实现的整个过程 如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|