要想獲得另一個進程窗口的文本,只需直接發送WM_GETTEXT。
CWnd* pWnd = GetOtherAppWindow();
TCHAR buf[512];
pWnd->SendMessage(WM_GETTEXT,
sizeof(buf)/sizeof(TCHAR),
(LPARAM)(void*)buf);
如果您在用C編程,自然用HWND代替CWnd。有人肯定會問:嘿,等一下——如果這樣做可以的話,為什麼GetWindowText不起作用呢?WM_GETTEXT不就是GetWindowText發送的嗎?錯也,GetWindowText只在窗口屬於當前進程時才發送WM_GETTEXT,否則它干別的事情。這一點文檔中說得很清楚:
圖一GetWindowText 與 WM_GETTEXT的比較
GWTTest程序本身沒有什麼用處,它只是用來示范GetWindowText 和 WM_GETTEXT之間的差別。從程序的運行結果可以看出,兩種操作都能返回頂層窗口的標題,但只有WM_GETTEXT才能對其它進程中的編輯框控制起作用。GWTTest是一個簡單的CListView應用程序;獲取文本的函數是CMyView::AddWindowInfo,代碼如下:
//AddWindowInfo.cpp源代碼
//////////////////
// 添加窗口信息, 頂層或者編輯框控制
void CMyView::AddWindowInfo(int iItem, HWND hwnd)
{
CListCtrl& lc = GetListCtrl();
CWnd* pWnd = CWnd::FromHandle(hwnd);
int iSubitem = 1;
// 添加類名
CString s;
::GetClassName(hwnd, s.GetBuffer(STRINGLEN), STRINGLEN);
lc.SetItemText(iItem,iSubitem++,s);
// 用GetWindowText添加窗口文本
pWnd->GetWindowText(s);
lc.SetItemText(iItem,iSubitem++,s);
// 用WM_GETTEXT添加窗口文本
DWORD result;
SendMessageTimeout(hwnd,
WM_GETTEXT,
STRINGLEN,
(LPARAM)s.GetBuffer(STRINGLEN),
0,
1000,
&result);
lc.SetItemText(iItem,iSubitem++,s);
s.ReleaseBuffer();
}