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<COPYDATASTRUCT*>(message->lParam);
qDebug()<<static_cast<char*>(p->lpData);
}
Widget::winEvent(message,result);
}
C++交流群:585225803