200上位机VC MFC任务栏下指定程序前端显示
200上位机VC MFC任务栏下指定程序前端显示 功能展示 有时在桌面上有过多程序,我们想将任务上指定的程序窗口最前端显示,方便用户进行下一步的操作,我们就得编程实现这一功能,当前例程实现罗列出任务栏上全部程序窗口,再最前端显示选择的程序,效果如图; 要点提示 全部窗口的罗列功能我们可以用函数GetWindow()和GetWindowText()结合实现 ; GetWindow()函数原型:HWNDGetWindow(HWND hWnd,UNIT nCmd) 参数含义: hWnd:窗口句柄。要获得的窗口句柄是依据nCmd参数值相对于这个窗口的句柄。 nCmd:说明指定窗口与要获得句柄的窗口之间的关系。该参数值可以是下列之一: GW_CHILD(&H5):如果指定窗口是父窗口,则获得的是在Tab序顶端的子窗口的句柄,否则为NULL。函数仅检查指定父窗口的子窗口,不检查继承窗口。 GW_ENABLEDPOPUP(&H6):(WindowsNT5.0)返回的句柄标识了属于指定窗口的处于使能状态弹出式窗口(检索使用第一个由GW_HWNDNEXT 查找到的满足前述条件的窗口);如果无使能窗口,则获得的句柄与指定窗口相同。 GW_HWNDFIRST(&H0):返回的句柄标识了在Z序最高端的相同类型的窗口。如果指定窗口是最高端窗口,则该句柄标识了在Z序最高端的最高端窗口;如果指定窗口是顶层窗口,则该句柄标识了在z序最高端的顶层窗口:如果指定窗口是子窗口,则句柄标识了在Z序最高端的同属窗口。 GW_HWNDLAST(&H1):返回的句柄标识了在z序最低端的相同类型的窗口。如果指定窗口是最高端窗口,则该柄标识了在z序最低端的最高端窗口:如果指定窗口是顶层窗口,则该句柄标识了在z序最低端的顶层窗口;如果指定窗口是子窗口,则句柄标识了在Z序最低端的同属窗口。 GW_HWNDNEXT(&H2):返回的句柄标识了在Z序中指定窗口下的相同类型的窗口。如果指定窗口是最高端窗口,则该句柄标识了在指定窗口下的最高端窗口:如果指定窗口是顶层窗口,则该句柄标识了在指定窗口下的顶层窗口;如果指定窗口是子窗口,则句柄标识了在指定窗口下的同属窗口。 GW HWNDPREV(&H3):返回的句柄标识了在Z序中指定窗口上的相同类型的窗口。如果指定窗口是最高端窗口,则该句柄标识了在指定窗口上的最高端窗口;如果指定窗口是顶层窗口,则该句柄标识了在指定窗口上的顶层窗口;如果指定窗口是子窗口,则句柄标识了在指定窗口上的同属窗口。 GW_OWNER(&H4):返回的句柄标识了指定窗口的所有者窗口(如果存在)。GW_OWNER与GW_CHILD不是相对的参数,没有父窗口的含义,如果想得到父窗口请使用GetParent()。例如:例如有时对话框的控件的GW_OWNER,是不存在的。 返回值:如果函数成功,返回值为窗口句柄;如果与指定窗口有特定关系的窗口不存在,则返回值为NULL。 若想获得更多错误信息,请调用GetLastError()函数查看具体错误代码。 指定窗口的最前端显示可以用函数SetForegroundWindow();SetForegroundWindow函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程;此函数无参数直接调用设置便可; 实现功能 1.新建基于对话框的应用程序 2.拖拽一组合框ID为IDC_COMBO1用于显示任务栏上的全部窗口名称; 拖拽两按钮<罗列任务栏打开程序><前端显示选择的程序>关联函数 - void CGkbc8Dlg::OnExplor()
- {
- CString StrCaption;
- CComboBox *pCombobox = (CComboBox *)GetDlgItem(IDC_COMBO1);//获得组合框 指针
- pCombobox->ResetContent();//删除组合框全部内容
- CWnd* pWnd=AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);
- while (pWnd)
- {
- if (pWnd ->IsWindowVisible () && pWnd ->GetWindowTextLength () && !pWnd ->GetOwner ())
- {
- pWnd ->GetWindowText (StrCaption);
- pCombobox->AddString(StrCaption);
- }
- pWnd=pWnd->GetWindow (GW_HWNDNEXT);
- }
- pCombobox->SetCurSel(0);//设置初始选项
- }
复制代码- void CGkbc8Dlg::OnForground()
- {
- CComboBox *pCombobox = (CComboBox *)GetDlgItem(IDC_COMBO1);//获得组合框 指针
- CString sText;
- pCombobox->GetLBText(pCombobox->GetCurSel(),sText);
- //
- CWnd *pWnd=CWnd::FindWindow(NULL,sText);
- if(pWnd!=NULL)
- {
- CWnd *pWndTop=pWnd->GetLastActivePopup();
- pWnd->SetForegroundWindow();
- if(pWnd->IsIconic())
- pWnd->ShowWindow(SW_SHOWNORMAL);
- if(pWnd!=pWndTop)
- {
- pWndTop->SetForegroundWindow();
- }
- }
- else
- {
- MessageBox("设置前台窗口操作失败!","信息提示",MB_OK);
- }
- }
复制代码我们来演示下功能实现的整个过程
|