MFC实现 获取其他应用程序窗口信息
文章转自王牌软件
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
只回答业务咨询
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
最近上网时看到有获取QQ号的方法,自己实现了下,没能获取QQ密码(听说从QQ2009后就很难获取了),但能获取一般应用程序的窗口信息。下面给出实现的具体细节。 要使用到几个API函数FindWindow, FindWindowEx, WindowFromPoint,SendMessage,GetWindowRect等。 FindWindow:用于获取应用程序的窗口句柄 HWND FindWindow( LPCTSTR lpClassName, // class name,窗口的类名称 LPCTSTR lpWindowName // window name,窗口标题名称 ); 使用时,两者只要知道一个就可以定位到你想要的窗口上了,若两个参数都为NULL,则搜索所有启动的进程,这里,为了获取应用程序的窗口信息,可以下载Spy++,这个软件很好用,可以获得窗口类名称,标题等信息。 FindWindowEx:用于获取应用程序中指定子窗口的句柄 HWND FindWindowEx( HWND hwndParent, // handle to parent window,应用程序窗口句柄 HWND hwndChildAfter, // handle to child window,子窗口的句柄 LPCTSTR lpszClass, // class name,子窗口类 LPCTSTR lpszWindow // window name,子窗口标题 ); 同样通过Spy++可以获取子窗口的相关信息,但窗口句柄是会变化的,子窗口的标题也不是都有,比如该子窗口是一编辑框。这样,我们还可以通过点试探的方法找到想要的字窗口,比如我们要得到QQ登录框中输入的用户名+密码。可以先得到登录框、密码框的屏幕坐标位置,然后在其中取一个点,利用WindowFromPoint函数得到该点所在的窗口句柄,该句柄就是我们感兴趣的窗口句柄。 得到了窗口句柄后,如何得到窗口的内容,或是对他做点什么呢,呵呵,这里,就要用到消息发送的知识了。 LRESULT SendMessage( HWND hWnd, // handle to destination window,接受消息的窗口句柄 UINT Msg, // message,消息类型 WPARAM wParam, // first message parameter,消息包含的附加信息 LPARAM lParam // second message parameter,消息包含的附加信息 ); 下面贴上我的程序代码: void CGetWindowTextView::OnUsername() { // TODO: Add your command handler code here m_qqhWnd=::FindWindow(NULL,"QQ2009 正式版 SP1"); if(m_qqhWnd) { //获取窗口句柄 CRect rect; ::GetWindowRect(m_qqhWnd,rect); CString str; str.Format("qq登录框在屏幕的(%d,%d,%d,%d)位置/r/n宽:%d;高:%d",rect.left,rect.top,rect.right,rect.bottom,rect.Width(),rect.Height()); CPoint user_pt; //将user_pt点定位到用户名框内 user_pt.x=rect.left+100; user_pt.y=rect.top+120; //获取用户名框的句柄 m_hUserWnd=::WindowFromPoint(user_pt); str="用户名:"; char buf[10]; //获取用户名 ::SendMessage(m_hUserWnd,WM_GETTEXT,(WPARAM)999,(LPARAM)buf); str=str+buf+"/r/n"; ::AfxMessageBox(str); // ::SendMessage(m_qqhWnd,WM_CLOSE,0,0);//发送消息,关闭qqhWnd窗口 } else MessageBox("查找窗口失败!"); } 密码获取要复杂些,因为密码框上都是***的东西,直接getText是不行的,分析知道,我们在创建编辑框是复选“密码”,显示时输入就是***了。这样,我们可以先修改密码框的样式,将“密码”复选去掉,再获取框中的内容就可以了,当然,得到想要的密码后,我们再将样式改回来,就神不知鬼不觉啦! void CGetWindowTextView::OnGetPassword() { // TODO: Add your command handler code here m_qqhWnd=::FindWindow(NULL,"QQ2009 正式版 SP1"); if(m_qqhWnd) { if(!m_qqhWnd) return FALSE; CRect rect; ::GetWindowRect(m_qqhWnd,rect); m_pwdWnd=::FindWindowEx(m_qqhWnd,NULL,"Edit",NULL); CPoint pwd_pt; //密码框相对于登录框的位置可以试出来,取下面的点可以保证落在密码框内 pwd_pt.x=rect.left+100; pwd_pt.y=rect.top+150; //m_pwdWnd=::WindowFromPoint(pwd_pt);//或者通过点来得到 if(!m_pwdWnd) { MessageBox("密码框获取失败!"); return FALSE; } str=”密码:"; //得到窗口的样式 LONG lstyle = ::GetWindowLong(m_pwdWnd,GWL_STYLE); if(lstyle & ES_PASSWORD) { LONG PassToChar = ::SendMessage(m_pwdWnd,EM_GETPASSWORDCHAR,0,0); ::PostMessage(m_pwdWnd,EM_SETPASSWORDCHAR,0,0); ::SendMessage(m_pwdWnd,WM_GETTEXT,50,(LPARAM)buf); ::PostMessage(m_pwdWnd,EM_SETPASSWORDCHAR,PassToChar,0); } str=str+buf+"/r/n"; ::AfxMessageBox(str); // ::SendMessage(m_qqhWnd,WM_CLOSE,0,0); } else MessageBox("查找窗口失败!"); } |
学习日记,兼职软件设计,软件修改,毕业设计。
本文出自 学习日记,转载时请注明出处及相应链接。
本文永久链接: https://www.softwareace.cn/?p=407