You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中WndProc未捕获预期WM_COPYDATA消息问题求助

排查WM_COPYDATA接收失败的问题

看起来你已经搞定了发送端,但接收端卡在了消息识别这一步——明明WndProc能收到消息,却始终触发不了WM_COPYDATA的判断,这确实让人头疼。结合你提供的代码和32位程序的前提,我给你梳理几个最可能的原因和排查步骤:

首先,先确认接收的消息到底是不是WM_COPYDATA

你现在用MessageBox.Show(m.Msg.ToString())看到的是十进制数值,建议改成十六进制打印,直接对比WM_COPYDATA的标准值0x004A:

protected override void WndProc(ref Message m)
{
    // 先打印消息的十六进制值,这是关键排查步骤
    Debug.WriteLine($"收到消息: 0x{m.Msg:X4} (十进制: {m.Msg})");
    
    if (m.Msg == WM_COPYDATA)
    {
        // ... 你的原有处理逻辑
    }
    else
    {
        MessageBox.Show($"非WM_COPYDATA消息: 0x{m.Msg:X4}");
        base.WndProc(ref m);
    }
}

如果打印出来的十六进制值不是0x004A,那问题出在发送端:

  • 检查发送端的WM_COPYDATA常量定义是否正确(必须是const int WM_COPYDATA = 0x004A;,别写成uint或者其他值)
  • 确认调用GetPosition时,SendMessage的Msg参数确实传的是WM_COPYDATA,有没有不小心传成其他常量(比如EXTERNAL_CD_GET_POSITION_PCS)

如果打印出来的就是0x004A,但if(m.Msg == WM_COPYDATA)不成立,那问题出在接收端的常量定义:

  • 检查接收端的WM_COPYDATA是不是被定义成了其他类型(比如uint),导致和m.Msg(int类型)的比较出现隐式转换问题。改成const int类型就好。

其次,确认窗口句柄是否一致

你说RunAsync运行正常,说明发送端找的窗口是对的,但GetPosition会不会用了错误的窗口句柄?比如:

  • 调用GetPosition时,传入的hwnd是不是和RunAsync用的同一个?在发送端打印两个方法的hwnd值对比:
public static IntPtr RunAsync(IntPtr hwnd, string str)
{
    Debug.WriteLine($"RunAsync 发送到窗口句柄: {hwnd}");
    // ... 原有逻辑
}

public static IntPtr GetPosition(IntPtr hwnd, bool pcs, ExternalGetPositionType position)
{
    Debug.WriteLine($"GetPosition 发送到窗口句柄: {hwnd}");
    // ... 原有逻辑
}

如果两个句柄不一样,那GetPosition的消息发给了别的窗口,当前窗口自然收不到正确的消息。

其他可能性排查

  1. 窗口层级问题:如果接收消息的是子控件(比如某个Panel里的Form),WM_COPYDATA可能被父窗口拦截了。确保你重写的是主窗口的WndProc,而不是子控件的。
  2. 结构体对齐问题:虽然这不会影响消息类型识别,但如果后续解析数据有问题,也可能导致你误以为消息没收到。给ExternalGetPositionType加上显式的布局声明:
[StructLayout(LayoutKind.Sequential, Pack = 4)] // 32位程序用Pack=4对齐
public struct ExternalGetPositionType {
    public double X;
    public double Y;
    public double Z;
    public double W;
}
  1. 第三方拦截:某些杀毒软件、调试工具或者全局钩子可能会拦截WM_COPYDATA消息,暂时关闭这类软件测试看看。

先按这些步骤排查,应该能定位到问题所在。

内容的提问来源于stack exchange,提问作者AeroMike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:48:57