我怎么能创建自定义窗口消息?

Geo*_*Geo 5 c++ debugging windows-ce

我们的项目在Windows CE 6.0上运行,用C++编写.我们的代码有一些问题,我们无法调试.我们还发现,如果在我们的应用程序中我们创建线程并尝试从它们printf,输出将不会出现.将出现的唯一输出是主线程中的输出.我想做以下事情:

  • 创建自定义Windows消息

  • 使用它作为WPARAM我要在屏幕上显示的char*的地址

  • 使用它作为LPARAM我要在屏幕上显示的char*的长度

  • 发送消息

  • 当它到来时处理它,以便它打印char*

我怎么能创建自定义窗口消息?WPARAM和LPARAM有哪些类型?有可能做我刚刚写的东西吗?

谢谢

Dav*_*idK 5

你可以做你所描述的事情.您无需在应用程序中为通信创建自定义消息实际执行任何操作:只需确保发送消息的代码和接收消息的代码就消息编号的实际内容达成一致,并使用消息与Windows使用的任何数字都不重叠的数字.有一个RegisterWindowMessage()函数,但只需要获取整个操作系统中唯一的消息号,因此用于进程间通信.

实现这一目标的最简单方法是在一个包含自定义消息编号的头文件中,从WM_USER开始并向​​上编号,如下所示:

#define WM_FIRST_CUSTOM_MSG (WM_USER+0)
#define WM_SECOND_CUSTOM_MSG (WM_USER+1)
Run Code Online (Sandbox Code Playgroud)

当您包含"windows.h"时,会定义WPARAM和LPARAM类型,因此可以在不同的系统上使用不同的类型.对于32位操作系统,它们通常都是32位整数.如果你只是将消息用于测试目的,那通常就足够了,你可以在那里坚持你想要的任何东西.但是,对于生产代码,您应该更加小心:WPARAM实际上是"类似整数"的数据,LPARAM是"指针式"数据.例如,在Win64中,LPARAM足以容纳64位指针,但WPARAM只保存32位整数.为了传递更多数据而不仅仅是一个整数和一个指针,我会使用lParam将指针传递给包含我所有参数的某种结构.

说了这么多,这听起来像是获取调试输出的复杂方法.您是否尝试过使用OutputDebugString()API调用?或调试线程的printf()调用?

  • 特定于应用程序的消息应基于WM_APP,而不是WM_USER.请参阅http://blogs.msdn.com/oldnewthing/archive/2003/12/02/55914.aspx (6认同)
  • 事实上,应用程序私有消息**必须**在`WM_APP+x`范围内。“WM_USER+x”消息是由窗口类的作者定义的,或者更正式地说,是由称为“RegisterClassEx”的人定义的。重新使用这个范围将会被打破。有关详细信息,请参阅[关于消息和消息队列:应用程序定义的消息](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644927.aspx#app_define)。 (2认同)