加载中…
个人资料
VB乐园
VB乐园
  • 博客等级:
  • 博客积分:0
  • 博客访问:1,844
  • 关注人气:18
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

VB遍历所有窗口的简单方法

(2012-02-12 17:49:41)
标签:

it

FindWindow()
GetNextWindow()
GetChileWindow()
可以像遍历目录一样地遍历所有窗口包括控件,甚至比spy++都详细。
下面是搜索到指定标题的IE,然后把他指定到其他URL的代码......

void SetTopWindow(HWND hwnd)
{
 ShowWindow(hwnd,SW_SHOWMINIMIZED);
 ShowWindow(hwnd,SW_SHOWDEFAULT);
 SetWindowPos(hwnd,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
 return;
}


int CompareText(const TCHAR *title,const TCHAR *findName)
{
 int titIndex=0;
 int findIndex=0;
 while(*(findName+findIndex)!='\0')
 {
  if(*(findName+findIndex)==*(title+titIndex))
  {
   findIndex++;
   titIndex++;
   if(*(title+titIndex)=='\0')
    return 1;
  }
  else if(*(findName+findIndex)!=*(title+titIndex))
  {
   findIndex++;
   titIndex=0;
  }
 }
 return -1;
}


HWND FindMikeIE(TCHAR *title)
{
 HWND hwnd=0;
 hwnd=FindWindow("IEFrame",NULL);
 if(hwnd==0)
 {
  MessageBox(NULL,"当前没有IE窗口存在!!!","错误",0);
  return 0;
 }
 TCHAR IETitle[100];
 int ret=0;
 GetWindowText(hwnd,IETitle,sizeof(IETitle));
 ret=CompareText(title,IETitle);
 if(ret==1)
 {
  SetTopWindow(hwnd);
 
  return hwnd;
 }
 else{
  while((hwnd=GetNextWindow(hwnd,GW_HWNDNEXT))!=NULL)
  {
   GetWindowText(hwnd,IETitle,sizeof(IETitle));
   ret=CompareText(title,IETitle);
   if(ret==1)
   {
    SetTopWindow(hwnd);
    return hwnd;
   }
  }
 }
 MessageBox(NULL,"没有找到指定的窗口","错误",0);
 return 0;
}


void FindIEAndChangeURL(char *title,char * URL)
{
 HWND hwnd;

 hwnd=FindMikeIE(title);
 if(hwnd==0)
 {
  MessageBox(NULL,"没有找到指定标题的IE窗口","错误",0);
  return;
 }
 else
 {
  bool bfind=false;
  HWND hSub=0;
  hSub=FindWindowEx(hwnd,0,TEXT("WorkerW"),NULL);
 
  while(hSub &&!bfind)
  {
   HWND hss=0;
   hss=FindWindowEx(hSub,0,TEXT("ReBarWindow32"),NULL);
 
   while(hss && !bfind)
   {
    HWND hAdd=0;
    hAdd=FindWindowEx(hss,0,TEXT("ComboBoxEx32"),NULL);
  
    if(hAdd)
    {
     
     bfind=true;

     SendMessage(hAdd,WM_SETTEXT,0,(LPARAM)URL);
    
     keybd_event(VK_F6,0,KEYEVENTF_EXTENDEDKEY,0);
     keybd_event(VK_F6,0,KEYEVENTF_KEYUP,0);
     Sleep(500);//不用这个的话,好像程序执行的太快了,下面的回车按钮发过去,会没有反应,汗一下.....
    
     keybd_event(VK_RETURN,0,KEYEVENTF_EXTENDEDKEY,0);
     keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
     return;
    }
   }
   hSub=FindWindowEx(hwnd,hSub,TEXT("ReBarWindow32"),NULL);
 
  }
 }
 MessageBox(NULL,"没有找到指定标题的IE窗口","错误",0);

}


 

 

>>>>>>>>>>>>>>>>

 

HWND FindWindowEx(
HWND hwndParent, // handle to parent window 父窗口句柄
HWND hwndChildAfter, // handle to a child window 子窗口句柄,如果为NULL就从第一个开始找
LPCTSTR lpszClass, // pointer to class name 类名
LPCTSTR lpszWindow // pointer to window name 窗口或者控件的title或者caption
);
----------------------------------------------------------

那FindWindowEx 到底是要做什么呢?
他不是要返回一个句柄吗,它返回的是哪个窗口的句柄?
-----------------------------------------------------------

FindWindowEx是返回子窗口句柄用的
比如:打开一个.txt文件
你用FindWindow函数只能找到父窗口的名字可能是ff.txt
但你要找到文件输入框就用这个FindWindEx函数
----------------------------------------------------------

这是一个使用FindWindowEx枚举窗口的例子
#include <windows.h>
#include <STDIO.H>
BOOL myEnumWindow(HWND hwnd);
int main()
{
myEnumWindow(NULL);
return 0;
}

BOOL myEnumWindow(HWND inHwnd)
{
char szText[256];

HWND hwndAfter = NULL;
while(hwndAfter = ::FindWindowEx(inHwnd,hwndAfter,NULL,NULL))
{
memset(szText,0,256);
::SendMessage(hwndAfter,WM_GETTEXT,(WPARAM)256,(LPARAM)szText);
printf("%s\t",szText);
myEnumWindow(hwndAfter);
}
return 1;
}

 

>>>>>>>>>>>>>

 

GetNextWindow
函数功能:该函数返回z序中的前一个或后一个窗口的句柄。下一窗口在指定窗口的下面,前一窗口则在上面。如果指定的窗口是顶端窗口,该函数返回下一个(或前一个)顶端窗口的句柄。如果指定的窗口是顶层窗口,函数返回下一个(或前一个)顶层窗口的句柄。如果函数是子窗口,则函数搜索下一个或前一个子窗口的句柄。

    函数原型:HWND GetNextWindow(HWND hWnd,UNIT wCmd);

    参数:

    hWnd:一个窗口的句柄。窗口句柄在wCmd参数的基础上获得的相对于这个窗口的句柄。

    wCmd:指明窗口返回的是前一窗口的句柄还是后一窗口的句柄。该参数可以是下列两个值之一:

    GW HWNONEXT:返回在给定窗口的下面窗口的句柄。

    GW_HWNDPREV:返回在给定窗口的上面窗口的句柄。

    返回值:如果函数成功,返回值是前一窗口(或后一窗口)的句柄。如果前后窗口不存在,则返回值为NULL。若想获得更多错误信息,请调用GetLastError函数。

    备注:在设定了GW_HWNDNEXT或GW_GETPREV标志时,调用该函数与调用GetWindow函数相同。

    速查:Windows NT:3.1以上版本;Windows:95以上版本:Windows CE:不支持:头文件:Winuer.h;库文件:user32.lib。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有