編寫的一個監控程序,需要監視另外一個程序的運行狀況
參考了:http://blog.csdn.net/mail_cm/article/details/7902904
之中的WM_COPYDATA方式,只是把過程詳細了一下,同時改正了裏面的一些不兼容的問題
首先創建一個對話框程序-基於對話框-項目名DataSend
添加一個Edit控件,併爲這個控件添加一個CString類型的成員變量m_strCopyData
添加一個Button控件,並編寫響應函數如下:(這個按鈕的ID設置爲:IDC_BUTTON_Send)
void CDataSendDlg::OnBnClickedButtonSend()
{
// TODO: 在此添加控件通知處理程序代碼
UpdateData(); // 更新數據
CWnd *pWnd=CWnd::FindWindow(NULL,_T("DataRecv")); // 查找DataRecv進程
if(pWnd==NULL){
MessageBox(_T("Unable to find DataRecv."));
return;
}
COPYDATASTRUCT cpd; // 給COPYDATASTRUCT結構賦值
cpd.dwData = 0;
cpd.cbData = (m_strCopyData.GetLength()+1) * sizeof(TCHAR);
cpd.lpData = (void*)m_strCopyData.GetBuffer(cpd.cbData);
pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd); // 發送
}
這裏尤其要注意cpd.cbData的字符長度的那句話,一方面要+1,另一方面要*sizeof(TCHAR)
這樣才能在unicode字符集下正常使用
然後創建另一個對話框程序-基於對話框-項目名DataRecv
一方面要在這個項目的DataRecvDlg.cpp文件中的消息映射段增加一個響應函數:
BEGIN_MESSAGE_MAP(CDataRecvDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_COPYDATA()//這個是我們增加的
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
其次要在頭文件中增加一個聲明:
BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
並將這個函數在cpp中定義:
// 手動增加的函數
BOOL CDataRecvDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
m_strRecvData = (LPTSTR)(pCopyDataStruct->lpData);
// 獲得實際長度的字符串
m_strRecvData = m_strRecvData.Left(pCopyDataStruct->cbData);
// 更新數據
UpdateData(FALSE);
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
其中m_strRecvData這個成員變量屬於向這個對話框中添加的Edit控件!這樣,二者之間就能夠實現正常通信了