Win32 API SendMessage、PostMessage使用
发布日期:2021-11-15 14:57:58 浏览次数:37 分类:技术文章

本文共 2125 字,大约阅读时间需要 7 分钟。

Win32 API消息函数:SendMessage

函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程 序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。
      函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
      参数:
      hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自 身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
      Msg:指定被发送的消息。
      wParam:指定附加的消息指定信息。
      IParam:指定附加的消息指定信息。
      返回值:返回值指定消息处理的结果,依赖于所发送的消息。
      备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消 息

 

 

Win32 API消息函数:PostMessage

      函数功能:该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回。消息队列里的消息通过调用 GetMessage和PeekMessage取得。
      函数原型:B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
      参数
      hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:
      HWND.BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口。消息不被寄送到子窗 口。
      NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样。
      Msg:指定被寄送的消息。
      wParam:指定附加的消息特定的信息。
      IParam:指定附加的消息特定的信息。
      返回值:如果函数调用成功,返回非零值:如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。
      备注:需要以 HWND_BROADCAST方式通信的应用程序应当用函数 RegisterwindwosMessage来获得应用程序间通信的独特的消息。

 

//MFC发送void CtestMFCDlg::OnBnClickedButton1(){ 	UINT uMsg = ::RegisterWindowMessage((LPCWSTR)"Hello");    ::PostMessage(HWND_BROADCAST,uMsg,NULL,NULL);	AfxMessageBox(_T("发送成功!"));	}//QT接收bool MainWindow::winEvent(MSG *message, long *result){//    UINT uMsg = ::RegisterWindowMessage((LPCWSTR)"Hello");    if(message->message == uMsg)        {            qDebug()<<"JIESHOU-->1";          QMessageBox::critical(qApp->activeWindow(), QString::fromLocal8Bit("cctv信号接受!"), "");        }        return QWidget::winEvent(message,result);}

在进程间发送消息需要使用 COPYDATASTRUCT结构体

发送核心代码

std::string str("Message from dbzhang800-send");

    COPYDATASTRUCT cpd;
    cpd.dwData = 0;
    cpd.cbData = str.length()+1;
    cpd.lpData = (char*)str.c_str();
    ::SendMessageW(HWND_BROADCAST, WM_COPYDATA, NULL, (LPARAM)&cpd);

 

接受核心代码

bool MainWindow::winEvent(MSG *message, long *result){       if(message->message == WM_COPYDATA)          {                 COPYDATASTRUCT * p = reinterpret_cast
(message->lParam); qDebug()<
(p->lpData); } Widget::winEvent(message,result);}

 

C++交流群:585225803

转载地址:https://blog.csdn.net/qq_39742146/article/details/84956010 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:创建进程
下一篇:1970年1月1日到某一时间的秒数换算

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月18日 02时13分52秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章