当前位置: 代码迷 >> C# >> C#接受C++dll的步骤发送的消息
  详细解决方案

C#接受C++dll的步骤发送的消息

热度:550   发布时间:2016-05-05 05:34:01.0
C#接受C++dll的方法发送的消息
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)
{
 ....代码
}


我现在使用这个方法,接受dll发送的消息。这个方法是网上搜的,接收到的消息不是我想要的
请问哪里出错了,代码如何修改

//消息处理函数
 unsafe private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
 if (msg == 1024)
{
//在这里打个断点,看DLL发消息后能不能进来。
}
}
根据你上面的描述,我觉得应该是HwndSource已经做了为窗体Handle注册了消息接受函数的事件(好像有点多此一举,窗体自带了消息接收函数),所以你注册的WndProc函数实际上接收的就是窗体的消息。窗体的消息是有很多的,系统也在随时向窗体发送消息,所以你会收到很多不是你要的消息。
验证我的猜想的一点就是你按照上面那样,在if判断里面设一个断点,看能不能进去,可以说明对了(如果你DLL还没发消息,但是也能进断点说明这个消息值与系统冲突了)。
  相关解决方案