跨進程獲取其他應用程序窗體內容


以下三次測試分別用三種方式獲取其他應用程序窗體上的內容.

具體是本人工作中遇到一個問題,即在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);
}

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM