搜索
楼主: wjlhc

谈一点期货辅助交易软件制作经验

[复制链接]

签到天数: 2 天

发表于 2012-6-23 12:05 | 显示全部楼层
楼主好像是通过按键点击的方法实现成交查询。自己前段时间一直在搞自动下单。不过是股票的。完全用autohotkey(一个按键精灵一样的软件)实现的。因为大智慧提供“复制到剪贴板”功能。这样就可以用autohotkey对剪切板内容处理,比如我就是用(下图中)最新价与TB_G比较来决定买卖。然后在核新交易软件中下单。由于核新提供下单快捷键功能,所以也就比较简捷。这一切操作都可以在后台完成,并不影响我上网干其它事。不过不能使用COPY了 。而且与软件位置无关,最小化也没有关系。
我因为VBA只懂一点点,主要用来对EXCEL进行股票系统测试。希望楼主能讲讲文字识别取行情数据的部分。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
金币:
奖励:
热心:
注册时间:
2003-4-10

回复 使用道具 举报

发表于 2012-6-23 23:51 | 显示全部楼层
这不是c++的语法吧,sleep 本身精度不行,sleep只是休眠挂起,会阻塞系统其他软件的运行,例如行情的接受。怕是不行的,起码都要用多线程的手段吧。你的截屏分析时间再短都是没用的,因为你不知道系统刷屏会落在那个时间点。
金币:
奖励:
热心:
注册时间:
2012-1-31

回复 使用道具 举报

发表于 2012-6-23 23:55 | 显示全部楼层
说一千道一万,不写个DEMO出来看看能否同步捕获屏幕数据成文本,都是没用的的。交易计算所化的时间就不用算了。
金币:
奖励:
热心:
注册时间:
2012-1-31

回复 使用道具 举报

签到天数: 2 天

发表于 2012-6-24 10:44 | 显示全部楼层
楼主引用的动态库函数是自己做的吧。也提供出来吧。#*22*#
金币:
奖励:
热心:
注册时间:
2003-4-10

回复 使用道具 举报

 楼主| 发表于 2012-6-27 22:52 | 显示全部楼层

回复 #22 加加减减 的帖子

是vb的代码,关键的运算部分用vc写,特别是依靠指针会快很多。vc要考虑很多东西,挺烦的,但是运行效率很高,vb编程效率比vc高很多,特别是比较复杂程序,vb能让你把主要精力放在程序逻辑本身上,而vc很多细节都要去写,弄一大堆类,反正也不要啥界面特效,vb足够了。
sleep精度确实很差,但是有时候必须用他,不然cpu占用率会很高。对于小的交易软件来说,不用多线程也行,当然多线程会效果更好,vc在多线程上要考虑很多东西。至于截屏的函数都是现成的api,不会出现问题,你过虑了,该考虑的微软会考虑好的,不然微软一定会有相应的安全提示,就像使用memcpy一样,一定会有警告的。我本身在软件中没用sleep,几个线程都是满负荷运行的。
如果想看效果,不妨去下载大漠的插件,按键精灵网站上有,DEMO例子一大堆,省得自己动手做了,呵呵。
我自己从来没想过给别人做演示软件,自己够用就行了,因为屏幕文字识别和分辨率 操作系统 等因素有关,每个人都不一样,这就不像读取内存了那样方便了。

[ 本帖最后由 wjlhc 于 2012-6-27 23:31 编辑 ]
参与人数 1奖励 +5 时间 理由
杨太极 + 5 2012-6-30 09:24 MACD有楼主更精彩!

查看全部评分

金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

 楼主| 发表于 2012-6-27 23:20 | 显示全部楼层

回复 #24 ligao2518 的帖子

是自己做的ocr,写成dll文件而已,也没有复杂的算法,就是直接点阵识别,比较简单,获取屏幕区域颜色数组后循环判断就行了。这不像其他文字识别,还要用啥积分算法等等,因为交易软件就那几个字,要是很多文字就要专门的文字识别方法了,哪些方法图形处理的书上都有,我这个比较简单。
先GetDC获取整个屏幕的显示设备上下文环境的句柄;然后CreateCompatibleDC创建一个与指定设备兼容的内存设备上下文环境(DC);再CreateDIBSection创建可以直接写入的、与设备无关的位图(DIB);再 SelectObject然后BitBlt ;  GetDIBits颜色数据到数组就OK了,如果再不明白的话那编程就白学了,呵呵!不明白可以自己从网上搜截图或制作视频的方法,一大堆各种各样,基本道理是一样的。上面的过程vc和vb是一样的。
偷点懒的话可以用现成的dll,大漠的就比较好,百度下来用就行了,他的算法比较好,适用面广。如果想做的像大漠一样优秀,可以看看专门的图形处理书,上面的算法拿来套用就行了。
还有想对 ligao2518 说的,你真的没必要搞这个东西,股票和期货不同,做股票你有足够的时间去反应,根本不需要用额外的软件。

[ 本帖最后由 wjlhc 于 2012-6-27 23:43 编辑 ]
参与人数 1奖励 +5 时间 理由
杨太极 + 5 2012-6-30 09:24 MACD有楼主更精彩!

查看全部评分

金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

 楼主| 发表于 2012-6-30 01:39 | 显示全部楼层
'使鼠标点击 TextBox 和 NumericUpDown 后自动选中全部文本
Me.TextBox1.SelectAll() '选中文本框全部内容
Clipboard.SetText(TextBox1.Text) '将内容复制到剪贴板
Me.NumericUpDown2.Select(0, Me.NumericUpDown2.Value.ToString().Length)'选中NumericUpDown 全部内容


'使控件获得焦点
Public Const WM_SETFOCUS = &H7'声明中的
'通过消息实现:
SendMessage(DingDanLeiXingHand, WM_SETFOCUS, 0, 0)

[ 本帖最后由 wjlhc 于 2012-6-30 02:22 编辑 ]
参与人数 1奖励 +5 时间 理由
杨太极 + 5 2012-6-30 09:24 MACD有楼主更精彩!

查看全部评分

金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

 楼主| 发表于 2012-6-30 02:04 | 显示全部楼层
'获取控件的内容
Public Function GetTextString(ByVal lyHwnd As Long) As String
        Dim GetS As String '= Nothing
        Dim SLen As Long
        SLen = SendMessage(lyHwnd, WM_GETTEXTLENGTH, 0, 0)
        If SLen = 0 Then
            GetTextString = ""
        Else
            SLen = SLen + 1
            Dim chars(SLen) As Char
            GetS = CStr(chars)
            'GetS = Space(SLen)
            SLen = SendMessage(lyHwnd, WM_GETTEXT, SLen, GetS)
            GetTextString = Strings.Left(GetS, SLen)
        End If
    End Function

[ 本帖最后由 wjlhc 于 2012-6-30 02:23 编辑 ]
参与人数 1奖励 +3 热心 +5 时间 理由
须须之臾 + 3 + 5 2012-7-2 08:12 感谢分享,收藏并加分支持!

查看全部评分

金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

签到天数: 580 天

发表于 2012-6-30 09:25 | 显示全部楼层
对于编程的事情一片空白#*18*#
金币:
奖励:
热心:
注册时间:
2006-11-25

回复 使用道具 举报

 楼主| 发表于 2012-7-3 23:49 | 显示全部楼层
下面我们来一次实战,制作一个简单的下单软件。软件具有快速下单和炒单以及跟价下单功能。
我们知道很多期货软件不是很符合自己的个性要求,比如金仕达下单有跟踪价格功能,而易盛有一键下单功能,恒生总是千年不变的老面孔,就别说跟价和一键下单了。首先做一个Ocr文字识别模块,或者先找一个Ocr文字识别控件,这个东西挺多的 ,如果自己不会但是 有特殊需求也可以请高手帮助 制作专门针对期货的dll文件,这样效率会高很多。网上很多人能做这个东西,一般来说即使收费也不是很贵,通常价格在100元左右,我第一次就是花了100元购买别人的Ocr,那是2年以前的事情了,针对期货专门制作会获得极高的效率。我们这里假设已经有了ocr文件或模块。
值得注意的是因为采用文字识别,所以界面有时会有遮挡现象,还有要防止交易软件界面发生移动,防止发生移动要采用api函数获取窗口位置的办法,如果位置发生变化就用api函数重新设置窗口位置。如果你的屏幕很小,可以安装支持多屏的显卡,一般显示器接口多的话,无需增加显示器就可以达到多显示器的效果。防止遮挡可以将一些其他前面的窗口设置透明度,这样即使挡住要取数值的交易界面也仍然会取到数值。
要精准获取界面上的数据,界面的所有位置都是要固定好的,我自己用易盛,其他软件类似,方法是一样的,界面用程序自动调整好,因为想看实际效果,所以没用后台的方式。界面显示用委托/成交双列显示,列头在程序中写明了,很多地方没有注释,有时间的话以后会注释上。自动调整交易界面只是准备工作之一。
代码如下:
'自动调整交易界面
    Private Sub Button12_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button12.Click
        Dim j As Integer
        PlaySound(Application.StartupPath & "\sound\开始调整.wav", 0, SND_FILENAME)
        MySleep(20)
        Dim DISPLAYhand As Integer
        DISPLAYhand = GetDC(0) '取得整个屏幕的hDC
        yishenghwnd = FindWindow(vbNullString, Label5Array(1).Text)‘Label5Array(1).Text是交易软件的标题名
        Label10.Text = yishenghwnd
        If Val(Label6Array(1).Text) > 0 Then
            SetWindowPos(Val(Label6Array(1).Text), HWND_TOPMOST, Val(Label1Array(1).Text), Val(Label2Array(1).Text), Val(Label3Array(1).Text) - Val(Label1Array(1).Text), Val(Label4Array(1).Text) - Val(Label2Array(1).Text), 0)
            '按下F4键,显示所有挂单界面
            PostMessage(Val(Label6Array(1).Text), WM_KEYDOWN, WM_F4, 0)
            PostMessage(Val(Label6Array(1).Text), WM_KEYUP, WM_F4, 0)
            '移动鼠标到“期货行情”点击
            MySleep(10)
            SetCursorPos(810 + Val(Label1Array(1).Text), 30 + Val(Label2Array(1).Text))
            MySleep(10)
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
            MySleep(10)
            mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
            MySleep(10)
            ' 开始遍历软件的所有句柄
            Call EnumChildWindows(CInt(Label10.Text), AddressOf EnumWindowProc, &H0)
            BianLiJuBing = 1 '当为1时,遍历句柄函数被调用过,再次调用时,要初始化值为0
            '通过遍历出来的句柄标题获取
            For i = g_nWndCount - 1 To 0 Step -1
                ' MsgBox(MysTitle(i))
                If MysTitle(i) = "所有挂单" Then '如果标题为"  成交查询",则开始获取句柄窗口的坐标位置
                    Myshwnd(i) = FindWindowEx(Myshwnd(i), 0, "TdxTreeList", vbNullString) '获取挂单栏句柄
                    yishengGuaDanHand = Myshwnd(i) '挂单栏句柄
                    GetWindowRect(Myshwnd(i), LinShiMyRect)
                    'MsgBox("(" & LinShiMyRect.Left & "," & LinShiMyRect.Top & ")(" & LinShiMyRect.Right & "," & LinShiMyRect.Bottom & ")")
                    Dim weituoguadanbiaozhi As Integer = 1 '委托挂单标志
                    Dim Str As String
                    Dim chars(100) As Char
                    Str = CStr(chars)
                    YiShengStrOcr(LinShiMyRect.Left, LinShiMyRect.Top, LinShiMyRect.Left + 475, LinShiMyRect.Top + 20, Str, 100)
                    'If Trim(Str) = "名称合约最新价卖价卖量买价买量跌停价涨停价" Then
                    If Trim(Str) = "委托状态合约买卖开平委托价委托量成交量" Then
                        For j = LinShiMyRect.Left + 6 To LinShiMyRect.Left + 490
                            If GetPixel(DISPLAYhand, j, LinShiMyRect.Top + 10) = CInt(TextBox22.Text) And weituoguadanbiaozhi < 8 Then '取颜色
                                MySleep(10)
                                SetCursorPos(j, LinShiMyRect.Top + 10)
                                MySleep(10)
                                mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
                                MySleep(10)
                                If weituoguadanbiaozhi = 1 Then
                                    SetCursorPos(LinShiMyRect.Left + 80, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 80 + 6
                                ElseIf weituoguadanbiaozhi = 2 Then
                                    SetCursorPos(LinShiMyRect.Left + 145, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 145 + 6
                                ElseIf weituoguadanbiaozhi = 3 Then
                                    SetCursorPos(LinShiMyRect.Left + 195, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 195 + 6
                                ElseIf weituoguadanbiaozhi = 4 Then
                                    SetCursorPos(LinShiMyRect.Left + 245, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 245 + 6
                                ElseIf weituoguadanbiaozhi = 5 Then
                                    SetCursorPos(LinShiMyRect.Left + 330, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 330 + 6
                                ElseIf weituoguadanbiaozhi = 6 Then
                                    SetCursorPos(LinShiMyRect.Left + 390, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 390 + 6
                                ElseIf weituoguadanbiaozhi = 7 Then
                                    SetCursorPos(LinShiMyRect.Left + 450, LinShiMyRect.Top + 10)
                                End If
                                MySleep(10)
                                mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
                                MySleep(10)
                                weituoguadanbiaozhi = weituoguadanbiaozhi + 1
                            End If
                        Next j
                    Else
                        MsgBox("你的挂单栏列头为:" & vbCrLf & Trim(Str) & vbCrLf & "请依次更改显示为:" & vbCrLf & "委托状态合约买卖开平委托价委托量成交量" & vbCrLf & "然后再次重新调整!") 'vbcrlf为换行回车符
                        Exit Sub
                    End If
                ElseIf MysTitle(i) = "成交查询" Then '如果标题为"  成交查询",则开始获取句柄窗口的坐标位置
                    yishengChengJiaoHand = Myshwnd(i) '成交栏句柄
                    GetWindowRect(Myshwnd(i), LinShiMyRect)
                    '设置鼠标的位置
                    'MsgBox("(" & LinShiMyRect.Left & "," & LinShiMyRect.Top & ")(" & LinShiMyRect.Right & "," & LinShiMyRect.Bottom & ")")
                    Dim Str As String
                    Dim chars(100) As Char
                    Str = CStr(chars)
                    YiShengStrOcr(LinShiMyRect.Left, LinShiMyRect.Top, LinShiMyRect.Left + 460, LinShiMyRect.Top + 20, Str, 100)
                    If Trim(Str) = "合约买卖开平成交价数量成交时间流号" Then
                        SetCursorPos(LinShiMyRect.Left - 2, LinShiMyRect.Top + 9)
                        'MsgBox("成交查询" & LinShiMyRect.Left & "/" & LinShiMyRect.Top)
                        MySleep(10)
                        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
                        MySleep(10)
                        SetCursorPos(3120 - 2638 + Val(Label1Array(1).Text) - 2, LinShiMyRect.Top + 9)
                        MySleep(10)
                        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
                        '移动鼠标到“所有挂单—明细”点击
                        MySleep(10)
                        SetCursorPos(594 + Val(Label1Array(1).Text), 485 + Val(Label2Array(1).Text))
                        MySleep(10)
                        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
                        MySleep(10)
                        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
                        MySleep(10)
                        'SendMessage(Myshwnd(i), WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(LinShiMyRect.Left - 3, LinShiMyRect.Top + 9))
                        MySleep(10)
                        Dim chengjiaochaxunbiaozhi As Integer = 1 '成交查询标志
                        For j = LinShiMyRect.Left + 6 To LinShiMyRect.Left + 435
                            If GetPixel(DISPLAYhand, j, LinShiMyRect.Top + 10) = CInt(TextBox22.Text) And chengjiaochaxunbiaozhi < 8 Then '取颜色
                                MySleep(10)
                                SetCursorPos(j, LinShiMyRect.Top + 10)
                                MySleep(10)
                                mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
                                MySleep(10)
                                If chengjiaochaxunbiaozhi = 1 Then
                                    SetCursorPos(LinShiMyRect.Left + 65, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 65 + 6
                                ElseIf chengjiaochaxunbiaozhi = 2 Then
                                    SetCursorPos(LinShiMyRect.Left + 115, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 115 + 6
                                ElseIf chengjiaochaxunbiaozhi = 3 Then
                                    SetCursorPos(LinShiMyRect.Left + 165, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 165 + 6
                                ElseIf chengjiaochaxunbiaozhi = 4 Then
                                    SetCursorPos(LinShiMyRect.Left + 250, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 250 + 6
                                ElseIf chengjiaochaxunbiaozhi = 5 Then
                                    SetCursorPos(LinShiMyRect.Left + 290, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 290 + 6
                                ElseIf chengjiaochaxunbiaozhi = 6 Then
                                    SetCursorPos(LinShiMyRect.Left + 365, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 365 + 6
                                ElseIf chengjiaochaxunbiaozhi = 7 Then
                                    SetCursorPos(LinShiMyRect.Left + 455, LinShiMyRect.Top + 10)
                                End If
                                MySleep(10)
                                mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
                                MySleep(10)
                                chengjiaochaxunbiaozhi = chengjiaochaxunbiaozhi + 1
                            End If
                        Next j
                    Else
                        MsgBox("你的成交栏列头为:" & vbCrLf & Trim(Str) & vbCrLf & "请依次更改显示为:" & vbCrLf & "合约买卖开平成交价数量成交时间流号" & vbCrLf & "然后再次重新调整!") 'vbcrlf为换行回车符
                        Exit Sub
                    End If
                    ' SendMessage(Myshwnd(i), WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(LinShiMyRect.Left - 3, LinShiMyRect.Top + 9))
                    ' mouse_event(MOUSEEVENTF_WHEEL, 0, 0, -12, 0) '表示向下滑动12个齿轮()
                    ' MsgBox("(" & LinShiMyRect.Left & "," & LinShiMyRect.Top & ")(" & LinShiMyRect.Right & "," & LinShiMyRect.Bottom & ")")
                ElseIf MysTitle(i) = "期货报价" Then '如果标题为"期货报价",则开始获取句柄窗口的坐标位置
                    yishengHangQingHand = Myshwnd(i) '行情栏句柄
                    GetWindowRect(Myshwnd(i), LinShiMyRect)
                    ' MsgBox("(" & LinShiMyRect.Left & "," & LinShiMyRect.Top & ")(" & LinShiMyRect.Right & "," & LinShiMyRect.Bottom & ")")
                    '设置鼠标的位置
                    Dim Str As String
                    Dim chars(100) As Char
                    Str = CStr(chars)
                    YiShengStrOcr(LinShiMyRect.Left, LinShiMyRect.Top, LinShiMyRect.Left + 760, LinShiMyRect.Top + 20, Str, 100)
                    If Trim(Str) = "名称合约最新价卖价卖量买价买量跌停价涨停价" Then
                        SetCursorPos(LinShiMyRect.Left + 5, LinShiMyRect.Bottom + 1)
                        'MsgBox("期货报价" & LinShiMyRect.Left & "/" & LinShiMyRect.Bottom)
                        MySleep(10)
                        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
                        MySleep(10)
                        SetCursorPos(LinShiMyRect.Left + 5, Val(Label2Array(1).Text) + 734 - 482 + 1)
                        MySleep(10)
                        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
                        MySleep(10)
                        '列头显示分别依次为"名称/合约/最新价/卖价/卖量/买价/买量/跌停价/涨停价"9项
                        '从期货报价栏左上角开始调整,左上角期货报价栏窗口的起始点x坐标为LinShiMyRect.Left ,y点的坐标为LinShiMyRect.Top
                        Dim baojialanbiaozhi As Integer = 1
                        For j = LinShiMyRect.Left + 6 To LinShiMyRect.Left + 700
                            If GetPixel(DISPLAYhand, j, LinShiMyRect.Top + 10) = CInt(TextBox22.Text) And baojialanbiaozhi < 10 Then '取颜色
                                MySleep(10)
                                SetCursorPos(j, LinShiMyRect.Top + 10)
                                MySleep(10)
                                mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
                                MySleep(10)
                                If baojialanbiaozhi = 1 Then
                                    SetCursorPos(LinShiMyRect.Left + 98, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 98 + 6
                                ElseIf baojialanbiaozhi = 2 Then
                                    SetCursorPos(LinShiMyRect.Left + 178, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 178 + 6
                                ElseIf baojialanbiaozhi = 3 Then
                                    SetCursorPos(LinShiMyRect.Left + 258, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 258 + 6
                                ElseIf baojialanbiaozhi = 4 Then
                                    SetCursorPos(LinShiMyRect.Left + 338, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 338 + 6
                                ElseIf baojialanbiaozhi = 5 Then
                                    SetCursorPos(LinShiMyRect.Left + 398, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 398 + 6
                                ElseIf baojialanbiaozhi = 6 Then
                                    SetCursorPos(LinShiMyRect.Left + 478, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 478 + 6
                                ElseIf baojialanbiaozhi = 7 Then
                                    SetCursorPos(LinShiMyRect.Left + 538, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 538 + 6
                                ElseIf baojialanbiaozhi = 8 Then
                                    SetCursorPos(LinShiMyRect.Left + 618, LinShiMyRect.Top + 10)
                                    j = LinShiMyRect.Left + 618 + 6
                                ElseIf baojialanbiaozhi = 9 Then
                                    SetCursorPos(LinShiMyRect.Left + 698, LinShiMyRect.Top + 10)
                                End If
                                MySleep(10)
                                mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
                                MySleep(10)
                                baojialanbiaozhi = baojialanbiaozhi + 1
                            End If
                        Next j
                    Else
                        MsgBox("你的行情栏列头为:" & vbCrLf & Trim(Str) & vbCrLf & "请依次更改显示为:" & vbCrLf & "名称合约最新价卖价卖量买价买量跌停价涨停价" & vbCrLf & "然后再次重新调整!") 'vbcrlf为换行回车符
                        Exit Sub
                    End If
                ElseIf MysTitle(i) = "5档行情" Then '如果标题为"  成交查询",则开始获取句柄窗口的坐标位置
                    ShowWindow(Myshwnd(i), SW_SHOWNA)
                    GetWindowRect(Myshwnd(i), LinShiMyRect)
                    'MsgBox("(" & LinShiMyRect.Left & "," & LinShiMyRect.Top & ")(" & LinShiMyRect.Right & "," & LinShiMyRect.Bottom & ")")
                End If
            Next i
        ElseIf jyhwnd <= 0 Then
            MsgBox("请正确设置交易软件句柄!")
        End If
        SetCursorPos(Val(Label1Array(1).Text) - 20, Val(Label2Array(1).Text) - 20)
        PlaySound(Application.StartupPath & "\sound\界面调整结束.wav", 0, SND_FILENAME)
        ' MsgBox(g_nWndCount & "   windows   found.")
        ReleaseDC(0, DISPLAYhand) '函数释放, 不能用DeleteDC
      
    End Sub
'遍历窗口句柄并存储在动态数组中
    Public Function EnumWindowProc(ByVal hWnd As Long, ByVal lParam As Long) As Long
        If BianLiJuBing = 1 Then
            BianLiJuBing = 0
            g_nWndCount = 0
            ReDim MysTitle(g_nWndCount) ' MsgBox("标题" & sTitle)
            ReDim MysClass(g_nWndCount) ' MsgBox("类名" & sClass)
            ReDim Myshwnd(g_nWndCount) 'MsgBox("hWnd" & hWnd)
        Else
            ReDim Preserve MysTitle(g_nWndCount) ' MsgBox("标题" & sTitle)
            ReDim Preserve MysClass(g_nWndCount) ' MsgBox("类名" & sClass)
            ReDim Preserve Myshwnd(g_nWndCount) 'MsgBox("hWnd" & hWnd)
        End If
        MysTitle(g_nWndCount) = Space$(MAX_PATH)
        MysClass(g_nWndCount) = Space$(MAX_PATH)
        Call GetClassName(hWnd, MysClass(g_nWndCount), MAX_PATH)
        Call GetWindowText(hWnd, MysTitle(g_nWndCount), MAX_PATH)
        MysTitle(g_nWndCount) = Strings.Left(RTrim(LTrim(MysTitle(g_nWndCount))), Len(LTrim(RTrim(MysTitle(g_nWndCount)))) - 1)
        'MsgBox(MysTitle(g_nWndCount))
        ' If Strings.Left(RTrim(LTrim(MysTitle(g_nWndCount))), 4) = "成交查询" Then '使用RTrim和LTrim分别将字符串左右的空格去掉,但是字符结束的结束标志符是无法去除的
        'MsgBox("发现 成交查询 ")
        'End If
        ' MsgBox(RTrim(LTrim(MysTitle(g_nWndCount))))
        'MsgBox("长度为" & Len(LTrim(RTrim(MysTitle(g_nWndCount)))))
        'TextBox2.Text = "‘" & RTrim(LTrim(MysTitle(g_nWndCount))) & "‘" & "*"
        'TextBox2.Text = "‘" & Strings.Left(RTrim(LTrim(MysTitle(g_nWndCount))), Len(LTrim(RTrim(MysTitle(g_nWndCount))))) & "'"
        Myshwnd(g_nWndCount) = hWnd
        ' MsgBox(Myshwnd(g_nWndCount))
        g_nWndCount = g_nWndCount + 1
        EnumWindowProc = 1
    End Function
今天下暴雨打雷,只好把电脑关上了,有时间继续写。

[ 本帖最后由 wjlhc 于 2012-7-4 00:06 编辑 ]
参与人数 1奖励 +5 时间 理由
杨太极 + 5 2012-7-4 04:45 MACD有楼主更精彩!

查看全部评分

金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

 楼主| 发表于 2012-7-5 00:33 | 显示全部楼层
如果你采用vs2005以上版本制作dll,当用到strcat时,会产生下面的警告:
警告 1 warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
这是由于当用到strcat时,可能会产生内存溢出问题,导致很大的不安全性,因此,最好使用能够有异常抛出的strcat_s,这样不但安全,以可以消除烦人的警告。这是微软在VS2005之后,为了防止数据溢出问题,特意引进了所谓的安全函数strxxx_s系列
例如: strcat_s(str1, num, str2);  第二个参数是指定str1长度。
ep : strcat_s(str,sizeof(str),"456");
另外不建议使用strcpy_s函数初始化一个char*,会引起不必要的麻烦。
可以直接 char csName[20] = "123";
但是缺点也是有的,这样的dll或许会在vb下报错。如果vb调用,也只能忽略警告了。

[ 本帖最后由 wjlhc 于 2012-7-5 01:01 编辑 ]
金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

 楼主| 发表于 2012-7-6 19:17 | 显示全部楼层
为了进行资金管理,在获取成交列表数据后,可以将数据存入结构体的数组里,这样调用很方便,运行速度也要比采用数据库快得多。也可以将数据显示在.DataGridView之中,为了看到最先成交的数据,就要按照成交时间或流水序列进行到排序,这时可以用下面的语句进行排列:
Dim SortCo As New DataGridViewColumn
        SortCo = Me.DataGridView3.Columns(6) '必须创建排序列的实例
        ' Me.DataGridView3.Sort(SortCo, System.ComponentModel.ListSortDirection.Ascending)‘正排序
        ' Me.DataGridView3.Sort(Me.DataGridView3.Columns("DCL"), System.ComponentModel.ListSortDirection.Descending)
        Me.DataGridView3.Sort(SortCo, System.ComponentModel.ListSortDirection.Descending)’到排序
参与人数 1奖励 +5 时间 理由
杨太极 + 5 2012-7-6 21:40 MACD有楼主更精彩!

查看全部评分

金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

签到天数: 6 天

发表于 2012-7-7 06:19 | 显示全部楼层
#*P# #*P#
金币:
奖励:
热心:
注册时间:
2003-8-10

回复 使用道具 举报

 楼主| 发表于 2012-7-7 23:31 | 显示全部楼层
混合编程的特点在于取vb的编程效率和vc的运行效率于一身,vb的优点和缺点都在于封装性,因此只要知道控件属性就可以了,不必像vc一样做每件事都要要瞻前顾后。
下面是如何在vc中制作dll文件供vb调用的方法,其实蛮简单的,也可以看看vc的书,照葫芦画瓢就可以了;后面提供了dll文件传递数组的方法,用处很大,因为我们通常ocr.dll在识别合约后,直接用一些参数就可以了,而省却了获取合约,再通过品种代码来循环判断诸如“交易单位”“最小变动价位”“保证金”“费率”等一系列参数。我们通过结构或数组的传递,可以在得到合约时,直接得到这些参数使用,大大提高了运行效率。
(下面大括号属直接摘抄)
{首先在VC++中生成Win32 DLL工程。在这个工程中添加几个函数供VB用户调用。一个DLL中的函数要想被VB调用,必须满足两个条件:一是调用方式为stdcall,另一个是必须是export的。要做到第一条,只须在函数声明前加上__stdcall关键字。如:
    short __stdcall sample(short nLen, short *buffer)
    要做到第二条,需要在*.def文件中加上如下的几行:
    EXPORTS
     sample @1
    这里的sample是你要在VB中调用的函数名,@1表示该函数在DLL中的编号,每个函数都不一样。注意这里的函数名是区分大小写的。至于你说的需要传递大量数据,可以这样做,在VB中用一个数组存放数据,然后将该数组的大小和地址传给VC(至于如何在VB中编程我会在下面介绍)。就象上面的例子,nLen是数组大小,buffer是数组地址,有了这两条,你可以象使用VC的数组一样进行处理了。至于输出图形,可以生成WMF或BMP格式,让VB调用。不过,我认为也可以直接输出到视窗,只要VB将窗口的句柄hWnd和hDC以及视窗的绘图位置(VB和VC采用的坐标系必须一致才行)传给VC就行了。而VB的AutoRedraw属性必须为False,在Paint事件中调用VC的绘图程序。
    再谈谈VB的编程。VB调用DLL的方法和调用Windows API的方法是一样的,一般在VB的书中有介绍。对于上面一个例子,先要声明VC函数:
    Declare Function sample Lib "mydll.dll" (ByVal nLen As Integer, buffer As Integer) As Integer
    这里mydll.dll是你的dll的名字。你可能已经注意到了两个参数的声明有所不同,第一个参数加上了ByVal。规则是这样的:如果在VC中某个参数声明为指针和数组,就不加ByVal,否则都要加上ByVal。在VB中调用这个函数采用这样的语法:
    sample 10, a(0)
    这里的a()数组是用来存放数据的,10为数组长度,这里的第二个参数不能是a(),而必须是要传递的数据中的第一个。这是VB编程的关键。
    下面在说几个可能遇到的问题。一个问题是VB可能报告找不到dll,你可以把dll放到system目录下,并确保VB的Declare语句正确。另一个问题是VB报告找不到需要的函数,这通常是因为在VC中*.def文件没设置。第三种情况是VB告诉不能进行转换,这可能是在VC中没有加上__stdcall关键字,也可能是VB和VC的参数类型不一致,注意在VC中int是4个字节(相当于VB的Long),而VB的Integer只有2个字节。必须保证VB和VC的参数个数相同,所占字节数也一致。最后一个要注意的问题是VC中绝对不能出现数组越界的情况,否则会导致VB程序崩溃。}
VB VC 混合编程(dll)中 数组 的传入传出        
    数值型数组在VB中其数据是连续存放的,相当于一维的,而在C/C++中数组可以等价于指向数组第1个元素的指针。可以用引用的方式把VB中数组的第1个元素的地址传给VC编写的DLL,在DLL中用一个指针来接收,这样就实现了VB到Dll在中数组的传递。从DLL传递数组给VB方法相同,过程相反.
    如果是二维数组,则把二维数组按照一维数组的方式传入传出,只是在使用的时候,顺便把二维数组的行和列数传递即可。
    总体思想是这样的。下面看例子。

VC中:

double _stdcall OneDimensionArrayTest(double *inArr,int nCount,double *outArr,int* ioutArrCount) //一维数组的传入传出
{
    int iNum=nCount;
     double *dRes=new double[iNum];
    int i;
     for(i=0;i<nCount;i++)
     {
         dRes=inArr*2;
     }

    for(i=0;i<nCount;i++)
     {
         outArr=dRes;
     }
    *ioutArrCount=iNum;
     return dRes[0];
     delete []dRes;
}


void _stdcall TwoDimensionArrayTest(double *inArr,int nRows,int nCols,double *outArr,int* outRows,int *outCols)//二维数组的传入传出
{
     double *dRes=new double[nRows*nCols];
    int i;
     int j;
     for(i=0;i<nRows;i++)
     {
         for(j=0;j<nCols;j++)
         {
             dRes[nCols*i+j]=inArr[nCols*i+j]*2;
         }
     }
     for(i=0;i<nRows;i++)
     {
         for(j=0;j<nCols;j++)
         {
             outArr[nCols*i+j]=inArr[nCols*i+j]*2;
         }
     }
    *outRows=nRows;
     *outCols=nCols;
     delete [] dRes;
}


LIBRARY      "TestDll"

EXPORTS
    ; 此处可以是显式导出
    Add @1
    darray @2
    OneDimensionArrayTest @3
TwoDimensionArrayTest @4

VB中
Declare Function OneDimensionArrayTest Lib "D:\在编程序\Dll\VBLoadDll\TestDll.dll" (ByRef inputer As Double, ByVal inLength As Long, ByRef output As Double, ByRef outLength As Long) As Double
Declare Function TwoDimensionArrayTest Lib "D:\在编程序\Dll\VBLoadDll\TestDll.dll" (ByRef inputer As Double, ByVal inRows As Long, ByVal inCols As Long, ByRef outputer As Double, ByRef outRows As Long, ByRef outCols As Long)

Private Sub cmdTest2_Click()
Dim inputer(8) As Double
Dim out(9) As Double
Dim res As Double
Dim m As Long
inputer(0) = 1.2
inputer(1) = 2.3
inputer(2) = 1
res = OneDimensionArrayTest(inputer(0), 9, out(0), m)
MsgBox CStr(m), vbOKOnly, "一维数组的元素个数"

'MsgBox CStr(res)

Dim str As String
Dim i As Integer
For i = 0 To UBound(out)
   str = str + "   " + CStr(out(i))
Next
MsgBox str, vbOKOnly, "一维数组的元素"
End Sub

Private Sub cmdTest3_Click()
Dim iRows As Integer
Dim iCols As Integer
iRows = 3
iCols = 4
Dim inputer() As Double
ReDim inputer(iRows, iCols)
Dim outputer() As Double
ReDim outputer(iRows, iCols)
Dim oRows As Long
Dim oCols As Long
Dim i, j As Integer
For i = 0 To UBound(inputer, 1)
   For j = 0 To UBound(inputer, 2)
     inputer(i, j) = (i + 1) * (j + 1)
   Next
Next
Dim str As String
For i = 0 To UBound(inputer, 1)
   For j = 0 To UBound(inputer, 2)
      str = str + "   " + CStr(inputer(i, j))
   Next
   str = str + vbCrLf
Next
MsgBox str, vbOKOnly, "inputer,二维数组的输入"

Call TwoDimensionArrayTest(inputer(0, 0), iRows + 1, iCols + 1, outputer(0, 0), oRows, oCols)

str = ""
'
For i = 0 To UBound(outputer, 1)
   For j = 0 To UBound(outputer, 2)
      str = str + "   " + CStr(outputer(i, j))
   Next
   str = str + vbCrLf
Next
MsgBox str, vbOKOnly, "outputer,二维数组的输出"
End Sub
上面的代码很简单,有兴趣不妨试一下,要注意在vb.net中将long 改成integer,还有 指针要用ByRef


[ 本帖最后由 wjlhc 于 2012-7-8 01:55 编辑 ]
金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

 楼主| 发表于 2012-7-7 23:51 | 显示全部楼层
啥也不说了,上酸(栓)菜!
'遍历窗口句柄并存储在动态数组中(这段前面有过,重复一下)
    Public Function EnumWindowProc(ByVal hWnd As Long, ByVal lParam As Long) As Long
        If BianLiJuBing = 1 Then
            BianLiJuBing = 0
            g_nWndCount = 0
            ReDim MysTitle(g_nWndCount) ' MsgBox("标题" & sTitle)
            ReDim MysClass(g_nWndCount) ' MsgBox("类名" & sClass)
            ReDim Myshwnd(g_nWndCount) 'MsgBox("hWnd" & hWnd)
        Else
            ReDim Preserve MysTitle(g_nWndCount) ' MsgBox("标题" & sTitle)
            ReDim Preserve MysClass(g_nWndCount) ' MsgBox("类名" & sClass)
            ReDim Preserve Myshwnd(g_nWndCount) 'MsgBox("hWnd" & hWnd)
        End If
        MysTitle(g_nWndCount) = Space$(MAX_PATH)
        MysClass(g_nWndCount) = Space$(MAX_PATH)
        Call GetClassName(hWnd, MysClass(g_nWndCount), MAX_PATH)
        Call GetWindowText(hWnd, MysTitle(g_nWndCount), MAX_PATH)
        MysTitle(g_nWndCount) = Strings.Left(RTrim(LTrim(MysTitle(g_nWndCount))), Len(LTrim(RTrim(MysTitle(g_nWndCount)))) - 1)
                    Myshwnd(g_nWndCount) = hWnd
              g_nWndCount = g_nWndCount + 1
        EnumWindowProc = 1
    End Function
Private Sub HuoQuJuBing() '获取句柄子程序(仅供参考)
        Dim i As Integer
        Dim yisheng As String
        yisheng = TextBox11.Text
        TongYongHand = FindWindow(vbNullString, "通用下单")
        TextBox13.Text = TongYongHand
        YiShengHand = FindWindow(vbNullString, yisheng)
        TextBox12.Text = YiShengHand
        If TongYongHand > 0 Then
            ' 开始遍历软件的所有句柄
            Call EnumChildWindows(TongYongHand, AddressOf EnumWindowProc, &H0)
            BianLiJuBing = 1 '当为1时,遍历句柄函数被调用过,再次调用时,要初始化值为0
            '通过遍历出来的句柄标题获取
            For i = 0 To g_nWndCount - 1
                ' MsgBox(MysTitle(i))
                ' MsgBox(i)
                ' MsgBox(Myshwnd(i))
                If i = 0 Then '
                    ZhuiJiaHand = Myshwnd(i)
                    TextBox1.Text = ZhuiJiaHand
                ElseIf i = 2 Then '
                    ZhiYingZhiSunJiaGeHand = Myshwnd(i) '止赢价格
                    TextBox2.Text = ZhiYingZhiSunJiaGeHand
                ElseIf i = 6 Then '
                    WeiTuoShuLiangHand = Myshwnd(i) '委托数量
                    TextBox3.Text = WeiTuoShuLiangHand
                ElseIf i = 7 Then '
                    WeiTuoJiaGeHand = Myshwnd(i) '委托价格
                    TextBox4.Text = WeiTuoJiaGeHand
                ElseIf i = 13 Then '
                    DingDanLeiXingHand = Myshwnd(i) '订单类型
                    TextBox5.Text = DingDanLeiXingHand
                ElseIf i = 15 Then '
                    KaiPingHand = Myshwnd(i) '开平
                    TextBox6.Text = KaiPingHand
                ElseIf i = 16 Then '
                    QingChuHand = Myshwnd(i) '清除
                    TextBox7.Text = QingChuHand
                ElseIf i = 17 Then '
                    MaiMaiHand = Myshwnd(i) '买卖
                    TextBox8.Text = MaiMaiHand
                ElseIf i = 18 Then '
                    HeYueHand = Myshwnd(i) '合约
                    TextBox9.Text = HeYueHand
                ElseIf i = 20 Then '
                    QueDingHand = Myshwnd(i) '确定
                    TextBox10.Text = QueDingHand
                End If
            Next i
        Else
            MsgBox("没有发现通用下单窗口,请打开窗口!")
            Exit Sub
        End If
    End Sub


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '开多
        ' Dim Ctr1, Ctr2, Freq As Decimal
        '  QueryPerformanceFrequency(Freq)
        '  QueryPerformanceCounter(Ctr1)
        PostMessage(MaiMaiHand, WM_KEYDOWN, WM_1, 0)
        PostMessage(MaiMaiHand, WM_KEYUP, WM_1, 0)
        PostMessage(KaiPingHand, WM_KEYDOWN, WM_1, 0)
        PostMessage(KaiPingHand, WM_KEYUP, WM_1, 0)
        SendMessage(WeiTuoShuLiangHand, WM_SETTEXT, 0, CStr(NumericUpDown2.Value)) '发送委托数量
        StrA = CStr(charsA) '给合约字符串申请内存空间
        StrB = CStr(charsB) '给合约品种字符串申请内存空间
        pinzhongDianCha = YiShengHeYueYellowOcr(3414, 526, 3478, 540, StrA, 12, StrB, 6) '识别合约,获取合约和品种点差
        SendMessage(HeYueHand, WM_SETTEXT, 0, Trim(StrA)) '发送合约消息
        If ZhuBeiDongChengJiao = "对价成交" Then
            hangqingMaiChu = YiShengNumberOcr(3458, 617, 3525, 636)
            SendMessage(WeiTuoJiaGeHand, WM_SETTEXT, 0, CStr(hangqingMaiChu + NumericUpDown3.Value * pinzhongDianCha)) '发送按卖价主动买入消息
        ElseIf ZhuBeiDongChengJiao = "挂单成交" Then
            hangqingMaiRu = YiShengNumberOcr(3458, 638, 3525, 655)
            SendMessage(WeiTuoJiaGeHand, WM_SETTEXT, 0, CStr(hangqingMaiRu + NumericUpDown3.Value * pinzhongDianCha)) '发送买价被动买入消息
        End If
        Call PostMessage(QueDingHand, WM_LBUTTONDOWN, 0, 0) '发送消息
        Call PostMessage(QueDingHand, WM_LBUTTONUP, 0, 0) '发送消息
        '  QueryPerformanceCounter(Ctr2)
        '   MsgBox((Ctr2 - Ctr1) / Freq * 1000000 / 1000 & "微妙")
        System.Windows.Forms.Application.DoEvents()
            End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click '平多
        PostMessage(MaiMaiHand, WM_KEYDOWN, WM_3, 0)
        PostMessage(MaiMaiHand, WM_KEYUP, WM_3, 0)
        PostMessage(KaiPingHand, WM_KEYDOWN, WM_3, 0)
        PostMessage(KaiPingHand, WM_KEYUP, WM_3, 0)
        SendMessage(WeiTuoShuLiangHand, WM_SETTEXT, 0, CStr(NumericUpDown2.Value)) '发送委托数量
        StrA = CStr(charsA) '给合约字符串申请内存空间
        StrB = CStr(charsB) '给合约品种字符串申请内存空间
        pinzhongDianCha = YiShengHeYueYellowOcr(3414, 526, 3478, 540, StrA, 12, StrB, 6) '识别合约,获取合约和品种点差
        SendMessage(HeYueHand, WM_SETTEXT, 0, Trim(StrA)) '发送合约消息
        If ZhuBeiDongChengJiao = "对价成交" Then
            hangqingMaiRu = YiShengNumberOcr(3458, 638, 3525, 655)
            SendMessage(WeiTuoJiaGeHand, WM_SETTEXT, 0, CStr(hangqingMaiRu - NumericUpDown3.Value * pinzhongDianCha)) '发送按买价主动平卖消息
        ElseIf ZhuBeiDongChengJiao = "挂单成交" Then
            hangqingMaiChu = YiShengNumberOcr(3458, 617, 3525, 636)
            SendMessage(WeiTuoJiaGeHand, WM_SETTEXT, 0, CStr(hangqingMaiChu - NumericUpDown3.Value * pinzhongDianCha)) '发送按卖价被动平卖消息
        End If
        Call PostMessage(QueDingHand, WM_LBUTTONDOWN, 0, 0) '发送消息
        Call PostMessage(QueDingHand, WM_LBUTTONUP, 0, 0) '发送消息
        System.Windows.Forms.Application.DoEvents()
            End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click '开空
        PostMessage(MaiMaiHand, WM_KEYDOWN, WM_3, 0)
        PostMessage(MaiMaiHand, WM_KEYUP, WM_3, 0)
        PostMessage(KaiPingHand, WM_KEYDOWN, WM_1, 0)
        PostMessage(KaiPingHand, WM_KEYUP, WM_1, 0)

        SendMessage(WeiTuoShuLiangHand, WM_SETTEXT, 0, CStr(NumericUpDown2.Value)) '发送委托数量
        StrA = CStr(charsA) '给合约字符串申请内存空间
        StrB = CStr(charsB) '给合约品种字符串申请内存空间
        pinzhongDianCha = YiShengHeYueYellowOcr(3414, 526, 3478, 540, StrA, 12, StrB, 6) '识别合约,获取合约和品种点差
        SendMessage(HeYueHand, WM_SETTEXT, 0, Trim(StrA)) '发送合约消息
        If ZhuBeiDongChengJiao = "对价成交" Then
            hangqingMaiRu = YiShengNumberOcr(3458, 638, 3525, 655)
            SendMessage(WeiTuoJiaGeHand, WM_SETTEXT, 0, CStr(hangqingMaiRu - NumericUpDown3.Value * pinzhongDianCha)) '发送买价主动卖出消息
        ElseIf ZhuBeiDongChengJiao = "挂单成交" Then
            hangqingMaiChu = YiShengNumberOcr(3458, 617, 3525, 636)
            SendMessage(WeiTuoJiaGeHand, WM_SETTEXT, 0, CStr(hangqingMaiChu - NumericUpDown3.Value * pinzhongDianCha)) '发送按买价被动卖出消息
        End If

        Call PostMessage(QueDingHand, WM_LBUTTONDOWN, 0, 0) '发送消息
        Call PostMessage(QueDingHand, WM_LBUTTONUP, 0, 0) '发送消息
        System.Windows.Forms.Application.DoEvents()
            End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click '平空
        PostMessage(MaiMaiHand, WM_KEYDOWN, WM_1, 0)
        PostMessage(MaiMaiHand, WM_KEYUP, WM_1, 0)
        PostMessage(KaiPingHand, WM_KEYDOWN, WM_3, 0)
        PostMessage(KaiPingHand, WM_KEYUP, WM_3, 0)
        SendMessage(WeiTuoShuLiangHand, WM_SETTEXT, 0, CStr(NumericUpDown2.Value)) '发送委托数量
        StrA = CStr(charsA) '给合约字符串申请内存空间
        StrB = CStr(charsB) '给合约品种字符串申请内存空间
        pinzhongDianCha = YiShengHeYueYellowOcr(3414, 526, 3478, 540, StrA, 12, StrB, 6) '识别合约,获取合约和品种点差
        SendMessage(HeYueHand, WM_SETTEXT, 0, Trim(StrA)) '发送合约消息
        If ZhuBeiDongChengJiao = "对价成交" Then
            hangqingMaiChu = YiShengNumberOcr(3458, 617, 3525, 636)
            SendMessage(WeiTuoJiaGeHand, WM_SETTEXT, 0, CStr(hangqingMaiChu + NumericUpDown3.Value * pinzhongDianCha)) '发送按卖价被动平买消息
        ElseIf ZhuBeiDongChengJiao = "挂单成交" Then
            hangqingMaiRu = YiShengNumberOcr(3458, 638, 3525, 655)
            SendMessage(WeiTuoJiaGeHand, WM_SETTEXT, 0, CStr(hangqingMaiRu + NumericUpDown3.Value * pinzhongDianCha)) '发送按买价主动平买消息
        End If
        Call PostMessage(QueDingHand, WM_LBUTTONDOWN, 0, 0) '发送消息
        Call PostMessage(QueDingHand, WM_LBUTTONUP, 0, 0) '发送消息
        System.Windows.Forms.Application.DoEvents()
           End Sub
金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

 楼主| 发表于 2012-7-8 19:19 | 显示全部楼层
下面GetDIBits在vb.net中的正确声明,lrtn = GetDIBits(hdcMem, hbmp, 0, IHeight, rgboneBits(0), bmi, 0&)可以将颜色放入一个一维数组
Public Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As IntPtr, ByVal hBitmap As IntPtr, ByVal nStartScan As Integer, ByVal nNumScans As Integer, ByVal lpBits As IntPtr, ByRef lpBI As BITMAPINFO, ByVal wUsage As Integer) As Integer
这个网站可以很方便的查到APi函数在vb和.net下的正确声明,有时还会有一些小例子:
http://www.webtropy.com/articles/Win32-API-DllImport-art9.asp
金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

 楼主| 发表于 2012-7-8 19:29 | 显示全部楼层
好了,要点基本上都讲到了,基本就是一些api函数的应用,用熟就行了。
今天宣布彻底完成任务。理解了上面的代码,很容易写出自己需要的软件。
#loveliness#
金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

签到天数: 2 天

发表于 2012-7-17 17:48 | 显示全部楼层
要是二个月以前,这些都是我求知若渴的知识啊,先保存,或许以后有用。非常感谢!!
金币:
奖励:
热心:
注册时间:
2003-4-10

回复 使用道具 举报

发表于 2012-7-17 23:36 | 显示全部楼层
多谢指点。
金币:
奖励:
热心:
注册时间:
2012-7-15

回复 使用道具 举报

签到天数: 2 天

发表于 2014-1-17 16:13 | 显示全部楼层
经典教材。感谢老师的无私奉献。在这里既能学到编程知识,又能看到学以致用的范例,真实太好啦。
金币:
奖励:
热心:
注册时间:
2007-11-10

回复 使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

本站声明:MACD仅提供交流平台,请交流人员遵守法律法规。
值班电话:18209240771   微信:35550268

举报|意见反馈|手机版|MACD俱乐部

GMT+8, 2025-4-9 20:57 , Processed in 0.040740 second(s), 11 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表