QT PostMessage给mfc程序无法接收
首先是怎么发送
//包含头文件 #include <windows.h> //我的自定义数据结构 typedef struct { wchar_ttcText[256];//the text to display("" is clear) unsigned long dwBarNo;//the bar no to display unsigned long dwDelay;//the text display time(0 is for ever) unsigned long dwFlag;//0 is show, 1 is close unsigned long dwColor;//the OSD color refer value unsigned long dwFontSize;//the OSD font size wchar_t cFont[256];//the OSD font name } OSDDATA; //发送消息的代码 OSDDATA osddata; HWND hwd = ::FindWindow(NULL,L"My OSD APP"); if(IsWindow(hwd)) { qDebug("find window suc\n"); lstrcpy(osddata.tcText, L"Profile 1"); osddata.dwBarNo = 0; osddata.dwFlag = 0; osddata.dwDelay =3 * 500;//OSD delay time unit is millisecond. lstrcpy(osddata.cFont, L"Arial"); osddata.dwFontSize = 60; osddata.dwColor = RGB(255,0,0); COPYDATASTRUCT copystru; ZeroMemory(©stru, sizeof(copystru)); copystru.cbData = sizeof(osddata); copystru.lpData = &osddata; BOOL bRet = ::PostMessage(hwd, WM_COPYDATA, NULL, reinterpret_cast<LPARAM>(©stru)); if(bRet) { qDebug("send fail\n"); } }
测试发现接收端(就是My OSD APP那个窗口)没有收到任何消息,
我先是显示怀疑接收端是不是有问题,于是在mfc环境写了个测试代码发送同样的消息,结果能接收到。
于是加入了qDebug信息,发现能找到窗口句柄,而且PostMessage返回值也是0,表示发送成功了。
然后我开始百度了,发现别人举的例子都没什么不同,
让我一度怀疑是不是数据格式出错或者溢出了,于是我把数据都改成NULL,结果还是没反应。
最后我灵机一动,网上大家的文章名字虽然都是SendMessage/PostMessage,但是举例代码都是用的SendMessage,
于是我改成SendMessage试了一下,结果成功了。。
浪费了好几个小时,记录下来,以后再分析原因,也免得以后再吃这个亏。