//一個程序獲取另一個程序Edit控件的內容
//根據指定程序的標題名獲取改程序窗口的句柄
HWND hWnd=::FindWindow(NULL,"zhang001");
if(hWnd)
{
MessageBox("get windows");
//根據窗口句柄獲取EDIT控件的ID,但是這個ID是通過VS工具spy++獲取的
HWND h = ::GetDlgItem(hWnd,0x3E9);
if (h!=NULL)
{
CString str0;
//要知道SendMessage用法,特別是第三個參數
//根據EDIT控件的ID獲取控件內容,存放到str0中
::SendMessage(h,WM_GETTEXT,20,(LPARAM)(LPCTSTR)str0);
//將獲得的內容放到本程序指定的EDIT控件中進行顯示
GetDlgItem(IDC_EDIT1)->SetWindowText(str0);
MessageBox(str0);
}
}
else
{
MessageBox("fail!");
}
運行結果如下:
采用以上程序由於采用CString,獲取的內容大小不定,當制定的緩存和制定的大小不一樣時就會產生一下的錯誤
整個程序改為一下代碼,就好了:
//一個程序獲取另一個程序Edit控件的內容 //根據指定程序的標題名獲取改程序窗口的句柄 CString str; GetDlgItemText(IDC_TITLE,str); HWND hWnd=::FindWindow(NULL,str);//"zhang001" if(hWnd) { MessageBox("get windows"); //根據窗口句柄獲取EDIT控件的ID,但是這個ID是通過VS工具spy++獲取的 HWND h = ::GetDlgItem(hWnd,0x3E9); if (h!=NULL) { //CString str0; char temp[50]; //要知道SendMessage用法,特別是第三個參數 //根據EDIT控件的ID獲取控件內容,存放到str0中 ::SendMessage(h,WM_GETTEXT,sizeof(temp)/sizeof(char),(LPARAM)temp);//第三個和第四個參數是緩存大小和緩存指針 //將獲得的內容放到本程序指定的EDIT控件中進行顯示 GetDlgItem(IDC_EDIT1)->SetWindowText(temp); //MessageBox(str0); } } else { MessageBox("fail!"); }
注:要想獲取某控件的位置 可以使用下面的方法
GetDlgItem(控件ID)->GetWindowRect(&rect);//獲取控件基於全頻的位置 ScreenToClient(rect);//轉換為對話框上的相對位置
如何獲取控件的ID
MFC:: CWnd *pWnd = GetFocus(); if(pWnd == NULL) ;//no focus else UINT nID = pWnd->GetDlgCtrlID(); SDK: HWND hWnd = ::GetFocus(); if(hWnd == NULL) ;//no focus else UINT nID = ::GetDlgCtrlID(hWnd); GetFocus: The return value is the handle to the window with the keyboard focus.
If the calling thread's message queue does not have an associated window with the keyboard focus, the return value is NULL.
