发送Windows消息实例

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);
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值