工控编程吧
标题:
获取与设置外部程序窗口及控件文本--上位机VC
[打印本页]
作者:
qq263946146
时间:
2016-12-13 17:34
标题:
获取与设置外部程序窗口及控件文本--上位机VC
(, 下载次数: 5)
上传
点击文件名下载附件
获取与设置外部程序窗口及控件文本--上位机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);
}
}
复制代码
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/cf8d218c888d8ef12089a64cb7e531ae/0/0/w_19rukjizml.swf-albumId=6966444209-tvId=6966444209-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件
[weixinlianxi]1[/weixinlianxi]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4