怎样用MFC获得已经打开了的窗口的名字?

作者&投稿:戚购 (若有异议请与网页底部的电邮联系)
MFC如何通过窗口句柄获取窗口信息(名称)。~

有效。
获得进程主窗口的方法:
EnumWindows:http://msdn.microsoft.com/en-us/library/ms633497(VS.85).aspx
其中第一个参数是自定义的回调函数EnumWindowsProc的地址,详见http://msdn.microsoft.com/en-us/library/ms633497(VS.85).aspx

EnumWindowsProc的第一个参数就是枚举到的窗口句柄,然后用GetWindowText获得窗口标题

你贴的那个是用MFC的tab控件实现的。

关于tab控件的使用,下面有一个例子

1、首先创建一个MFC对话框框架,在对话框资源上从工具箱中添加上一个Tab Control 控件,根据需要修改一下属性,然后右击控件,为这个控件添加一个变量,将此控件跟一个CTabCtrl类变量绑定在一起,这里设为m_tabctrl
2、创建两个新的对话框资源,其属性作如下修改:
Border:none //边界为空,这样它就没了标题栏
Style :Child // 这样这个模板就可以当作另一个窗口的子窗口了。其它如果没有必要,就不用改了。
在上面加一些控件什么的,具体操作跟普通对话框没有区别。
完成后从这两个对话框模板生成两个新的对话框类。
3、在主对话框中为新添加进来的两个类增加两个变量:
如:CDialog1 m_mm1;
CDialog2 m_mm2;
4、在主对话框的OnInitDialog()函数中添加如下类似的代码:
TCITEM item;
item.mask = TCIF_TEXT;
item.pszText = "第一页";
m_tabctrl.InsertItem (0,&item);
item.pszText ="第二页";
m_tabctrl.InsertItem (1,&item);
m_mm1.Create (IDD_DIALOG1,&m_tabctrl);
m_mm2.Create (IDD_DIALOG2,&m_tabctrl);
m_mm1.SetWindowPos (NULL,10,30,400,100,SWP_SHOWWINDOW);
m_mm2.SetWindowPos (NULL,10,30,400,100,SWP_HIDEWINDOW );
解释如下:
两个InsertItem函数的调用是为了给标签控件增加两个标签页面,文本是标题。
SetWindowPos()函数设置这两个对话框在Z顺序中的位置,显示或隐藏状态.。
5、在主对话中为标签控件添加一个标签选择改变(TCN_SELCHANGE)的控件通知消息,以便在用户选择标签时通知主对话框。在主对话框的编辑界面右击标签控件,选择添加一个事件可以完成这个操作。
在事件处理中添加如下代码,如下例:
void CtabdialogDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
CRect r;
m_tabctrl.GetClientRect (&r);
switch(m_tabctrl.GetCurSel())
{
case 0:
m_mm1.SetWindowPos (NULL,10,30,r.right -20,r.bottom -40,SWP_SHOWWINDOW);
m_mm2.SetWindowPos (NULL,10,30,r.right -20,r.bottom -40,SWP_HIDEWINDOW );
break;
case 1:
m_mm1.SetWindowPos (NULL,10,30,r.right -20,r.bottom -40,SWP_HIDEWINDOW);
m_mm2.SetWindowPos (NULL,10,30,r.right -20,r.bottom -40,SWP_SHOWWINDOW );
break;
}
*pResult = 0;
}
要想知道用户选择那个标签页,要通过m_tabctrl.GetCurSel() 函数。为了不使显示的子对话框覆盖标签控件的显示,所以要获得标签控件的尺寸然后设置各页面的尺寸。
或者:
m_Tab.InsertItem(0,"第一页");
m_Tab.InsertItem(1,"第二页");
m_Tab.InsertItem(2,"第三页");
m_Tab.InsertItem(3,"第四页");
m_PageA.Create(IDD_PROPPAGE_A,&m_Tab);
m_PageB.Create(IDD_PROPPAGE_B,&m_Tab);
m_PageC.Create(IDD_PROPPAGE_C,&m_Tab);
m_PageD.Create(IDD_PROPPAGE_D,&m_Tab);
m_PageA.ShowWindow(SW_SHOW);
m_PageB.ShowWindow(SW_HIDE);
m_PageC.ShowWindow(SW_HIDE);
m_PageD.ShowWindow(SW_HIDE);

CWnd *wnd = GetDesktopWindow()->GetWindow(GW_CHILD);
while(wnd!=NULL)
{
if(wnd->IsWindowVisible())
{
wnd->GetWindowText(s);//窗口名
GetClassName(wnd->m_hWnd,buff,1024);//类名
str+=s+" ";
}
wnd = wnd->GetWindow(GW_HWNDNEXT);
}

用FindWindow获取窗口句柄,然后用GetWindowText获取窗口名字。

使用EnumWindows函数可以实现遍历所有的顶层窗口程序,并得到程序的句柄、类名及标题信息。
开发核心过程:
创建一个单文档的MFC工程,将其视图类的基类设置为CListView。在视图类的PreCreateWindow函数中,设置列表为报表格式,如下:
BOOL CEnumWindowsProcView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style |= LVS_REPORT | LVS_NOSORTHEADER;//设置列表视为报表格式
return CListView::PreCreateWindow(cs);
}
在视图类的初始化函数OnInitialUpdate()中,添加列表控件的表头,代码如下:
void CEnumWindowsProcView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
CListCtrl& lc = GetListCtrl();
lc.InsertColumn(0, _T("窗口句柄"),LVCFMT_LEFT,180);
lc.InsertColumn(1, _T("窗口类"),LVCFMT_LEFT,180,1);
lc.InsertColumn(2, _T("窗口标题"),LVCFMT_LEFT,280,1);
// TODO: You may populate your ListView with items by directly accessing
// its list control through a call to GetListCtrl().
}
添加菜单项“窗口程序信息”,并在视图类添加其响应:
void CEnumWindowsProcView::OnGet() //获取窗口信息
{
// TODO: Add your command handler code here
CListCtrl& lc = GetListCtrl();
lc.DeleteAllItems();
EnumWindows(MyEnumWindowsProc, (LPARAM)this);//遍历窗口程序
}
其中,MyEnumWindowsProc函数为订阅的回调函数,实现代码如下:
BOOL CALLBACK CEnumWindowsProcView::MyEnumWindowsProc(HWND hwnd, LPARAM lParam)
{
CEnumWindowsProcView* pView = (CEnumWindowsProcView*)lParam;
CListCtrl& lc =pView->GetListCtrl();
int iItem=-1;
if (hwnd!=pView->GetParentFrame()->GetSafeHwnd()) //不是本程序
{
DWORD dwStyle = GetWindowLong(hwnd, GWL_STYLE);
if ((dwStyle & WS_OVERLAPPEDWINDOW) && (dwStyle & WS_VISIBLE))
{
// add window to list
CString s;
s.Format("主窗口(%04X)",hwnd);//窗口句柄
iItem = lc.InsertItem(lc.GetItemCount(),s);
CWnd* pWnd = CWnd::FromHandle(hwnd);
// 窗口类名
::GetClassName(hwnd, s.GetBuffer(256), 256);
int iSubitem = 1;
lc.SetItemText(iItem,iSubitem++,s);
// 窗口标题
pWnd->GetWindowText(s);
lc.SetItemText(iItem,iSubitem++,s);
}
}
return TRUE;
}
编译运行程序。


怎样用MFC获得已经打开了的窗口的名字?
CWnd *wnd = GetDesktopWindow()->GetWindow(GW_CHILD);while(wnd!=NULL){ if(wnd->IsWindowVisible()){ wnd->GetWindowText(s);\/\/窗口名 GetClassName(wnd->m_hWnd,buff,1024);\/\/类名 str+=s+" ";} wnd = wnd->GetWindow(GW_HWNDNEXT);} ...

MFC中怎样让应用程序获得或以管理员权限运行
右击项目选择属性 链接器-》 清单文件 -》 UAC执行级别-》 改为requireAdministrator

mfc 怎样获得编辑框中的内容
先给编辑框指定变量,调用变量就可以调用编辑框里面的内容了。在ClassWizard里面转到MemberVariables,选上编辑框的ID后,点击右边Add Variables,输入名称就可以指定变量。以后调用该变量就行了。。获得编辑框的代码如下:UpdateData(true);\/\/用于将屏幕上控件中的数据交换到变量中。UpdateData(false);\/\/用于...

mfc单击鼠标左键获得当前鼠标的坐标
首先在视图类(或框架类)中添加一个CPoint m_pt的成员变量,然后在视图类中添加鼠标左击消息处理WM_LBUTTONDOWN即为:void CMy48View::OnLButtonDown(UINT nFlags, CPoint point){ \/\/ TODO: Add your message handler code here and\/or call default m_pt=point;CView::OnLButtonDown(nFlags, ...

如何用MFC方法或者win32API获得电脑中所有的用户
只有获得当前用户名 原型:int WINAPI icePub_getCurrentUser(char *strUserName)输入:输出:strUserName 当前登录用户名 char buff[1024];buff[0]=0;typedef int (WINAPI ICEPUB_GETCURRENTUSER)(char *strUserName);ICEPUB_GETCURRENTUSER *icePub_getCurrentUser = 0;HINSTANCE hDLLDrv = ...

mfc如何获得当前文件夹里面的一个.wav的文件的文件名?并把文件名存入一...
windows下枚举文件的函数只需要两个就可以 FindFirstFile FindNextFile,用法很简单,有两个参数一个是目录的路径,一个是得到的信息,返回值是用来查找下一文件或文件夹的句柄。。它相当于枚举器,足够你遍历一个盘下的所有文件信息了。。。你得到的文件信息只要判断后缀是不是wav即可。。。是就保存,...

MFC编辑框:回车得到输入的数据.
void CTestDlg::OnOK(){ \/\/ TODO: Add extra validation here CWnd * pwnd = GetFocus(); \/*获得当前焦点窗口指针*\/ if ( pwnd == GetDlgItem(IDC_EDIT1) )\/*看焦点是不是在指定编辑框上*\/ { UpdateData(TRUE); \/*若是,则更新所有数据。*\/ CString strEdit1; \/*用来保存输入...

MFC 中如何获得对话框中控件的ID值
在设计窗口,右击对话框设计窗口中要知道ID的控件,在弹出的菜单中选Properties,在弹出的属性框中的General选项中的ID:项右边的文本框中的内容就是了。

MFC如何通过窗口句柄获取窗口信息(名称)。
有效。获得进程主窗口的方法:EnumWindows:http:\/\/msdn.microsoft.com\/en-us\/library\/ms633497(VS.85).aspx 其中第一个参数是自定义的回调函数EnumWindowsProc的地址,详见http:\/\/msdn.microsoft.com\/en-us\/library\/ms633497(VS.85).aspx EnumWindowsProc的第一个参数就是枚举到的窗口句柄,然后用...

MFC 我用LoadImage得到一张位图的HBITMAP,接下来怎么获得图片大小
这样就可以:BITMAP bm;GetObject( hBitmap, sizeof(BITMAP), &bm);大小在BITMAP结构中。

山西省15887943665: 怎样用MFC获得已经打开了的窗口的名字? -
陀晨艾悉: 使用EnumWindows函数可以实现遍历所有的顶层窗口程序,并得到程序的句柄、类名及标题信息.开发核心过程:创建一个单文档的MFC工程,将其视图类的基类设置为CListView.在视图类的PreCreateWindow函数中,设置列表为报表格式...

山西省15887943665: MFC 判断子窗体是不是已经打开,避免重复创建 -
陀晨艾悉: 方法1:使用窗口枚举,然后匹配窗口名称.要求窗口有特殊名字 方法2:创建特定的全局mutex,检查mutex是否创建.要求mutex名字尽量独特以防根别人的冲突. 方法3:主窗体判断是否创建成功,若成功用特定的方法标记.a:成员标记.建立一个成员变量,用他的数值记录是否创建过子窗体 b:链表/树管理自窗体,没次创建时添加,销毁时删除.通过搜索判断是否创建等等.....方法非常多

山西省15887943665: mfc单文档中如何获取鼠标当前窗口的句柄? -
陀晨艾悉: 给你2个函数能够搞定.不懂查msdn使用方法.BOOL GetCursorPos(LPPOINT lpPoint); HWND WindowFromPoint(POINT Point );

山西省15887943665: MFC中,如何获取一个已知窗口标题的窗口的句柄
陀晨艾悉: 调用Windows API EnumWindows就可以枚举所有顶级窗口,所谓顶级窗口就是指没有父窗口的窗口. 函数定义: BOOL WINAPI EnumWindows( __in WNDENUMPROC lpEnumFunc, __in LPARAM lParam ); 第一个参数是回调函数的指针,...

山西省15887943665: MFC在程序中判断窗口是否已经运行
陀晨艾悉: 给你个函数: BOOL IsStart(CString strCurProcessName) { //得到本进程的ID号 DWORD dCurProcessID = GetCurrentProcessId(); HANDLE hSnapShot = NULL; hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if(...

山西省15887943665: MFC中怎样获取指定窗口的句柄 -
陀晨艾悉: 句柄获取方法(获取该窗口的句柄后,即可向该窗口类类发送消息、处理程序):0.获取所在类窗口的句柄: this->m_hwnd 1.主窗口的句柄: 无论在主窗口类内,还是子窗口类内,获取主窗口句柄的方法: AfxGetMainWnd()->m_hWnd, ...

山西省15887943665: vc mfc 如何获取当前程序的窗口并保存为图片 -
陀晨艾悉: 这个好像没有办法,我试过在暴风影音最前段显示的时候,用alt+print截取一个被遮住的窗口,前面的窗口也会被截取下来.对于被遮住的窗口部分会被裁减掉,所以基本在被遮住的情况下应该都不能截取.或者你可以让你的程序在最前端显示在截取.

山西省15887943665: MFC 如何获取 光标当前所在窗体 的窗体名称呢,GetForegroundWindow() 我不会用,有例子吗? -
陀晨艾悉: HWND hwnd; char title[256]; hwnd=GetForegroundWindow();::GetWindowText(hwnd,title,255);//标题

山西省15887943665: mfc获取窗口句柄 -
陀晨艾悉: 照你的程序来看,ReadTime 是全局函数,所以要获取主窗口句柄应该:h_d = AfxGetMainWnd()->GetSafeHwnd();::SetWindowText(::GetDlgItem(h_d, IDC_STATIC), str); 顺便说一句,IDC_STATIC很多static control都是用的这个ID,建议改一下.这一句还是错的:GetDlgItem(IDC_STATIC)->SetWindowText(str); 因为全局函数GetDlgItem不仅需要两个参数,而且返回值是HWND,是不能调用的.

山西省15887943665: MFC中怎样从一个线程中获取当前主窗口的句柄 -
陀晨艾悉: 这个函数返回了CWinThread指针,它的一个成员m_hThread就是线程的句柄再次执行你就要再调用AfxBeginThread,因为如果线程结束了,那你得到的句柄其实已经无效了

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网