背景:在解决方案中,c++实现了一个通信DLL,通信某些的状态需要转发给上层的winform窗口,在界面通过图标显示状态.
解决方案:通过发送自定义windows消息,重写winform窗口处理消息的函数。
解决流程:
1.在DLL的头文件中自定义windows消息
#define IGNITIONON_MSG WM_USER + 1
#define IGNITIONOFF_MSG WM_USER + 2
#define VCICONNECT_MSG WM_USER+3
#define VCIDISCONNECT_MSG WM_USER+4
2.在winform代码文件中定义消息
public const int USER = 0x0400;//用户自定义消息的开始数值
public const int IGNITIONON_MSG = USER+1;
public const int IGNITIONOFF_MSG = USER + 2;
public const int VCICONNECT_MSG = USER + 3;
public const int VCIDISCONNECT_MSG = USER + 4;
3.向dll中传递winform句柄
BlueTooth blue = BlueTooth.GetInstance(strVciName,this.Handle);
static BlueTooth^ GetInstance(String^ strVciName,IntPtr Hwnd)
{
bool status=false;
if (nullptr == Blue)
{
Blue = gcnew BlueTooth();
status=Blue->InitEngin(strVciName);
}
else
{
status = Blue->InitEngin(strVciName);
}
if (status)
{
Blue->m_Impl->SetWindow(Hwnd.ToInt32());
return Blue;
}
else
{
return nullptr;
}
}
4.发送消息
PostMessage((HWND)pBlueTooth->m_Wnd, VCICONNECT_MSG, 0, 0);
5.重写winform窗口消息处理函数
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case IGNITIONON_MSG:
{
}
break;
case IGNITIONOFF_MSG:
{
}
break;
case VCICONNECT_MSG:
{
}
break;
case VCIDISCONNECT_MSG:
{
}
break;
default:
base.DefWndProc(ref m);
break;
}
}