一、在用WIN 32 API函數開發應用程序時,常常要用SendMassege函數向某些對象發送消息,以讓對象實現某些功能(此時也有相應的API數組
函數來實現這個功能)。例如關閉窗口,能夠發送WM_CLOSE消息。
SendMessage(hwnd,WM_SYSCOMMAND,SC_CLOSE,0);//關閉主窗口
SendMessage(hwnd,WM_CLOSE,0,0);//關閉普通窗口
二、示例1--發送WM_COPYDATA消息(即WM_COPYDATA消息在兩個進程之間的傳遞)
在作這個例子以前,咱們先了解一下,WM_COPYDATA消息對應的結構體COPYDATASTRUCT
typedef struct tagCOPYDATASTRUCT{
DWORD dwData;//接收數據的句柄
DWORD cbData;//數據的大小
PVOID lpData;//數據指針
}COPYDATASTRUCT;函數
主程序端:
創建MFC對話框工程,添加編輯框和一個按鈕
在按鈕單擊事件函數中添加後:
void CMyDlg::OnButton1()
{
// TODO: Add your control notification handler code here
HWND hwnd=::FindWindow(NULL,"接受窗口");//找到咱們要發送消息的窗口句柄
if(hwnd==NULL)
{
AfxMessageBox("沒有找到接受窗口");
return;
}
CString msgedit; //聲明咱們要發送的消息
GetDlgItem(IDC_EDIT1)->GetWindowText(msgedit);//得到編輯框內容,賦給msgedit
COPYDATASTRUCT data={0}; //初始化COPYDATASTRUCT結構體對象
data.dwData=(DWORD)this->GetSafeHwnd(); //接收數據的句柄
data.cbData=msgedit.GetLength(); //數據的大小
data.lpData=msgedit.GetBuffer(msgedit.GetLength()); //數據指針
::SendMessage(hwnd,WM_COPYDATA,(WPARAM)this->GetSafeHwnd(),(LPARAM)&data);//發送消息
}this
接收窗口:
創建MFC對話框工程,添加編輯框
爲對話框添加一個WM_COPYDATA消息響應
編輯代碼事後以下:spa
BOOL CMyDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
//函數接口包括:窗口句柄和COPYDATASTRUCT結構體指針,分別對應WPARAM,LPARAM
{
// TODO: Add your message handler code here and/or call default
char msgdata[256];//聲明接受的消息
DWORD size= pCopyDataStruct->cbData; //數據大小
CopyMemory(msgdata,pCopyDataStruct->lpData,size);//經過數據指針,複製內容
msgdata[size]='\0'; //給數組添加結束標誌
GetDlgItem(IDC_EDIT1)->SetWindowText(msgdata);//給編輯框設置內容
return CDialog::OnCopyData(pWnd, pCopyDataStruct);//返回是否成功
}
三、示例2--發送本身註冊的消息
本示例先經過RegisterWindowMessage函數來註冊一條消息,而後用Win32 API函數SendMessage()發送。
主程序端:
創建MFC對話框,添加一個按鈕
在對話框CPP文件預處理下加入下面代碼:
static UINT NEAR WM_RGSMSG=RegisterWindowMessage("MESSAGE");//註冊一條發送MESSAGE的本身註冊的消息
在按鈕單擊事件函數中添加後:
void CMyDlg::OnButton1()
{
// TODO: Add your control notification handler code here
HWND hwnd=::FindWindow(NULL,"接受窗口");//找到咱們要發送消息的窗口句柄
if(hwnd==NULL)
{
AfxMessageBox("沒有找到接受窗口");
return;
}
else
::SendMessage(hwnd,WM_RGSMSG,1,0);//發送消息
}指針
本示例接受方,仍然是先經過RegisterWindowMessage函數來註冊一條相同的消息,而後定義消息宏,綁定處理函數
接收窗口:
創建MFC對話框工程
在對話框CPP文件預處理下加入下面代碼:
static UINT NEAR WM_RGSMSG=RegisterWindowMessage("MESSAGE");//註冊一條發送MESSAGE的本身註冊的消息
在消息宏聲明處
將消息聲明爲:
afx_msg LRESULT OnRgsmsg(WPARAM wParam,LPARAM lparam); //聲明消息映射函數
在創建消息映射表的地方添加以下代碼:
ON_REGISTERED_MESSAGE(WM_RGSMSG,OnRgsmsg)//註冊的消息宏應放在這個位置
在CPP文件中,添加函數定義,代碼以下:
LRESULT CMyDlg::OnRgsmsg(WPARAM wParam,LPARAM lParam)
{
AfxMessageBox("接收到消息");
return TRUE;
}code