我现在需要在lv中接收CAN板卡发给windows的用户自定义消息。我在lv中使用了User32.dll的PeekMessage()函数,该函数可以接收到windows的系统消息(如键盘鼠标消息),但就是接收不到我所需要的用户自定义消息。不知道为什么?
BOOL PeekMessage(LPMSG IpMsg,HWND hWnd,UINT wMSGfilterMin,UINT wMsgFilterMax,UINT wRemoveMsg);
参数:
lpMsg:接收消息信息的MSG结构指针。
hWnd:其消息被检查的窗口的句柄。
wMsgFilterMin:指定被检查的消息范围里的第一个消息。
wMsgFilterMax:指定被检查的消息范围里的最后一个消息。
wRemoveMsg:确定消息如何被处理。此参数可取下列值之一:
PM_NOREMOVE:PeekMessage处理后,消息不从队列里除掉。
PM_REMOVE:PeekMessage处理后,消息从队列里除掉。
可将PM_NOYIELD随意组合到PM_NOREMOVE或PM_REMOVE。此标志使系统不释放等待调用程序空闲的线程。
Peekmessage()中的最后一个参数“wRemoveMsg”是一个UINT型的数值,不知道“PM_NOREMOVE、PM_REMOVE”是否分别可用数值0和1表示.PM_NOYIELD又怎么表示呢?
我又做实验试了试,发现:
当Peekmessage的参数hWnd设为用findWindow函数得来的本窗口的句柄时,不设while循环定时时间(Peekmessage是放在一个while循环中)时能不断收到鼠标移动的消息,给while循环设定定时后,就收不到任何消息了。
当我给Peekmessage的参数hWnd赋值为0时,不管while循环设多大定时均可以不断收到鼠标移动的消息;
这两种情况均没有接收到用户自定义消息。不知道为什么?
补:Peekmessage的参数wRemoveMsg设为0.
一般自定义的消息的ID是在一块系统消息以外的区域的,你能确保一下,它在函数设定的区域里面吗?
还有,你能确定一下,你的自定义消息是否丢到了系统的queue中,格式是否正确呢?
系统的消息Id是0~0x3ff。自定义Id应该在0X400~0x700之间,我分别试过了自定义Id为十进制数值1500、1400、1350还有十六进制0X600,都不行。你问的第一个问题应该没问题。
你问的这个问题“你的自定义消息是否丢到了系统的queue中,格式是否正确呢?”解释如下:
我是通过CAN板卡的打开函数把我自己设的自定义消息ID还有我的lv的句柄传给了CAN板卡的驱动。然后当CAN板卡端口上有数据时,CAN板卡会传递一个消息到windows,然后我再在我的lv中把这个消息接收上来,判断lv接收到的消息ID是否是我设定的值,如果是则执行CAN板卡的读函数、读取数据。
所以自定义消息是否丢到了系统的queue中,是由CAN板卡驱动来做的。
Peekmessage的执行是否跟不同的系统有关系?
LV本身也是通过调用windows自己的user32的dll来抓消息的,Peekmessage的确是可以在windows的OS下面抓到自定义的消息的。你有没有试过用MFC环境看看是否能够得到这个消息。
PM_NOREMOVE:PeekMessage处理后,消息不从队列里除掉。
PM_REMOVE:PeekMessage处理后,消息从队列里除掉。
可将PM_NOYIELD随意组合到PM_NOREMOVE或PM_REMOVE。此标志使系统不释放等待调用程序空闲的线程。
请问wRemoveMsg怎么设?我给它一个数值0或1,行不?哪个表示消息不从队列里除掉?