跨进程获取其他应用程序窗体内容

以下三次测试分别用三种方式获取其他应用程序窗体上的内容.

具体是本人工作中遇到一个问题,即在wince手持终端系统上,获取其他应用程序界面上的窗体里的内容,由于我对wince不是很熟,所以先在Win7下想试试可行性,所以有了第一种方式,

 

////////////////////////////////////////////////第一种方式////////////////////////////////////////////////////////////////

//第一种方式主要使用FindWindow函数获取主窗体句柄,再用FindWindowEx函数获取子窗体句柄,再通过SendMessage函数获取子窗体的内容

//第一种方式在VS2010MFC下用基本对话框调试通过

void CGetEditDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码

HWND hwnd = 0, hEdit = 0;
char temp[256];

//wince中支持FindWindow函数,
hwnd = (HWND)::FindWindow(_T("#32770"), _T("TestEdit"));//通过对话框句柄和窗体名获取窗体句柄
if(hwnd == 0)
return;
//////////////////////////////////////////////
//FindWindowEx函数在wince中不支持,详见百度百科
hEdit = (HWND)::FindWindowEx(hwnd, 0, _T("Edit"), NULL );//通过父窗体句柄和编辑框类名获取第一个编辑框句柄
if(hEdit == 0)
return;
//wince中支持SendMessage函数,
int nValue = ::SendMessage(hEdit, WM_GETTEXT, 255, (LPARAM)temp);//通过窗体句柄和消息名获取窗体内容到temp中
if(nValue != 0)
m_get.Format(_T("%s"),temp);
memset(temp, 0, sizeof(temp));
//////////////////////////////////////////////////

hEdit = (HWND)::FindWindowEx(hwnd, hEdit, _T("Edit"), NULL );//参数hEdit为上一个窗体句柄
if(hEdit == 0)
return;
//wince中支持SendMessage函数
nValue = ::SendMessage(hEdit, WM_GETTEXT, 255, (LPARAM)temp);
if(nValue != 0)
m_get2.Format(_T("%s"),temp);
memset(temp, 0, sizeof(temp));
////////////////////////////////////////////////////

hEdit = (HWND)::FindWindowEx(hwnd, hEdit, _T("Edit"), NULL );
if(hEdit == 0)
return;
//wince中支持SendMessage函数,详见http://blog.csdn.net/so927/article/details/9426907
nValue = ::SendMessage(hEdit, WM_GETTEXT, 255, (LPARAM)temp);
if(nValue != 0)
m_get3.Format(_T("%s"),temp);
memset(temp, 0, sizeof(temp));
///////////////////////////////////////////////////////
UpdateData(0);

hEdit = (HWND)::FindWindowEx(hwnd, hEdit, _T("Edit"), NULL );
if(hEdit == 0)
return;
//wince中支持SendMessage函数,
nValue = ::SendMessage(hEdit, WM_GETTEXT, 255, (LPARAM)temp);
if(nValue != 0)
m_get4.Format(_T("%s"),temp);
memset(temp, 0, sizeof(temp));
///////////////////////////////////////////////////////

hEdit = (HWND)::FindWindowEx(hwnd, hEdit, _T("Edit"),NULL);
if(hEdit == 0)
return;
//wince中支持SendMessage函数,
nValue = ::SendMessage(hEdit, WM_GETTEXT, 255, (LPARAM)temp);
if(nValue != 0)
m_get5.Format(_T("%s"),temp);
memset(temp, 0, sizeof(temp));
///////////////////////////////////////////////////////

UpdateData(0);
}

 

//////////////////////////////////////////////////第二种方式//////////////////////////////////////////////////////////

 //由于我的目的是最终到wince系统上运行,而FindWindowEx函数不被wince系统支持,所以有了第二次测试,

 //第二种方式在第一种方式基础上,去掉FindWindowEx函数,主要使用EnumChildWindows函数,回调EnumWindowsProc函数来获取子窗体句柄,并发送消息请求窗体内容

///第二种方式也是在VS2010MFC下基于基本对话框调试成功

BOOL _stdcall CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
if (hwnd != 0)
{
char temp[256];
CString str;
int nValue = ::SendMessage(hwnd, WM_GETTEXT, 255, (LPARAM)temp);
if(nValue != 0)
str.Format(_T("%s"),temp);
strTest.push_back(str);
return TRUE;
}
return FALSE;
}

void CGetEditDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码

HWND hwnd = 0;
char temp[256];
strTest.clear();
//hwnd = GetHandleByName(_T("TestEdit.exe"));
hwnd = (HWND)::FindWindow(_T("#32770"), _T("TestEdit"));
if(hwnd == 0)
return;
EnumChildWindows(hwnd, EnumWindowsProc, NULL);

vector<CString>::iterator iter;
iter=strTest.begin();
if(iter!=strTest.end())
{
m_get = (*iter);
iter++;
}
if(iter!=strTest.end())
{
m_get2 = (*iter);
iter++;
}
if(iter!=strTest.end())
{
m_get3 = (*iter);
iter++;
}
UpdateData(0);
}

////////////////////////////////////////////第三种方式//////////////////////////////////////////////////////////

//第三种方式是为了移植到wince环境而做,使用GetForegroundWindow函数获取前端主窗体句柄,再根据GetWindow函数获取子窗体句柄

//第三种方式在wince6.0下调试通过

void CGetEditContentDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (1 == nIDEvent)
{
TCHAR szClassName[100];
HWND hForegroundWnd = ::GetForegroundWindow();
//HWND hParent = ::FindWindow(L"Edit", NULL);
HWND hChild = ::GetWindow(hForegroundWnd, GW_CHILD);
static TCHAR temp[256] = {0};
TCHAR tempW[256] = {0};
char tempA[256] = {0};
char className[256] = {0};
while (hChild)
{
if (::GetClassName(hChild, szClassName, 100))
{
wcstombs(className,szClassName,255);
PrintfLog("\n%s\n",className);
//if (0 == wcscmp(L"Edit",szClassName))
{
memset(tempW,0,sizeof(tempW));
memset(tempA,0,sizeof(tempA));
::SendMessage(hChild,WM_GETTEXT,255,(LPARAM)tempW);

if (0 != wcscmp(temp,tempW))
{
wcscpy(temp,tempW);
wcstombs(tempA,tempW,255);
PrintfLog(tempA);
}
}
}
hChild = ::GetWindow(hChild, GW_HWNDNEXT);

}
CDialog::OnTimer(nIDEvent);
}

 ////////////////////////////////////////////////////////////////////////////////////////////////

posted @ 2016-07-29 11:14  末日小风  阅读(2735)  评论(0编辑  收藏  举报