求方法如何获取其他程序窗口上win32 获取控件句柄柄

MFC实现&获取其他应用程序窗口信息
一、一些解释
最近上网时看到有获取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(
hwndParent,&&&&&
// handle to parent window,应用程序窗口句柄
& HWND hwndChildAfter,& //
handle to child window,子窗口的句柄
lpszClass,&&& //
class name,子窗口类
lpszWindow&&& //
window name,子窗口标题
同样通过Spy++可以获取子窗口的相关信息,但窗口句柄是会变化的,子窗口的标题也不是都有,比如该子窗口是一编辑框。这样,我们还可以通过点试探的方法找到想要的字窗口,比如我们要得到QQ登录框中输入的用户名+密码。可以先得到登录框、密码框的屏幕坐标位置,然后在其中取一个点,利用WindowFromPoint函数得到该点所在的窗口句柄,该句柄就是我们感兴趣的窗口句柄。
得到了窗口句柄后,如何得到窗口的内容,或是对他做点什么呢,呵呵,这里,就要用到消息发送的知识了。
LRESULT SendMessage(
hWnd,&&&&&
// handle to destination window,接受消息的窗口句柄
Msg,&&&&&&
// message,消息类型
& WPARAM wParam,& // first
message parameter,消息包含的附加信息
lParam&& // second message
parameter,消息包含的附加信息
下面贴上我的程序代码:
void CGetWindowTextView::OnUsername()
// TODO: Add your command handler code here
m_qqhWnd=::FindWindow(NULL,"QQ2009 正式版 SP1");
if(m_qqhWnd)
&&&&&&&&&&&&&
//获取窗口句柄
&&&&&&&&&&&&&
&&&&&&&&&&&&&
::GetWindowRect(m_qqhWnd,rect);
&&&&&&&&&&&&&
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_
//将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窗口
&&&&&&&&&&&&&
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;
&&&&&&&&&&&&&
::GetWindowRect(m_qqhWnd,rect);
m_pwdWnd=::FindWindowEx(m_qqhWnd,NULL,"Edit",NULL);
CPoint pwd_
//密码框相对于登录框的位置可以试出来,取下面的点可以保证落在密码框内
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);
&&&&&&&&&&&&&
MessageBox("查找窗口失败!");
本文来自CSDN博客,转载请标明出处:
二、其他的一些代码:
//遍历窗口内的控件
&char szText[255];
&memset(szText,0,sizeof(szText));
&HWND hWnd2= (HWND)0x000D0298;
&UINT nCtrlID =
::GetDlgCtrlID(hWnd2);&
&//::SendMessage(hWnd2,WM_COMMAND,nCtrlID,0);
&CWnd *pCW
&pCWnd=FromHandle(hWnd2);
&pCWnd-&SetWindowText("ASDFASDF");
&pCWnd-&EnableWindow(TRUE);
&::PostMessage(hWnd2, WM_COMMAND,
(WPARAM)(BN_CLICKED && 16 | nCtrlID),
(LPARAM)hWnd2);&
&::PostMessage(hWnd2,WM_MOUSEMOVE, MK_LBUTTON,
MAKELONG(0,0)
&::PostMessage(hWnd2,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(0,0));&&&&&&&
&::PostMessage(hWnd2,WM_LBUTTONUP,MK_LBUTTON,MAKELPARAM(0,0));&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。已解决问题
怎么取外部窗口按钮的控件ID,达到获取句柄,模拟点击他
提问时间: 12:40:22
怎么取外部窗口按钮的控件ID,达到获取句柄,模拟点击他
浏览次数:6813
该答案已经被保护
子程序_按钮_后台键盘模拟_被单击取句柄()键盘_消息(外部编辑框句柄,#A键,)输出调试文本(1),245,,.如果真(外部窗口句柄>0)外部按钮句柄=窗口_取句柄(外部窗口句柄,假,,.子程序_按钮_后台鼠标点击按钮_被单击取句柄()发送消息整数(外部按钮句柄,&Edit&,,,整数型外部窗口句柄=窗口_取句柄(.局部变量外部窗口句柄,).exe&.子程序__启动窗口_创建完毕运行(取运行目录()+&&#92,0,&被点击的程序&),&按钮&)外部编辑框句柄=窗口_取句柄(外部窗口句柄,0).子程序取句柄.版本2;第三方程序.如果真结束。
答案创立者
以企业身份回答&
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题发表一些关于平时学习的内容,也是自己学习总结
获取窗口的句柄方法总结
句柄获取方法(获取该窗口的句柄后,即可向该窗口类类发送消息、处理程序):
例如:::PostMessage("句柄", WM_USER_DRAWVIEWPIC_EDS, 0, 0);
0。获取所在类窗口的句柄:
this-&m_hwnd
1。主窗口的句柄:
无论在主窗口类内,还是子窗口类内,获取主窗口句柄的方法:
AfxGetMainWnd()-&m_hWnd,
如:::SendMessage(AfxGetMainWnd()-&m_hWnd , WM_MY_DOSOME , 0 ,(LPARAM)i);
在窗口类中
this-&m_hWnd
或者this-&GetSafeHwnd()
2。子窗口句柄:用FindWindow,(只要知道子窗口的名字即可)如:
::FindWindow(NULL,WindowsName)
返回找到的窗口的句柄
寻找当前窗口是否在运行windowname的程序,该名字为窗口名字,如:
CWnd* pWnd=FindWindow(NULL,_T("清芝--支票机"));//
GetSafeHwnd
函数功能:获取某个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用
GetSafeHwnd()函数。
通过下面的例子来看其理由:
  CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器
  HWND hwnd = pwnd-&m_ //得到它的HWND
  这样的代码当开始得到的pwnd为空的时候就会出现一个“General protection error”,并关闭应用
程序,因为一般不能对一个NULL指针访问其成员,如果用下面的代码:
  CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器
  HWND hwnd = pwnd-&GetSafeHwnd(); //得到它的HWND
  就不会出现问题,因为尽管当pwnd是NULL时,GetSafeHwnd仍然可以用,只是返回NULL
3。获取窗口中 控件的句柄,用 GetDlgItem
语法为:GetDlgItem(IDC_COMBO3)-&m_hWnd :参数为 该控件的ID,返回值为:CWnd* 类型,但它是CWnd类
内的函数,因此要先获取控件所在窗口的指针,如:
CString str(_T("dd"));
::SendMessage(AfxGetMainWnd()-&GetDlgItem(IDC_COMBO3)-&m_hWnd, WM_SETTEXT , 0 , (LPARAM)
str.GetBuffer(0));
从句柄获得指针,用 FromHandle
语法:CWnd* pWnd = CWnd::FromHandle(hWnd);
获取窗口句柄(全集) vc&MFC
获得窗口句柄:
this-&m_hwnd
HWND GetForegroundWindow(VOID);
GetSafehWnd 取你程序所在窗口类的句柄
GetActiveWindow 取当前活动窗口句柄
AfxGetMainWnd 取主窗口句柄
GetForegroundWindow 取前台窗口句柄
FindWindow
EnumWindow
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!豆丁微信公众号
君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
C++获得其他程序窗体控件中信息的方法
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口C++ 一个程序获取另一个程序Edit控件的内容 - 鹿我所录 - 博客园
//一个程序获取另一个程序Edit控件的内容
//根据指定程序的标题名获取改程序窗口的句柄
HWND hWnd=::FindWindow(NULL,"zhang001");
MessageBox("get windows");
//根据窗口句柄获取EDIT控件的ID,但是这个ID是通过VS工具spy++获取的
HWND h = ::GetDlgItem(hWnd,0x3E9);
if (h!=NULL)
CString str0;
//要知道SendMessage用法,特别是第三个参数
//根据EDIT控件的ID获取控件内容,存放到str0中
::SendMessage(h,WM_GETTEXT,20,(LPARAM)(LPCTSTR)str0);
//将获得的内容放到本程序指定的EDIT控件中进行显示
GetDlgItem(IDC_EDIT1)-&SetWindowText(str0);
MessageBox(str0);
MessageBox("fail!");
运行结果如下:
采用以上程序由于采用CString,获取的内容大小不定,当制定的缓存和制定的大小不一样时就会产生一下的错误
整个程序改为一下代码,就好了:
//一个程序获取另一个程序Edit控件的内容
//根据指定程序的标题名获取改程序窗口的句柄
GetDlgItemText(IDC_TITLE,str);
HWND hWnd=::FindWindow(NULL,str);//"zhang001"
MessageBox("get windows");
//根据窗口句柄获取EDIT控件的ID,但是这个ID是通过VS工具spy++获取的
HWND h = ::GetDlgItem(hWnd,0x3E9);
if (h!=NULL)
//CString str0;
char temp[50];
//要知道SendMessage用法,特别是第三个参数
//根据EDIT控件的ID获取控件内容,存放到str0中
::SendMessage(h,WM_GETTEXT,sizeof(temp)/sizeof(char),(LPARAM)temp);//第三个和第四个参数是缓存大小和缓存指针
//将获得的内容放到本程序指定的EDIT控件中进行显示
GetDlgItem(IDC_EDIT1)-&SetWindowText(temp);
//MessageBox(str0);
MessageBox("fail!");
&注:要想获取某控件的位置 可以使用下面的方法
GetDlgItem(控件ID)-&GetWindowRect(&rect);//获取控件基于全频的位置
ScreenToClient(rect);//转换为对话框上的相对位置
&如何获取控件的ID
CWnd *pWnd = GetFocus();
if(pWnd == NULL)
;//no focus
UINT nID = pWnd-&GetDlgCtrlID();
HWND hWnd = ::GetFocus();
if(hWnd == NULL)
;//no focus
UINT nID = ::GetDlgCtrlID(hWnd);
GetFocus: The return value is the handle to the window with the keyboard focus. If the calling thread's message queue does not have an associated window with the keyboard focus, the return value is NULL.
随笔 - 194

我要回帖

更多关于 mfc 获取控件句柄 的文章

 

随机推荐