QQ登录

只需一步,快速开始

获取与设置外部程序窗口及控件文本--上位机VC

[ 复制链接 ]

获取与设置外部程序窗口及控件文本--上位机VC

获取与设置外部程序窗口及控件文本--上位机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,用于输入要设置的文本,添加按钮<设置文本><刷新>实现文本的设置及窗口的刷新,先关联按钮的点击函数
  1. void CGkbc8Dlg::OnButton2()
  2. {
  3.         int nIndex=m_List.GetSelectionMark();
  4.         if(nIndex == -1) return;
  5.         CString sData = m_List.GetItemText(nIndex,0);
  6.         sData = sData.Right(sData.GetLength()-sData.ReverseFind(':')-1);//抽取出窗口句柄
  7.         HWND hWnd = (HWND)atol(sData);
  8.         CString sText;
  9.         DWORD   result;
  10.         GetDlgItemText(IDC_EDIT1,sText);
  11.         SendMessageTimeout(hWnd,
  12.                 WM_SETTEXT,//set text
  13.                 _MAX_FNAME, (LPARAM)sText.GetBuffer(_MAX_FNAME), 0, 1000, &result);
  14. }
  15. void CGkbc8Dlg::OnButton1()
  16. {
  17.         m_List.DeleteAllItems();
  18.         EnumWindows(EnumWindowsProc, (LPARAM)this);
  19. }
  20. 3.初始化列表控件,设置其为报表形式及添加表头
  21.         m_List.ModifyStyle(0,LVS_REPORT,FALSE);
  22.         m_List.InsertColumn(0, _T("父/子窗口"),LVCFMT_LEFT,100);
  23.         m_List.InsertColumn(1, _T("类名"),LVCFMT_LEFT,100,1);
  24.         m_List.InsertColumn(2, _T("窗口标题名"),LVCFMT_LEFT,200,1);
  25.         m_List.InsertColumn(3, _T("文本获取/显示"),LVCFMT_LEFT,250,1);

  26.         OnButton1();//获取全部窗口
复制代码
  1. 4.添加自定义函数,实现向列表控件直充获取的窗口标题等信息
  2. public:
  3.         static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
  4.         static BOOL CALLBACK EnumChildWindowsProc(HWND hwnd, LPARAM lParam);
  5.         void AddWindowToList(HWND hwnd);
  6.         void AddWindowInfo(int iItem, HWND hwnd);
  7.         void AddChildWindowToList(HWND hwnd);
  8. BOOL CALLBACK CGkbc8Dlg::EnumWindowsProc(HWND hwnd, LPARAM lParam)
  9. {
  10.         CGkbc8Dlg* pDlg = (CGkbc8Dlg*)lParam;
  11.         pDlg->AddWindowToList(hwnd);
  12.         return TRUE;
  13. }
  14. BOOL CALLBACK CGkbc8Dlg::EnumChildWindowsProc(HWND hwnd, LPARAM lParam)
  15. {
  16.         CGkbc8Dlg* pDlg = (CGkbc8Dlg*)lParam;
  17.         pDlg->AddChildWindowToList(hwnd);
  18.         return TRUE;
  19. }
  20. void CGkbc8Dlg::AddWindowToList(HWND hwnd)
  21. {
  22.         int iItem=-1;
  23.         if (hwnd!=GetParentFrame()->GetSafeHwnd())
  24.         {
  25.                 DWORD dwStyle = GetWindowLong(hwnd, GWL_STYLE);
  26.                 if ((dwStyle & WS_OVERLAPPEDWINDOW) && (dwStyle & WS_VISIBLE))
  27.                 {
  28.                         // add window to list
  29.                         CString s;
  30.                         s.Format("Main Window:%d",hwnd);
  31.                         iItem = m_List.InsertItem(m_List.GetItemCount(),s);
  32.                         // add window information to list control subitems
  33.                         AddWindowInfo(iItem, hwnd);
  34.                         // add window's children
  35.                         EnumChildWindows(hwnd, EnumChildWindowsProc, (LPARAM)this);
  36.                 }
  37.         }
  38. }
复制代码
  1. void CGkbc8Dlg::AddWindowInfo(int iItem, HWND hwnd)
  2. {
  3.         CWnd* pWnd = CWnd::FromHandle(hwnd);        
  4.         int iSubitem = 1;
  5.         // add class name
  6.         CString s;
  7.         ::GetClassName(hwnd, s.GetBuffer(_MAX_FNAME), _MAX_FNAME);
  8.         m_List.SetItemText(iItem,iSubitem++,s);

  9.         // add window text -- use GetWindowText
  10.         pWnd->GetWindowText(s);
  11.         m_List.SetItemText(iItem,iSubitem++,s);

  12.         // add window text -- use WM_GETTEXT
  13.         DWORD result;
  14.         SendMessageTimeout(hwnd,
  15.                 WM_GETTEXT,//get text
  16.                 _MAX_FNAME, (LPARAM)s.GetBuffer(_MAX_FNAME), 0, 1000, &result);
  17.         m_List.SetItemText(iItem,iSubitem++,s);
  18.         s.ReleaseBuffer();
  19. }
  20. void CGkbc8Dlg::AddChildWindowToList(HWND hwnd)
  21. {
  22.         int iItem=-1;
  23.         CString s;
  24.         GetClassName(hwnd, s.GetBuffer(_MAX_FNAME),_MAX_FNAME);
  25.         s.ReleaseBuffer();
  26.         if (s=="Edit") //only get content of edit control
  27.         {
  28.                 // found an edit control: add it
  29.                 s.Format("  Edit:%d",hwnd);
  30.                 iItem = m_List.InsertItem(m_List.GetItemCount(),s);
  31.                 AddWindowInfo(iItem, hwnd);
  32.         }
  33. }
复制代码

我们来演示下功能实现的整个过程

请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:获取与设置外部程序窗口及控件文本--上位机VC.rar 
文件大小:203.95 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  

回复

使用道具 举报

点击查看
快速回复 返回列表 客服中心 搜索