NI LabVIEW,CVI,数据采集等产品讨论区

取消
显示结果 
搜索替代 
您的意思是: 

如何在labview中接收用户自定义消息

我现在需要在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又怎么表示呢?

0 项奖励
1 条消息(共 12 条)
6,369 次查看

我又做实验试了试,发现:

 

当Peekmessage的参数hWnd设为用findWindow函数得来的本窗口的句柄时,不设while循环定时时间(Peekmessage是放在一个while循环中)时能不断收到鼠标移动的消息,给while循环设定定时后,就收不到任何消息了。

当我给Peekmessage的参数hWnd赋值为0时,不管while循环设多大定时均可以不断收到鼠标移动的消息;

这两种情况均没有接收到用户自定义消息。不知道为什么?

补:Peekmessage的参数wRemoveMsg设为0.

0 项奖励
2 条消息(共 12 条)
6,344 次查看

一般自定义的消息的ID是在一块系统消息以外的区域的,你能确保一下,它在函数设定的区域里面吗?

还有,你能确定一下,你的自定义消息是否丢到了系统的queue中,格式是否正确呢?

District Sales Manager | Shanghai Pudong, China
0 项奖励
3 条消息(共 12 条)
6,322 次查看

系统的消息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的执行是否跟不同的系统有关系?

0 项奖励
4 条消息(共 12 条)
6,309 次查看

LV本身也是通过调用windows自己的user32的dll来抓消息的,Peekmessage的确是可以在windows的OS下面抓到自定义的消息的。你有没有试过用MFC环境看看是否能够得到这个消息。

 

District Sales Manager | Shanghai Pudong, China
0 项奖励
5 条消息(共 12 条)
6,299 次查看
   PeekMessage的最后一个参数 wRemoveMsg:确定消息如何被处理。此参数可取下列值之一:

  PM_NOREMOVE:PeekMessage处理后,消息不从队列里除掉。

  PM_REMOVE:PeekMessage处理后,消息从队列里除掉。

     可将PM_NOYIELD随意组合到PM_NOREMOVE或PM_REMOVE。此标志使系统不释放等待调用程序空闲的线程。

请问wRemoveMsg怎么设?我给它一个数值0或1,行不?哪个表示消息不从队列里除掉?

0 项奖励
6 条消息(共 12 条)
6,296 次查看

你应该使用宏定义好的变量赋值啊,比如PM_NOREMOVE, PM_REMOVE等等。

对于从队列里面删除事件的赋值应该是:PM_REMOVE。

District Sales Manager | Shanghai Pudong, China
0 项奖励
7 条消息(共 12 条)
6,250 次查看
你可以到MSDN里去找到对应的h文件。然后再到相应的h文件里去查。
District Sales Manager | Shanghai Pudong, China
0 项奖励
8 条消息(共 12 条)
6,245 次查看

在labview中怎么使用宏定义呢?

0 项奖励
9 条消息(共 12 条)
6,233 次查看
在labview中是直接调用这个动态链接库函数的,怎么使用宏定义呢?谁在labview中用过Peekmesage函数呢?
0 项奖励
10 条消息(共 12 条)
6,232 次查看