我的代码如下,调用SCStock_Init方法后,重写windows窗体的WndProc方法后,始终无法截获自定义的消息,debug许久,不明所以。无奈下,向zwz及坛内各位求救,感激不尽! 此程序执行时,可以成功启动数畅接口,数畅也能显示分析软件是我的程序,但是消息处理时,始终截获不到!! Code: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace SCTest { /// <summary> /// 引擎初始化包 // 发出初始化请求,调用SCInit时使用,无对应返回包 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct SC_InitAsk { public SCHead m_Head; public UInt32 m_dwSoftware; // 分析软件标识,由数畅分配 public IntPtr m_hWnd; // 用来接收数据的窗口句柄 public UInt32 m_nMsg; // 用来接收数据的消息 } /// <summary> /// 请求包头 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct SCHead { public UInt16 m_nType; // 请求/应答类型,SC_MARKET、SC_IMCONTENT等 public char m_cStatus; // 当为应答包时,m_cStatus=1成功,m_cStatus=0失败,m_cStatus=2离线 /// <summary> /// 包的唯一索引。不要设为0,请求的时候赋值,并在应答包中 /// 判断是否与请求包中的相同,如果不同,则表示不是这个请求包对应的应答包 /// 如果这个值为0,表示不是请求引起的数据变化 /// </summary> public Int32 m_lIndex; } [StructLayout(LayoutKind.Sequential)] public struct StockInfo { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] public char[] m_szLabel; // 股票代码,以'\0'结尾 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public char[] m_szName; // 股票名称,以'\0'结尾 public Int16 m_nHand; // 每手股数 } /// <summary> /// 市场内容 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct SCMarket { public UInt16 m_wMarket; //市场代码 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public char[] m_Name; // 市场名称 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public char[] m_CShortName; // 中文简称 public UInt32 m_lProperty; //市场属性(未定义) public UInt32 m_lDate; //数据日期(20030114) public UInt16 m_PeriodCount; //交易时段个数 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public UInt16[] m_OpenTime; //开市时间 1,2,3,4,5 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public UInt16[] m_CloseTime; //收市时间 1,2,3,4,5 public UInt16 m_nCount; //收市时间 1,2,3,4,5 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public StockInfo[] m_Siif; } /// <summary> /// //证券标识 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct StockID { public UInt16 m_wMarket; //市场代码 public Int16 m_nIndex; //在该市场SCMarket::m_Siff中的偏移 } [StructLayout(LayoutKind.Sequential)] public struct RCV_NOW_STRUCTEx { public StockID m_sID; public Int32 m_time; public float m_fLastClose; // 昨收 public float m_fOpen; // 今开 public float m_fHigh; // 最高 public float m_fLow; // 最低 public float m_fNewPrice; // 最新 public float m_fVolume; // 成交量 public float m_fAmount; // 成交额 Int32 m_lStroke; // 本次实际成交笔数 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public float[] m_fBuyPrice; // 申买价1,2,3,4,5 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public float[] m_fBuyVolume; // 申买量1,2,3,4,5 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public float[] m_fSellPrice; // 申卖价1,2,3,4,5 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public float[] m_fSellVolume; // 申卖量1,2,3,4,5 } [StructLayout(LayoutKind.Sequential)] public struct RCV_PANKOU_STRUCTEx { public Int32 m_time; // UCT public float m_fHigh; // 最高 public float m_fLow; // 最低 public float m_fNewPrice; // 最新 public float m_fVolume; // 成交量 public float m_fAmount; // 成交额 public Int32 m_lStroke; // 本次实际成交笔数 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public float[] m_fBuyPrice; // 申买价1,2,3 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public float[] m_fBuyVolume; // 申买量1,2,3, [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public float[] m_fSellPrice; // 申卖价1,2,3 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public float[] m_fSellVolume; // 申卖量1,2,3 } [StructLayout(LayoutKind.Sequential)] public struct RCV_HISTORY_STRUCTEx { public Int32 m_time; // UCT public float m_fOpen; //开盘 public float m_fHigh; //最高 public float m_fLow; //最低 public float m_fClose; //收盘 public float m_fVolume; //量 public float m_fAmount; //额 public UInt16 m_wAdvance; //涨数,仅大盘有效 public UInt16 m_wDecline; //跌数,仅大盘有效 } [StructLayout(LayoutKind.Sequential)] public struct RCV_POWER_STRUCTEx { public Int32 m_time; // UCT public float m_fGive; // 每股送 public float m_fPei; // 每股配 public float m_fPeiPrice; // 配股价,仅当 m_fPei!=0.0f 时有效 public float m_fProfit; // 每股红利 } /// <summary> /// 请求包和应答包 // 这个包无需请求即可收到,在市场信息变化的时候就可收到 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct SC_MarketReply { public SCHead m_Head; public SCMarket m_Market; } /// <summary> /// // 这个包无需请求即可收到。数据有更新,会自动发送 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct SC_NowDataReply { public SCHead m_Head; public Int16 m_nCount; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public RCV_NOW_STRUCTEx[] m_Now; } /// <summary> /// 请求一天盘口数据,现支持当天,历史盘口将通过下载获得 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct SC_PankouAsk { public SCHead m_Head; public StockID m_sID; public Int32 m_lDate; // FORMAT: 20010305 } /// <summary> /// 请求一天盘口数据,现支持当天,历史盘口将通过下载获得 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct SC_PankouReply { public SCHead m_Head; public StockID m_sID; public Int32 m_lDate; // FORMAT: 20010305 public float m_fLastClose; // 昨收 public float m_fOpen; // 今开 public Int32 m_lCount; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public RCV_PANKOU_STRUCTEx[] m_Data; } // 注意: // 1、由于服务器的设置,可能只能收到最近某一时段的数据,更多的数据,可以通过下载获得。 // 2、对于K线请求包,当表示日线时,long的格式为yyyymmdd, // 3、对于K线请求包,当为五分钟线时,long的格式如下面这个TDate结构所示 // struct TDate { // 五分钟时间格式 // unsigned long m_Minute : 6; // unsigned long m_Hour : 5; // unsigned long m_Day : 5; // unsigned long m_Month : 4; // unsigned long m_Year : 12; // }; // 4、关于时间的转行,我们提供例子中有示范代码,可参考。 // 5、对K线应答包,日线和无分钟的时间统一为time_t格式,已经包含日期和分钟信息。 /// <summary> /// /// </summary> [StructLayout(LayoutKind.Sequential)] public struct SC_KLineAsk { public SCHead m_Head; public StockID m_sID; public UInt16 m_wDataType; // KLINE_DAYDATA or KLINE_MIN5DATA public Int32 m_tBegin; // 开始时间或位置,0表示从第一个数据开始 public Int32 m_tEnd; // 结束时间或请求数量,0表示直到结束 } [StructLayout(LayoutKind.Sequential)] public struct SC_KLineReply { public SCHead m_Head; public StockID m_sID; public UInt16 m_wDataType; // KLINE_DAYDATA or KLINE_MIN5DATA public Int32 m_lDataCount; // m_pData数量 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public RCV_HISTORY_STRUCTEx[] m_pData; } /// <summary> /// 除权数据不校验,总是以服务器的为准 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct SC_CQAsk { public SCHead m_Head; public StockID m_sID; } public struct SC_CQReply { public SCHead m_Head; public StockID m_sID; public Int16 m_nCount; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public RCV_POWER_STRUCTEx[] m_pData;// m_head不使用 } public unsafe class SCStock { public const int STKLABEL_LEN = 10; // 股号数据长度,国内市场股号编码兼容钱龙 public const int STKNAME_LEN = 32; // 股名长度 public const int TITLE_LEN = 64; // 信息地雷标题长度 public const int SC_INIT = 0x2001; // SCInit调用 public const int SC_CLEAR_PREVREQ = 0x2101; // 撤销前面的所有请求,建议在发请求(或组合请求)之前调用 public const int SC_MARKET = 0x2131; // 请求指定市场的信息,无需请求,有变化就会自动发送 public const int SC_NOWDATA = 0x2201; public const int SC_PANKOU = 0x2301; // 请求盘口数据,对应:time_t m_time,建议使用这个。 public const int SC_IMTYPELIST = 0x2401; // 请求信息地雷信息分类表 public const int SC_IMTITLE = 0x2402; // 请求信息地雷标题列表 public const int SC_IMCONTENT = 0x2403; // 请求信息地雷数据(f10, 交易所公告、实时和历史的个股信息等) public const int SC_KLINE = 0x2501; // 请求K线数据(日线) public const int SC_CQ = 0x2601; // 请求除权数据 public const int SC_DL_KLINE = 0x2701; // K线数据下载 public const int SC_DL_CQ = 0x2702; // 除权数据下载 public const int SC_DL_XX = 0x2703; // 信息下载,如F10、交易所公告、新闻等 public const int SC_DL_TRACE = 0x2704; // 明细数据,旧的,新版已不用 public const int SC_DL_5MIN = 0x2705; // 5分钟K线下载 //define for SC_KLineAsk::m_wDataType public const UInt16 KLINE_DAYDATA = 0;//日线 public const UInt16 KLINE_MIN5DATA = 1; //5分钟线 [DllImport(@"C:\数畅信息服务平台\SCStock.dll")] private static extern bool SCInit(void* sca, Int32 nsize); [DllImport(@"C:\数畅信息服务平台\SCStock.dll")] private static extern bool SCAskData(void* pAsk, Int32 nsize); [DllImport(@"C:\数畅信息服务平台\SCStock.dll")] private static extern void SCQuit(); public static bool SCStock_Init(IntPtr hwnd, UInt32 nMsg) { SC_InitAsk sca; //= new SC_InitAsk(); sca.m_dwSoftware = 0x567890; sca.m_Head.m_nType = SCStock.SC_INIT; sca.m_Head.m_cStatus = Convert.ToChar(1); sca.m_nMsg = nMsg; sca.m_hWnd = hwnd; return SCStock.SCInit(&sca, Marshal.SizeOf(sca)); } public static void SCStock_Quit() { SCQuit(); } } } 窗体程序如下: Code: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace SCTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private UInt32 My_Msg_StkData; private void button1_Click(object sender, EventArgs e) { SCStock.SCStock_Init(this.Handle, My_Msg_StkData); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { } private void button2_Click(object sender, EventArgs e) { SCStock.SCStock_Quit(); } private void Form1_Load(object sender, EventArgs e) { My_Msg_StkData =Win32API.RegisterWindowMessage("BobStockDEMO"); } private void button3_Click(object sender, EventArgs e) { SCStock.SCStock_AskPower(); } SCMarket MKTDATA; protected override void WndProc(ref Message m) { if (m.Msg == My_Msg_StkData) { //此处始终不能执行 SCHead pHead = (SCHead)m.GetLParam(typeof(SCHead)); switch (pHead.m_nType) { case SCStock.SC_MARKET: break; case SCStock.SC_NOWDATA: break; case SCStock.SC_KLINE: break; case SCStock.SC_PANKOU: break; case SCStock.SC_CQ: break; case SCStock.SC_IMTYPELIST: break; case SCStock.SC_IMTITLE: break; case SCStock.SC_IMCONTENT: break; case SCStock.SC_DL_KLINE: // 日k线下载 break; case SCStock.SC_DL_5MIN: // 五分钟k线下载 break; case SCStock.SC_DL_CQ: // 除权数据下载 break; case SCStock.SC_DL_XX: // 资讯数据下载:交易所公告、信息地雷、新闻、综合等 break; case SCStock.SC_DL_TRACE: break; default: break; } } } } }