通达信联动、dll扩展、自定义外部数据

Published

就通达信交易端来说,可以考虑用四个方式来开发程序.

1. 集成闪电下单版,纯粹模拟按键方式.


比如发送21 23等字符串激活闪电下单对话框,然后操作...弊端是容易出错,同步比较困难,而且每步都要设置延时,严重影响效率.
还有一点,读取档位存在问题,呵呵,不能准确的读取各档位数据.

同上集成版,模拟鼠标方式
集成版支持鼠标右击档位来下单,那么可考虑模拟鼠标点击档位来实现,也很简便,不需要很高的编程技巧
因为各档位字体都是等宽的 12 像素 呵呵,可以编写个简单的线性表达式一次性枚举各档位坐标....

2.利用集成版TC.dll导出函数


在这个tc.dll里面有很多个导出接口

TC_ArrangeWnd
TC_BeforeHideWT
TC_CreateAll
TC_DoLevinJy
TC_GetClientInfo
TC_GetDlg  
TC_GetExternLevinCfg
TC_GetJyStatus
TC_GetLoginRet
TC_GetRightInfo
TC_GetVersion
TC_GetYmdData
TC_Init_Environment
TC_LevinGN
TC_Login
TC_PreTransMsg
TC_RegisterCallBack
TC_SetFeedBackMsg
TC_Uninit
DllEntryPoint

 

其中 TC_DoLevinJy 就是闪电下单相关的,呵呵,会进程注入的,可以试试调用这个接口实现自定义闪电下单,各参数可以通过反编译工具反向获取,如IDA Pro + HexRays......


3.独立版,通过屏幕取词实现


呵呵,这种方式也要求较高编程技术,有关屏幕取词技术可以参考 NHW32.DLL

可保证200毫秒内完成下单动作,效率极高.

4.从网络数据包中读取各档位以及成交数据.

 

进程间通信的方法有很多,比如使用注册消息,内存映射,WM_COPYDATA等。

 

本文描述使用注册消息实现的方法。

 

使用注册消息比较简单,核心是消息的接收端和消息的发送端(接收端和发送端在两个不同的进程)必须注册相同的消息,这样发送消息才能识别。

具体实现:


1, 在发送消息程序A注册消息:


static UINT const WM_TASKBARCREATED = RegisterWindowMessage(_T("TaskbarCreated")); //注册系统消息


上面这条消息内容可自己定义,匹配字符串即可。

2,在程序需要发送消息时调用:


 ::PostMessage(HWND_BROADCAST, WM_UPDATE_ALARMFILTER, 0, 0);


参数HWND_BROADCAST表示将该消息发送到所有top-level的窗口,including disabled or invisible unowned windows, overlapped windows, and pop-up windows. The message is not posted to child windows.(包括非活动或者不可见的未知窗口,表层窗口,和弹出窗口。但这条消息并不会发送给子窗口)

如果不想发给所有顶层窗口,只想发给指定窗口,就不使用HWND_BROADCAST参数,获得要发送窗口的句柄即可:

 

二,接收消息进程


1,在接收消息程序B,同样注册消息:


static UINT const WM_TASKBARCREATED = RegisterWindowMessage(_T("TaskbarCreated")); //注册系统消息


2,定义消息映射:


ON_REGISTERED_MESSAGE(WM_TASKBARCREATED, OnTaskBarcreated) 


//然后实现消息响应函数即可

注意:要在消息的发送进程和接收进程注册同样的消息ID。

 

 

1.通达信联动

1.1通达信有很多自定义消息,通过传递消息来完成某个小功能将大大简化编程,提高效率.就是win32调用.比如显示某支股票可以向通达信发送消息来实现。

C代码

UINT UWM_STOCK = RegisterWindowMessage(_T("Stock"));
  
::PostMessage(HWND_BROADCAST,UWM_STOCK,7580019,0);
//就是查看 580019 的页面,
::PostMessage(HWND_BROADCAST,UWM_STOCK,6031007,0);
//是查看031007页面

注意股票代码:沪市代码前加7,其它市场股票代码前面加6.

1.2.若无消息接口,模拟键盘输入来联动,效率低稳定性差。

AutoHotkey代码

;这里指定0xFFFF就是HWND_BROADCAST,是对多个通达信窗口广播消息;
;如果指定具体窗口的句柄,则是向特定窗口发送消息。
 
active_id:=0xFFFF
UWM_STOCK := DllCall("RegisterWindowMessage", Str,"Stock")
PostMessage,UWM_STOCK,7600050,0,,ahk_id %active_id%

 

2.通达信dll扩展

 

3.通达信自定义外部数据

 

4.通达信编程