MFC的SendMessage函数详解

SendMessage函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。

函数原型 :

LRESULT SendMessageHWND hWndUINT wMsgWPARAM wParamLPARAM IParam);

参数:

  hWnd其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。

    wMsg用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量.

    wParam通常是一个与消息有关的常量值,也可能是窗口或控件的句柄

    lParam通常是一个指向内存中数据的指针。由于WParmlParamPointer都是32位的,因此,它们之间可以相互转换

返回值:返回值指定消息处理的结果,依赖于所发送的消息。

SendMessage用例

1.       系统消息(WM_

::SendMessage(this->m_hWnd,WM_CLOSE,0,0);

SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);

SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);

SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);

SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);

SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);

SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);

SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);

SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);

SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);

SendMessage(hWnd,WM_KEYDOWN,VK_RETURN,0x001c0001);

SendMessage(hWnd,WM_CHAR,VK_RETURN,0x001c0001);

SendMessage HWND, WM_SHOWWINDOW, SW_HIDE, vbNull '隐藏窗体

SendMessage HWND, WM_SHOWWINDOW, SW_NORMAL, vbNull '显示窗体

SendMessage(HWND, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&)   '关闭

SendMessage(HWND, WM_SYSCOMMAND, SC_MINIMIZE, ByVal 0&) '最小化

SendMessage(HWND, WM_PASTE, 0, 0) '粘贴

SendMessage(HWND, WM_COPY, 0, 0) '复制

SendMessage(HWND, WM_UNDO, 0, 0) '撤消

2.       通告消息

比如:给资源IDIDC_BUTTON2的按钮,发送点击消息:

SendMessage(WM_COMMAND,

MAKELONG(IDC_BUTTON2,BN_CLICKED),

(LPARAM)(GetDlgItem(IDC_BUTTON2)-> GetSafeHwnd()));

或:

         ::SendMessage(m_hWnd,

WM_COMMAND,

MAKELONG(IDC_BUTTON2,BN_CLICKED),

(LPARAM)(GetDlgItem(IDC_BUTTON2)-> GetSafeHwnd()));

例:给菜单ID为ID_GET的菜单项,发送消息

::SendMessage(AfxGetMainWnd()->m_hWnd,WM_COMMAND,ID_GET,NULL);

 

3.       用户自定义消息

 SendMessge(WM_MYMSG,0,0);

或:

::SendMessge(::AfxGetMainWnd()->m_hWnd,WM_MYMSG,0,0);

4.       向其他应用程序发送消息

也可以为其他应用程序发送消息,前提是找到窗体的句柄,如:与FindWindow()函数一起使用;

如:

CString str="360w.txt -记事本";//向窗口为str的记事本窗口发送WM_CLOSE消息

         CWnd *pWnd=CWnd::FindWindow(NULL,str);//获取目的窗口对象

         ::SendMessage(*pWnd,WM_CLOSE,0,0);

窗口标题的获取方法:

1.       使用VC++自带工具SPY++

2.       编程实现,可用EnumWindows函数实现;详见“枚举所有窗体,并向打开的窗体发送关闭消息”http://download.csdn.net/detail/nuptboyzhb/4162747

 

举例:

HWND gameh=NULL;
 gameh=::FindWindow(NULL,"窗口标题");//参看游戏的标题.可以用vc6.0自带的Spy++工具查看

 CWnd* pWnd = CWnd::FromHandle(gameh);

//在坐标为(x,y)的点,发送鼠标按下消息//注意,x,y是客户区的坐标

 ::SendMessage(*pWnd,WM_LBUTTONDOWN,0,(y<<16)+x);

//发送鼠标移动消息,鼠标移动到点(x,y)

::SendMessage(*pWnd,WM_MOUSEMOVE,0,MAKELONG(x,y));

//发送粘贴消息

::SendMessage(dlg_hwnd,WM_PASTE,0,0);

5. 发送自己注册的消息
5.1 发送端:

本示例先通过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);//发送消息
}


5.2 接收端:

本示例接受方,仍然是先通过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;
}

  • 7
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:SendMessage用于调用指定窗口的内部程序,直到窗口程序处理完成以后再返回; PostMessage是将一个消息寄送到一个窗口内的消息队列后就立即返回。\[1\]两个函数的返回值不同: LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);\[1\]引用\[2\]:本示例先通过RegisterWindowMessage函数来注册一条消息,然后用Win32 API函数SendMessage()发送。\[2\]主程序端: 建立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);//发送消息 }\[2\]引用\[3\]:SendMessage函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。\[3\] 问题: MFC SendMessage函数和PostMessage函数有什么区别? 回答: MFC中的SendMessage函数和PostMessage函数都用于向指定窗口发送消息,但它们有几个区别。首先,SendMessage函数会调用指定窗口的内部程序,并在窗口程序处理完消息后才返回,而PostMessage函数则是将消息寄送到窗口的消息队列后立即返回。\[1\]其次,两个函数的返回值不同,SendMessage函数的返回值是LRESULT类型,而PostMessage函数的返回值是BOOL类型。\[1\]最后,使用SendMessage函数发送消息时,需要确保目标窗口存在并且可用,否则会返回错误信息。而使用PostMessage函数发送消息时,即使目标窗口不存在或不可用,也不会返回错误信息。\[3\] #### 引用[.reference_title] - *1* [【MFCSendMessage与PostMessage](https://blog.csdn.net/qq_45662588/article/details/121417438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [MFCSendMessage函数详解](https://blog.csdn.net/NUPTboyZHB/article/details/7370463)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值