1、利用API函数SendMessage能以同步的方式向目标窗体发送一条消息,然后等待目标窗体处理过程处理此消息。
2、利用API函数PostMessage能以异步方式向目标窗体投递一条消息,消息投递出去后,函数立即返回。
3、PostMessage和SendMessage返回值是BOOL类型,代表消息是否发送成功。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
1、新建基于对话框的MFC工程SendMsg ;
2、在主对话框上添加一个Picture控件,ID为IDC_CAP,type属性改为Icon , Image属性设置为IDR_MAINFRAME;
3、在主对话框上添加三个文本框,ID为IDC_EDT_HWND、IDC_EDT_CLASS、 IDC_EDT_TEXT
4、添加两个按钮,ID为IDC_BTN_SETTEXT、IDC_BTN_CLOSE;
//
HCURSOR m_hCursor;///鼠标拖动时的光标
BOOL m_bCapturing;///是否处于捕获中
RECT m_rtCtrl;///拖动控件的位置和大小
HWND m_hwndDest;///目标窗体的句柄
///OnInitDialog中
//加载拖动光标
m_hCursor = LoadCursor(NULL ,IDC_SIZEALL);
///获取拖动控件的位置和大小
GetDlgItem(IDC_CAP)->GetWindowRect(&m_rtCtrl);
void CSendMsgDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
///判断鼠标是否在IDC_CAP上,如果是,则设置捕获鼠标
if(point.x >= m_rtCtrl.left && point.x <= m_rtCtrl.right
|| point.y >= m_rtCtrl.top && point.y <= m_rtCtrl.bottom )
{
m_bCapturing = true;
SetCapture();
SetCursor(m_hCursor);
}
CDialog::OnLButtonDown(nFlags, point);
}
void CSendMsgDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
///鼠标左键松开,如果处于捕获状态则做相应的处理
if(m_bCapturing)
{
///恢复状态
ReleaseCapture();
m_bCapturing = false;
///取得当前鼠标位置的窗体句柄
POINT pt = point;
ClientToScreen(&pt);
//WindowFromPoint function retrieves a handle to the window that contains the specified point
m_hwndDest = ::WindowFromPoint(pt);
///显示句柄
TCHAR szBuf[MAX_PATH] = {0};
_stprintf(szBuf, _T("0x%.8X") , m_hwndDest);
SetDlgItemText(IDC_EDT_HWND , szBuf);
//取得并显示类名
GetClassName(m_hwndDest ,szBuf ,MAX_PATH);
SetDlgItemText(IDC_EDT_CLASS,szBuf);
///取得并显示文本
::SendMessage(m_hwndDest ,WM_GETTEXT ,MAX_PATH ,(LPARAM)szBuf);
SetDlgItemText(IDC_EDT_TEXT,szBuf);
}
CDialog::OnLButtonUp(nFlags, point);
}
void CSendMsgDlg::OnBtnSettext()
{
// TODO: Add your control notification handler code here
//设置目标窗体的文本
CString str;
GetDlgItemText(IDC_EDT_TEXT,str);
::SendMessage(m_hwndDest , WM_SETTEXT , 0 , (LPARAM)(LPCTSTR)str);
}
void CSendMsgDlg::OnBtnClose()
{
// TODO: Add your control notification handler code here
///关闭目标窗口
::SendMessage(m_hwndDest , WM_CLOSE ,0 , 0);
}
