热门搜索 :
考研考公
您的当前位置:首页正文

vc获取窗体句柄gethandle

来源:伴沃教育
vc获得窗口句柄

2008-01-1823:11

1.HWNDFindWindow(LPCTSTRlpClassName,LPCTSTRlpWindowName)HWNDFindWindowEx(HWNDhwndParent,HWNDhwndChildAfter,LPCTSTRlpClassName,LPCTSTRlpWindowName)2.HWNDWindowFromPoint(POINT&Point)

3.4组语句

BOOLCALLBACKEnumChildProc(HWNDhwnd,LPARAMlParam)

BOOLCALLBACKEnumChildWindows(HWNDhWndParent,WNDENUMPROClpEnumFunc,LPARAMlParam)

BOOLCALLBACKEnumWindows(WNDENUMPROClpEnumFunc,LPARAMlParam)BOOLCALLBACKEnumWindowsProc(HWNDhwnd,LPARAMlParam)一般用途:

对于第一种,大家都很熟悉,是捕捉句柄的常规武器,FindWindow这两兄弟,可以接受捕捉对象的类名或者窗口标题之一,作为参数,返回一个HWND。可是对于一般群众,不一定知道所有的窗口(包括标题栏、按钮等等)的类名啊!——可以简单举例,请问你知道桌面图标的窗口的类名吗?而对于窗口标题,有可能会出现相同的标题,有两个窗口——指一个程序的两个进程,这又是个麻烦吧!好了,这个问题先放放,继续下一组。第二组,通过win32定义的POINT结构(typedefstructtagPOINT{LONGx,LONGy;}POINT),来获得当前鼠标光标位置的窗口HWND,这是最直观的武器!常规操作如下:先得到Cursor的POINT(BOOLGetCursorPos(LPPOINT)函数),再用WindowFromPoint。这样,我们几乎可以获得任何打开的有窗口的函数的HWND了!然后通过获取类名的win32api函数(intGetClassName(HWNDhWnd,LPTSTRlpClassName,intnMaxCount))得到类名——这里的lpClassName最好用字符数组地址,nMaxCount就是数组的size了,同时,这种方法解决了第一个问题的麻烦!——我可以把鼠标放在任何地方!*^_^*

第三组,这些是用来列举和处理任何窗口的超级武器!通过组合运用EnumWindows和EnumWindowsProc,EnumChildWindows与EnumChildProc,可以扫描桌面所有窗口并对之处理!我的理解:(这部分用任务驱动式教学方法——谁让小弟是老师呢!xixi)任务:得到所有的窗口的类名。

1:解决办法:

我们会先想到第三组,可以自桌面窗口开始(它是所有窗口的祖先),依次扫描,获取类名并存之。有点儿像VisualStdio的Spy++,或者Borland的WinSight32,具体办法如下:(bcb中)在主程序中,调用EnumWindows,传入YouEnumProc的函数地址作第一个参数,别忘了转换成WNDENUMPROC类型。第二参可NULL。

::EnumWindows(reinterpret_castYouEnumProc,NULL);在YouEnumProc函数中,如果第

一参HWND==NULL,就跳离(returnFALSE;),可以结束啦!然后,把类名数组准备好,得到类名,存之。返回真值,继续下一次扫描。看起来并不复杂,是一种函数递归。但是我可会解释!面啊!:p

2:解决方法:

简单、直观——自己想出来的,颇得意首先准备一个时钟,一种存类名方法(我用TMemo)在定时器处理函数中:1)得到当前cursor的点位置;2)再用WindowFromPoint;3)然后得到类名,放到TMemo里这样可以用鼠标获得你想要的窗口(包括按钮等),只要鼠标在窗口放一会儿。。。

3:解决方法:

其实利用FindWindow和循环结构也应该可以总结:其实得到HWND的方法很多,比如知道了窗口层次,依次向下扫。。。在说第三种呢!但我觉得,我的方法最直接有效,你说呢?欢迎大家与我联系,并讨论这个问题!有关这个问题我还有许多疑问,比如HWND与ID的转换,在如IE页面中的表单控件的HWND或ID,还是其他的东东,总之是能识别他的东西。。。这个我很困惑,没办法!不清楚地方,大家要参照MSDN啊!

如何获得对话框子窗口的句柄??用AfxGetMainWnd可以获得主窗口的句柄。

2006-08-1717:01

如何获得对话框子窗口的句柄??用AfxGetMainWnd可以获得主窗口的句柄。voidASEnumWnd::OnBUTTONEnumWnd(){

m_WndListBox.ResetContent();//一次清空

if(!::EnumWindows((WNDENUMPROC)enumProc,0))AfxMessageBox(\"Error\");Invalidate(true);}

//枚举当前所有窗口并显示在ListBox中.

BOOLCALLBACKenumProc(HWNDhwnd,LPARAMlParam){

if(hwnd==NULL)returnFALSE;

if(::IsWindow(hwnd)&&::IsWindowVisible(hwnd)){

TCHARszCap[255]={0};

::GetWindowText(hwnd,szCap,255);

ASEnumWnd*pDlg=(ASEnumWnd*)::FindWindow(NULL,\"程序列表\");

//?????

pDlg->m_WndListBox.AddString(szCap);}

returnTRUE;

}

我本想通过这句获得该窗口的句柄,但是程序运行总是报错,直接就终止了。ASEnumWnd*pDlg=(ASEnumWnd*)::FindWindow(NULL,\"程序列表\");是否FindWindow这样转换后丢失了一些信息?

原来是用AfxGetMainWnd实现的,现在这个对话框是通过主窗口调用显示的,所以不能再用它了。

应该换成什么呢??

FindWindow返回的是窗口句柄,你强制转换成指针了,应该HWNDhwnd;

hwnd=::FindWindow(NULL,\"程序列表\");CWnd*wnd=FromHandle(hwnd);

不能直接用GetDlgItem吗?如果如果是捕捉当前工作区的窗口可以直接用GetDlgItem取得指定控件ID的窗口指针.

如果要根据条件捕获其他进程的窗口可以做以下操作

HWNDg_hParantWnd=::FindWindow(NULL,\"程序列表\");

HWNDhWnd=::FindWindowEx(g_hParantWnd,NULL,\"AfxWnd42\NULL);

HWNDhChild=::GetDlgItem(hWnd,ID);//ID为窗口中指定控件ID,可以通过Spy++查找CListBoxx;

x.Attach(hChild);

tolegendhui(何离心之可同兮,吾将远逝以自疏)抛错:

errorC2065:'FromHandle':undeclaredidentifier使用全局函数试试::FromHandle

获得同一程序全部实例顶级窗口句柄

2007-04-2910:39

当一个含有窗口的程序只有一个运行实例的时候,可以用FindWindow函数或CWnd::FindWindow函数得到其顶级窗口句柄。

但是当这个程序有多个运行实例同时运行时,FindWindow只能返回最后一个被激活的窗口句柄。

怎样才能得到所有的运行实例呢(这样才可以像所有的实例发送消息么:)).这就要用到EnumWindows函数了。------------------------------------EnumWindows

函数功能描述:Enum顶层窗口

1.函数原形

BOOLEnumWindows(WNDENUMPROClpEnumFunc,LPARAMlParam);//某些时候调用需要采用如下强制转化:

EnumWindows((FARPROC)EnumWindowsProc,0);2.参数

WNDENUMPROClpEnumFunc:回调函数,返回值为TRUE,则继续查找;为FALSE则终止EnumWindows

LPARAMlParam:用户定义的数据3.返回值

成功返回TRUE,否则返回FALSE4.适用平台

WindowsNT/2000/XP/95/98/Me头文件:Winuser.h库文件:User32.lib.5.例子

下面代码获取所有窗口的句柄,并保存到向量里std::vectorg_AllWindow;

BOOLCALLBACKEnumWindowsProc(HWNDhwnd,LPARAMlParam){returng_AllWindow.push_back(hwnd),TRUE;}//Enum所有窗口,所以总返回TRUE

voidGetAllWindow(){

EnumWindows(&EnumWindowProc,0);}

而这个例子可以将你所需的窗口(窗口类为CMainFrame,窗口标题包含MyWindowText)都存储起来

typedefstructWndCharacter{

charclassname[128];charwndText[128];}WNDChara;

staticboolIsFindWindow(HWNDhwnd,LPARAMlParam)//如果是类函数,需要写成静态函数。

{

charbuf[128];

GetClassName(hwnd,buf,sizeof(buf));

if(memcmp(buf,((WNDChara*)lParam)->classname,10)!=0)returnfalse;

GetWindowText(hwnd,buf,sizeof(buf));

returnstrstr(buf,((WNDChara*)lParam)->wndText)?true:false;}

std::vectorg_AllWindow;

BOOLCALLBACKEnumWindowsProc(HWNDhwnd,LPARAMlParam)//注意:类型是BOOL或INT,不是bool

{

if(IsFindWindow(hwnd,lParam)){

g_AllWindow.push_back(hwnd);

}

return1;//要一直return1.因为需要遍历所有的窗口,一旦返回0将停止遍历。}

voidGetAllWindow(){

WNDCharawc;

strncpy(wc.classname,\"CMainFrame\10);strncpy(wc.wndText,\"MyWindowText\12);EnumWindows(&EnumWindowProc,&wc);}

======================================

附带:要找所有子窗口,用EnumChildWindows()函数。在MFC程序中,调用这些函数可能需要使用全局命名空间。例如

::GetWindowText(hwnd,(LPTSTR)buf,128);::GetWindowTextLength(hwnd);

::EnumWindows(&EnumWindowsProc,(long)szAppName))

怎样得到窗口句柄的问题

2007-12-1015:14

在DLL封装对话框,涉及到怎样得到窗口句柄的问题1、直接得句柄GetActiveWindow();

//得激活窗口句柄

//的前台窗口句柄

//很常规的,涉及到很多方法

GetForegroundWindows();

AfxGetApp()->GetMainWnd()->GetSafeHwnd()2、枚举型的HWNDGetWindow(

HWNDhWnd,UINTuCmd);

HWNDFindWindowEx(HWNDhwndParent,HWNDhwndChildAfter,LPCTSTRlpszClass,LPCTSTRlpszWindow);确定

3、其他参数的句柄进程ID:

//要先有hWnd,然后指明uCmd的关系

//由类名和窗口标题得句柄,可能不只一个,所以不唯一

MARK:由句柄得ID可以用GetWindowThreadProcessId()而由ID的句柄只能枚举+比较了

遍历全部窗体,并取得他们对应的HWND进一步取得对应PID,符合已知PID的就是了,当然可能要判断一下窗体状态了,如果进程只有一个窗体那就不用了。例:

如果要在列表框里显示所有的窗口

BOOLCALLBACKEnumWindowsProc(HWNDhwnd,//handletoparentwindowLPARAMlParam//application-definedvalue){

charlpWinTitle[256];

::GetWindowText(hwnd,lpWinTitle,256-1);CStringm_strTitle;

m_strTitle.Format(\"%s\CListBox*p_l=(CListBox*)lParam;if(!m_strTitle.IsEmpty()){

p_l->AddString(lpWinTitle);}

returnTRUE;}

调用EnumWindows(EnumWindowsProc,(LPARAM)GetDlgItem(IDC_LIST1));这段程序MARK在挂的ASSIS的DLL中

(全集)获得窗口句柄获得窗口句柄(全集)

this->m_hwnd

HWNDGetForegroundWindow(VOID);GetSafehWnd取你程序所在窗口类的句柄GetActiveWindow取当前活动窗口句柄AfxGetMainWnd取主窗口句柄GetForegroundWindow取前台窗口句柄FindWindowEnumWindow

因篇幅问题不能全部显示,请点此查看更多更全内容

Top