获取与设置外部程序窗口及控件文本--上位机VC
获取与设置外部程序窗口及控件文本--上位机VC
功能展示
在设备改造时,总会遇到对厂家上位机程序控件的需要,当前例程实现对外部程序窗口标题及窗口内控件内容(如编辑框文本)读写功能,效果如图,程序运行会调用<刷新>按钮函数实现当前打开窗口及其子窗口的句柄,类名,标题及文本,选择要修改的文本行,点击<设置文本>可对行内窗口句柄的文本进行设置
要点提示
窗口文本的获取与设置主要是通过函数SendMessageTimeout()实现;该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,并且,如果指定的窗口属于不同的线程,直到窗口程序处理完消息或指定的超时周期结束函数才返回。如果接收消息的窗口和当前线程属于同一个队列,窗口程序立即调用,超时值无用。 函数原型:LRESULTSendMessageTimeout(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM IParam,UINTfuFlags,UIUT uTimeout,LPDWORD lpdwResultult) hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口。 Msg:指定被发送的消息。 wParam:指定附加的消息指定信息。 IParam:指定附加的消息指定信息。 fuFlags;指定如何发送消息。此参数可为下列值的组合: SMTO_ABORTIFHUNG:如果接收进程处于“hung”状态,不等待超时周期结束就返回。 SMTO_BLOCK:阻止调用线程处理其他任何请求,直到函数返回。 SMTO_NORMAL:调用线程等待函数返回时,不被阻止处理其他请求。 SMTO_NOTIMEOUTIFNOTHUNG:Windows95及更高版本:如果接收线程没被挂起,当超时周期结束时不返回。 uTimeout:为超时周期指定以毫秒为单位的持续时间。如果该消息是一个广播消息,每个窗口可使用全超时周期。例如,如果指定5秒的超时周期,有3个顶层窗回未能处理消息,可以有最多15秒的延迟。
IpdwResult:指定消息处理的结果,依赖于所发送的消息。 返回值:如果函数调用成功,返回非零值。如果函数调用失败,或超时,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。如果GetLastError返回零,表明函数超时。如果使用HWND_BROADCAST,SenddMessaggTimeout不提供单个窗口超时信息。
例程中设置指定窗口文本代码为 SendMessageTimeout(hWnd,WM_SETTEXT, _MAX_FNAME, (LPARAM)sText.GetBuffer(_MAX_FNAME), 0, 1000,&result);
其中WM_SETTEXT是要设置文本的指令消息,换成WM_GETTEXT ,就是获取文本的指令消息,sText文本内容 实现功能 1.新建基于对话框的应用程序
2.拖拽一列表控件关联变量CListCtrl m_List;用于获取窗口信息,添加编辑框控件IDC_EDIT1,用于输入要设置的文本,添加按钮<设置文本><刷新>实现文本的设置及窗口的刷新,先关联按钮的点击函数 - void CGkbc8Dlg::OnButton2()
- {
- int nIndex=m_List.GetSelectionMark();
- if(nIndex == -1) return;
- CString sData = m_List.GetItemText(nIndex,0);
- sData = sData.Right(sData.GetLength()-sData.ReverseFind(':')-1);//抽取出窗口句柄
- HWND hWnd = (HWND)atol(sData);
- CString sText;
- DWORD result;
- GetDlgItemText(IDC_EDIT1,sText);
- SendMessageTimeout(hWnd,
- WM_SETTEXT,//set text
- _MAX_FNAME, (LPARAM)sText.GetBuffer(_MAX_FNAME), 0, 1000, &result);
- }
- void CGkbc8Dlg::OnButton1()
- {
- m_List.DeleteAllItems();
- EnumWindows(EnumWindowsProc, (LPARAM)this);
- }
- 3.初始化列表控件,设置其为报表形式及添加表头
- m_List.ModifyStyle(0,LVS_REPORT,FALSE);
- m_List.InsertColumn(0, _T("父/子窗口"),LVCFMT_LEFT,100);
- m_List.InsertColumn(1, _T("类名"),LVCFMT_LEFT,100,1);
- m_List.InsertColumn(2, _T("窗口标题名"),LVCFMT_LEFT,200,1);
- m_List.InsertColumn(3, _T("文本获取/显示"),LVCFMT_LEFT,250,1);
- OnButton1();//获取全部窗口
复制代码- 4.添加自定义函数,实现向列表控件直充获取的窗口标题等信息
- public:
- static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
- static BOOL CALLBACK EnumChildWindowsProc(HWND hwnd, LPARAM lParam);
- void AddWindowToList(HWND hwnd);
- void AddWindowInfo(int iItem, HWND hwnd);
- void AddChildWindowToList(HWND hwnd);
- BOOL CALLBACK CGkbc8Dlg::EnumWindowsProc(HWND hwnd, LPARAM lParam)
- {
- CGkbc8Dlg* pDlg = (CGkbc8Dlg*)lParam;
- pDlg->AddWindowToList(hwnd);
- return TRUE;
- }
- BOOL CALLBACK CGkbc8Dlg::EnumChildWindowsProc(HWND hwnd, LPARAM lParam)
- {
- CGkbc8Dlg* pDlg = (CGkbc8Dlg*)lParam;
- pDlg->AddChildWindowToList(hwnd);
- return TRUE;
- }
- void CGkbc8Dlg::AddWindowToList(HWND hwnd)
- {
- int iItem=-1;
- if (hwnd!=GetParentFrame()->GetSafeHwnd())
- {
- DWORD dwStyle = GetWindowLong(hwnd, GWL_STYLE);
- if ((dwStyle & WS_OVERLAPPEDWINDOW) && (dwStyle & WS_VISIBLE))
- {
- // add window to list
- CString s;
- s.Format("Main Window:%d",hwnd);
- iItem = m_List.InsertItem(m_List.GetItemCount(),s);
- // add window information to list control subitems
- AddWindowInfo(iItem, hwnd);
- // add window's children
- EnumChildWindows(hwnd, EnumChildWindowsProc, (LPARAM)this);
- }
- }
- }
复制代码- void CGkbc8Dlg::AddWindowInfo(int iItem, HWND hwnd)
- {
- CWnd* pWnd = CWnd::FromHandle(hwnd);
- int iSubitem = 1;
- // add class name
- CString s;
- ::GetClassName(hwnd, s.GetBuffer(_MAX_FNAME), _MAX_FNAME);
- m_List.SetItemText(iItem,iSubitem++,s);
- // add window text -- use GetWindowText
- pWnd->GetWindowText(s);
- m_List.SetItemText(iItem,iSubitem++,s);
- // add window text -- use WM_GETTEXT
- DWORD result;
- SendMessageTimeout(hwnd,
- WM_GETTEXT,//get text
- _MAX_FNAME, (LPARAM)s.GetBuffer(_MAX_FNAME), 0, 1000, &result);
- m_List.SetItemText(iItem,iSubitem++,s);
- s.ReleaseBuffer();
- }
- void CGkbc8Dlg::AddChildWindowToList(HWND hwnd)
- {
- int iItem=-1;
- CString s;
- GetClassName(hwnd, s.GetBuffer(_MAX_FNAME),_MAX_FNAME);
- s.ReleaseBuffer();
- if (s=="Edit") //only get content of edit control
- {
- // found an edit control: add it
- s.Format(" Edit:%d",hwnd);
- iItem = m_List.InsertItem(m_List.GetItemCount(),s);
- AddWindowInfo(iItem, hwnd);
- }
- }
复制代码
我们来演示下功能实现的整个过程
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|