C++代码
SendMessage(picture_Handle, 1024 + 1, 0, 0);//picture_Handle是窗口的句柄。
C#代码
public MainWindow()
{
this.SourceInitialized += new EventHandler(win_SourceInitialized);
InitializeComponent();
}
//声明拦截挂钩函数
private void win_SourceInitialized(object sender, EventArgs e)
{
HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
if (hwndSource != null)
{
hwndSource.AddHook(new HwndSourceHook(this.WndProc));
}
}
//消息处理函数
unsafe private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
int i = 0;
if (1024 + 0 == msg)
{
i = 0;
Camera.GetCameraData(out pcamdata1, out sFrInfo[i], out CamPixFormat[i], i);
Camera.ShowCameraData(1280, 1024, ref pcamdata1, sFrInfo[i], this.PictureBox1.Handle, i);
//mDrawImage(camdata[i], CamPixFormat[i], i);
//this->PaintBox1->Canvas->Draw(0, 0, m_bmp[i]);
}
.....
其它代码
}
当我使用bcb时,可以接收到dll方法发送的消息。用C#代码不行,调试的时候发现msg的信息不是1024,而是其他数值,一直在变化。
请大神解惑。
------解决思路----------------------
//消息处理函数
unsafe private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == 1024)
{
//在这里打个断点,看DLL发消息后能不能进来。
}
}
根据你上面的描述,我觉得应该是HwndSource已经做了为窗体Handle注册了消息接受函数的事件(好像有点多此一举,窗体自带了消息接收函数),所以你注册的WndProc函数实际上接收的就是窗体的消息。窗体的消息是有很多的,系统也在随时向窗体发送消息,所以你会收到很多不是你要的消息。
验证我的猜想的一点就是你按照上面那样,在if判断里面设一个断点,看能不能进去,可以说明对了(如果你DLL还没发消息,但是也能进断点说明这个消息值与系统冲突了)。