C#接受C++dll的方法发送的消息

njit_77 2014-12-16 11:34:55
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,而是其他数值,一直在变化。

请大神解惑。
...全文
259 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_23124459 2015-12-04
  • 打赏
  • 举报
回复
我最近也在做这方面的东西,请教大神帮忙!
njit_77 2014-12-17
  • 打赏
  • 举报
回复
引用 8 楼 Yokeqi 的回复:
[quote=引用 6 楼 njit_77 的回复:] ... //消息处理函数 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还没发消息,但是也能进断点说明这个消息值与系统冲突了)。[/quote] 问题已经决解了,有2处错误。初始化赋值的时候我加了ref。把ref去掉消息就能传过来。 刚开始接触C#,上网找资料时发现ref、out。以为句柄前面可以加个ref表示这个句柄需要提前赋值的。 谢谢你的热心回答了,接分吧
枫0子K 2014-12-17
  • 打赏
  • 举报
回复
引用 6 楼 njit_77 的回复:
... //消息处理函数 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还没发消息,但是也能进断点说明这个消息值与系统冲突了)。
枫0子K 2014-12-16
  • 打赏
  • 举报
回复
你有向C++的DLL注册Handle吗?上面代码里没有吧? WinForm窗体自带了WndProc函数用来处理消息。窗体句柄可以用this.Handle来获得。你的SendMessage直接向窗体句柄发消息应该能被捕获到。 最后,因为WinForm窗体自带了WndProc函数,你这里又来一个WndProc函数,大概会被认为了重写,所以窗体消息会发到你这来。 简单的做法: 向DLL注册句柄。 重载WndProc函数。在里面判断。
njit_77 2014-12-16
  • 打赏
  • 举报
回复
引用 4 楼 zanfeng 的回复:

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 1024)
            {

            }
            base.WndProc(ref m);
        }
这样
这样不行,提示我WndProc出错
njit_77 2014-12-16
  • 打赏
  • 举报
回复
引用 5 楼 Yokeqi 的回复:
[quote=引用 3 楼 njit_77 的回复:] [quote=引用 1 楼 Yokeqi 的回复:] 你有向C++的DLL注册Handle吗?上面代码里没有吧? WinForm窗体自带了WndProc函数用来处理消息。窗体句柄可以用this.Handle来获得。你的SendMessage直接向窗体句柄发消息应该能被捕获到。 最后,因为WinForm窗体自带了WndProc函数,你这里又来一个WndProc函数,大概会被认为了重写,所以窗体消息会发到你这来。 简单的做法: 向DLL注册句柄。 重载WndProc函数。在里面判断。
大神:怎么向dll注册句柄啊?能说详细一点吗? 新手,网上找了好长时间,也没找到。[/quote] 大神谈不上~只是之前对C++有接触过。你这么问我就有疑问了,你之前C#调用这个DLL是怎么调~拦截固定消息?太变态了吧? 你是直接调用DLL的SendMessage方法吗?如果不是,那在调用例如start之类的方法的时候就把Handle传进入保存不就可以了? 或者窗体启动时就向一个文件写入句柄,DLL要发送消息的时候就去读取这个文件。[/quote] 我这样调用dll里面的函数 [DllImport("Test_Dll.dll", EntryPoint = "函数名")] public static extern bool 函数名(参数); //声明拦截挂钩函数 private void win_SourceInitialized(object sender, EventArgs e) { //使用Handle可以创建一个HwndSource对象,HwndSource对象为 //我们提供了接口能够注册窗口消息的处理程序 //HwndSource.FromHwnd(handle).AddHook(new HwndSourceHook(WndProc)); 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) { ....代码 } 我现在使用这个方法,接受dll发送的消息。这个方法是网上搜的,接收到的消息不是我想要的 请问哪里出错了,代码如何修改
枫0子K 2014-12-16
  • 打赏
  • 举报
回复
引用 3 楼 njit_77 的回复:
[quote=引用 1 楼 Yokeqi 的回复:] 你有向C++的DLL注册Handle吗?上面代码里没有吧? WinForm窗体自带了WndProc函数用来处理消息。窗体句柄可以用this.Handle来获得。你的SendMessage直接向窗体句柄发消息应该能被捕获到。 最后,因为WinForm窗体自带了WndProc函数,你这里又来一个WndProc函数,大概会被认为了重写,所以窗体消息会发到你这来。 简单的做法: 向DLL注册句柄。 重载WndProc函数。在里面判断。
大神:怎么向dll注册句柄啊?能说详细一点吗? 新手,网上找了好长时间,也没找到。[/quote] 大神谈不上~只是之前对C++有接触过。你这么问我就有疑问了,你之前C#调用这个DLL是怎么调~拦截固定消息?太变态了吧? 你是直接调用DLL的SendMessage方法吗?如果不是,那在调用例如start之类的方法的时候就把Handle传进入保存不就可以了? 或者窗体启动时就向一个文件写入句柄,DLL要发送消息的时候就去读取这个文件。
足球中国 2014-12-16
  • 打赏
  • 举报
回复

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 1024)
            {

            }
            base.WndProc(ref m);
        }
这样
njit_77 2014-12-16
  • 打赏
  • 举报
回复
引用 1 楼 Yokeqi 的回复:
你有向C++的DLL注册Handle吗?上面代码里没有吧? WinForm窗体自带了WndProc函数用来处理消息。窗体句柄可以用this.Handle来获得。你的SendMessage直接向窗体句柄发消息应该能被捕获到。 最后,因为WinForm窗体自带了WndProc函数,你这里又来一个WndProc函数,大概会被认为了重写,所以窗体消息会发到你这来。 简单的做法: 向DLL注册句柄。 重载WndProc函数。在里面判断。
大神:怎么向dll注册句柄啊?能说详细一点吗? 新手,网上找了好长时间,也没找到。
njit_77 2014-12-16
  • 打赏
  • 举报
回复
怎么向dll注册句柄啊?能说详细一点吗? 新手,网上找了好长时间,也没找到。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧