精易论坛

标题: 读取内存取通达信股票代码,怎样才可以实现? [打印本页]

作者: moiliom    时间: 2020-7-25 18:29
标题: 读取内存取通达信股票代码,怎样才可以实现?
各位老师,如何通过读取内存取得通达信股票代码?要用到什么其他的API吗?
我自己实在搞不定,又来麻烦大家了

通达信内存基址(不确定我用CE取得的基址是否正确)



读通达信内存-返回不了股票代码数据



通达信联动软件-读取内存源码
通达信联动软件-读取内存源码.zip (242.75 KB, 下载次数: 249)

作者: 龙卷风暴    时间: 2020-7-25 19:10
这个需要定制软件
作者: moiliom    时间: 2020-7-25 19:31
龙卷风暴 发表于 2020-7-25 19:10
这个需要定制软件

我只需要读出股票代码就好,还没到要订制软件
其实还有其他方法可以得到,只是想多学到一些
作者: moiliom    时间: 2020-7-25 19:34
我看到别人写的,但是不大懂

如下:

调用精益模块.类内存  
TDXID = 进程_名取ID (“TdxW.exe”, )
XNC.写字节集 (TDXID, 进制_十六到十 (“0073C2E3”), 字节集_十六进制到字节集 (“9090”))
XNC.写字节集 (TDXID, 进制_十六到十 (“0073C2F2”), 字节集_十六进制到字节集 (“ED10”))  ' 分时技术切换 33299的16进制8213反位
' 全撤-5353-E914 单撤-5350-E614 撤买-5351-E714 撤卖-5352-E814 闪买-5091-E313 闪卖-5111-F713 多买-5432-3815 多卖-5452-4C15 分价表-4333-ED10
程序_延时 (500)
鼠标_按键 ()
程序_延时 (200)
XNC.写字节集 (TDXID, 进制_十六到十 (“0073C2E3”), 字节集_十六进制到字节集 (“7522”))
XNC.写字节集 (TDXID, 进制_十六到十 (“0073C2F2”), 字节集_十六进制到字节集 (“2F23”))

结束 ()
作者: 萌新菜鸟    时间: 2020-7-25 19:37
扫指针就行了。
作者: moiliom    时间: 2020-7-25 19:38
萌新菜鸟 发表于 2020-7-25 19:37
扫指针就行了。

具体怎么弄啊老师?
作者: moiliom    时间: 2020-7-25 19:39
别人的代码:

_读字节集内存 (操作句柄, 十六到十 (“内存地址”), 临时字节集, 4, 0)

TDXID = 进程_名取ID (“TdxW.exe”, )
XNC.读字节集 (TDXID, 进制_十六到十 (“内存地址”), xxxxxxx)

作者: lyj9b    时间: 2020-7-25 19:48
试着改变股票代码切换到其他股票代码,在搜一下看看基址是否改变如果改变说明基址是错的,这是测试基址其中一种方法==
作者: moiliom    时间: 2020-7-25 19:50
lyj9b 发表于 2020-7-25 19:48
试着改变股票代码切换到其他股票代码,在搜一下看看基址是否改变如果改变说明基址是错的,这是测试基址其中 ...

试过了,基址好像没有问题,主要我觉得我可能代码写的不对
作者: lyj9b    时间: 2020-7-25 20:52
  
子程序名返回值类型公开备 注
_读字节集内存 
变量名类 型静态数组备 注
XNC类_内存 
股票代码_字节集字节集 
进程ID整数型 
基址整数型 
一级偏移整数型 
二级偏移整数型 
' 用精易模块乱写的
进程ID = 进程_名取ID (“通达信金融终端通赢版V7.49”到文本 (“TdxW_MainFrame_Class”))
' NtReadVirtualMemory (TDX_窗口句柄, 进制_十六到十 (“0016DDB8”), 股票代码_字节集, 4, 0)
' 二级内存地址(十六进制):0016DDB8
' 一级内存地址(十六进制)[0016DD70]+OC
基址 = 内存.读整数 (进程ID, 进制_十六到十 (“0016DDB8”))
一级偏移 = 内存.读整数 (进程ID, 基址 + 进制_十六到十 (“0016DD70”“0C”))  ' 一级偏移 = 内存.读整数 (进程ID, 基址 + 进制_十六到十 (“0016DD70”+"0C"))
' 一级偏移 = 内存.读整数 (进程ID, 一级偏移 + 进制_十六到十 (“OC”))
二级偏移 = 内存.读整数 (进程ID, 一级偏移 + 进制_十六到十 (“0016DDB8”))
股票代码_字节集 = 到字节集 (内存.读整数 (进程ID, 二级偏移 + 进制_十六到十 (“0018C3E4”)))
编辑框1.内容 = 字节集_到文本 (股票代码_字节集)




作者: moiliom    时间: 2020-7-25 21:05
lyj9b 发表于 2020-7-25 20:52
[e=0].版本 2

.子程序 _读字节集内存, , 公开

测试过了吗?我先看看,真心感谢啊
作者: moiliom    时间: 2020-7-25 21:11
lyj9b 发表于 2020-7-25 20:52
[e=0].版本 2

.子程序 _读字节集内存, , 公开

好像不行哦,谢谢老师了,我是纯小白
作者: moiliom    时间: 2020-7-26 15:19
看来只能自己结贴了?
作者: moiliom    时间: 2020-7-26 21:02
看来只能自己结贴了?我自己关了
作者: moiliom    时间: 2020-7-26 21:06
lyj9b 发表于 2020-7-25 20:52
[e=0].版本 2

.子程序 _读字节集内存, , 公开

我已经搞出来了
作者: 小小侠    时间: 2020-7-26 22:58
楼主解决了没有,解决了求分享代码
作者: moiliom    时间: 2020-7-27 00:08
小小侠 发表于 2020-7-26 22:58
楼主解决了没有,解决了求分享代码

自己解决了,其实很简单
作者: moiliom    时间: 2020-7-27 00:12
小小侠 发表于 2020-7-26 22:58
楼主解决了没有,解决了求分享代码

用精易模块就好了,等下我发出来
作者: moiliom    时间: 2020-7-27 00:13
自己结贴源码
  
窗口程序集名保 留  保 留备 注
程序集1   
变量名类 型数组备 注
TDX_句柄整数型  
TDX_ID整数型  

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
TDX_句柄 = 进程_名取句柄 (“TdxW.exe”)
TDX_ID = 进程_名取id (“TdxW.exe”, )
时钟1.时钟周期 = 10
子程序名返回值类型公开备 注
_时钟1_周期事件  
_读字节集内存 ()
子程序名返回值类型公开备 注
_读字节集内存  
变量名类 型静态数组备 注
XNC类_内存精易模块
股票代码_字节集字节集 
' 二级内存地址(十六进制):0016DDB8
' 一级内存地址(十六进制)[0016DD70]+OC
股票代码_字节集 = XNC.读字节集 (TDX_ID, 进制_十六到十 (“0016DDB8”), 4)
编辑框1.内容 = 到文本 (取字节集数据 (股票代码_字节集, 4, ))


i支持库列表   支持库注释   
ncdx98(未知支持库)

作者: 小小侠    时间: 2020-7-27 08:51
moiliom 发表于 2020-7-27 00:13
自己结贴源码
[e=3].版本 2
.支持库 ncdx98

支持任何版本通达信吗?
作者: moiliom    时间: 2020-7-27 12:17
小小侠 发表于 2020-7-27 08:51
支持任何版本通达信吗?

不同版本基址都可能不一样啊,我这个是通达信金融终端同赢版V7.49,你可以用精易编程助手查一下通达信窗口名和类名,用CE查基址
作者: moiliom    时间: 2020-7-27 12:18
小小侠 发表于 2020-7-27 08:51
支持任何版本通达信吗?

基址得自己用CE查的,不同版本不一样的
作者: 小小侠    时间: 2020-7-27 15:07
moiliom 发表于 2020-7-27 12:18
基址得自己用CE查的,不同版本不一样的

能分享一下源码吗
作者: moiliom    时间: 2020-7-27 15:29
小小侠 发表于 2020-7-27 15:07
能分享一下源码吗

已经发出来了啊,你是说基址吗?这个是用软件CE(Cheat Engine)查就可以了,最新版本是7.0好像,BAIDU很容易搜索到的
作者: 小小侠    时间: 2020-7-27 16:00
moiliom 发表于 2020-7-27 15:29
已经发出来了啊,你是说基址吗?这个是用软件CE(Cheat Engine)查就可以了,最新版本是7.0好像,BAIDU很 ...

还不懂,学习学习
作者: moiliom    时间: 2020-7-27 22:26
发两个CE教程给你看,我也是在这里学的

https://www.bilibili.com/video/BV1a7411F7jb/?spm_id_from=333.788.videocard.8
https://www.bilibili.com/video/BV1DE41157GN/?spm_id_from=333.788.videocard.2

CE-手动追踪内存基址


CE-自动扫描内存基址



作者: haoyunlai    时间: 2020-7-29 16:17
就几步,很简单的

1.CE加载通达信的进程
2.选择字符串,输入股票代码,点搜索
3.出来的绿色地址就是,双点加到下面
4.点击下面的框里就级看到地址 及里面的基地址与偏移了
之后就是写代码读这个地址的文件就可以了



作者: haoyunlai    时间: 2020-7-29 16:19
moiliom 发表于 2020-7-25 19:31
我只需要读出股票代码就好,还没到要订制软件
其实还有其他方法可以得到,只是想多学到一些

看图上发的步骤图就可以啦
作者: moiliom    时间: 2020-7-30 00:40
haoyunlai 发表于 2020-7-29 16:19
看图上发的步骤图就可以啦

我已经会了,谢谢老师,不过绿色的不一定对哦,我有一个办法很容易能找到唯一的那个基址
作者: haoyunlai    时间: 2020-7-30 07:27
会了就行,通达信取代码,N多种方法的。这种方法是指定版本的,还有可以做到适应所有版本的
作者: 小小侠    时间: 2020-8-2 23:14
好贴!!!!!
作者: 小小侠    时间: 2020-8-2 23:31
能否分享一下内存模块?
作者: helloxy    时间: 2020-8-27 08:49
看各位大神聊天是种享受,我要多学习
作者: helloxy    时间: 2020-8-27 08:50
moiliom 发表于 2020-7-25 19:34
我看到别人写的,但是不大懂

如下:

请问楼主,能说一下您的思路吗
作者: jjdd2    时间: 2020-10-5 03:34
haoyunlai 发表于 2020-7-29 16:17
就几步,很简单的

1.CE加载通达信的进程

大佬  能仔细再讲讲吗  我不太明白
作者: jjdd2    时间: 2020-10-5 03:35
haoyunlai 发表于 2020-7-29 16:17
就几步,很简单的

1.CE加载通达信的进程

我的软件好像和你一样   你能告诉我  代码基址是多少啊
作者: jjdd2    时间: 2020-10-5 09:27
大佬  非常谢谢你
作者: woaini12351    时间: 2020-10-8 15:01
搞定没  没搞定我帮你搞
作者: BBC_Chan    时间: 2020-11-7 11:03
haoyunlai 发表于 2020-7-29 16:19
看图上发的步骤图就可以啦

哥们,VB怎么写代码啊……这易语言全是中文看不懂
作者: BBC_Chan    时间: 2020-11-7 11:03
moiliom 发表于 2020-7-30 00:40
我已经会了,谢谢老师,不过绿色的不一定对哦,我有一个办法很容易能找到唯一的那个基址 ...

哥们,VB怎么写代码啊……这易语言全是中文看不懂
作者: atzhfy    时间: 2020-11-7 18:09
C:\Users\Administrator\Desktop\大智慧截图.png
借楼问个问题呗,我自己写的帖子让版本给删除了,说我违规,哪里违规了也没告诉我,我也没找到违规的地方,我要问的和这个问题差不多,不是是大智慧的行情报价这里我想要,正常使用的时候  点哪个股票   就能取到哪个股票的代码,只是这个页面,真心不知道怎么做到,我在看视频想要学习一下,也找不到能靠点边的教程。
作者: atzhfy    时间: 2020-11-7 18:10
借楼问个问题呗,我自己写的帖子让版本给删除了,说我违规,哪里违规了也没告诉我,我也没找到违规的地方,我要问的和这个问题差不多,不是是大智慧的行情报价这里我想要,正常使用的时候  点哪个股票   就能取到哪个股票的代码,只是这个页面,真心不知道怎么做到,我在看视频想要学习一下,也找不到能靠点边的教程。

大智慧截图.png (61.82 KB, 下载次数: 0)

大智慧截图.png

作者: atzhfy    时间: 2020-11-7 18:11
atzhfy 发表于 2020-11-7 18:10
借楼问个问题呗,我自己写的帖子让版本给删除了,说我违规,哪里违规了也没告诉我,我也没找到违规的地方, ...

我就想在这里能取到股票代码而已,那版主说我违规。
作者: kings12333    时间: 2020-12-27 11:14
moiliom 发表于 2020-7-30 00:40
我已经会了,谢谢老师,不过绿色的不一定对哦,我有一个办法很容易能找到唯一的那个基址 ...

建议用图文来一步步介绍你用CE如何找到通达信内存的基址的,以及基址如何表达
作者: wd4507    时间: 2020-12-28 20:03
楼主的CE能查看是什么访问了这个地址吗,会不会闪退,发出来用下看看
作者: wd4507    时间: 2021-2-14 11:06
楼主能上传下CE工具吗 我的附加就闪退
作者: mazhengyu    时间: 2021-5-16 11:00
不错的东西啊 学习
作者: wd4507    时间: 2021-8-13 07:31
同志 能否把你的CE打包下 发出来下 我的闪退
作者: ilovegenny    时间: 2021-9-11 09:32
moiliom 发表于 2020-7-30 00:40
我已经会了,谢谢老师,不过绿色的不一定对哦,我有一个办法很容易能找到唯一的那个基址 ...

教一下啊,说说如何找到“找到唯一的那个基址”
作者: viaboot    时间: 2021-10-8 11:23
谢谢 终于知道了
作者: kang833    时间: 2021-10-27 12:49
基址每次更新会变的
作者: k6t8cc2c    时间: 2021-11-5 11:53
我也正在研究股票
作者: lydc    时间: 2021-11-24 23:36
_读字节集内存 (操作句柄, 十六到十 (“内存地址”), 临时字节集, 4, 0)

TDXID = 进程_名取ID (“TdxW.exe”, )
XNC.读字节集 (TDXID, 进制_十六到十 (“内存地址”), xxxxxxx)
作者: chouchong06    时间: 2021-12-26 01:31
haoyunlai 发表于 2020-7-30 07:27
会了就行,通达信取代码,N多种方法的。这种方法是指定版本的,还有可以做到适应所有版本的 ...

向老师求教 如何做到适应所有的版本?
作者: chouchong06    时间: 2021-12-27 17:53
moiliom 发表于 2020-7-30 00:40
我已经会了,谢谢老师,不过绿色的不一定对哦,我有一个办法很容易能找到唯一的那个基址 ...

求教 很容易能找到唯一的那个基址 的方法 万分感谢
作者: sun2258    时间: 2022-1-1 12:00
牛牛牛牛牛牛牛牛牛牛牛牛牛牛牛牛
作者: sun2258    时间: 2022-1-1 12:02
lyj9b 发表于 2020-7-25 20:52
[e=0].版本 2

.子程序 _读字节集内存, , 公开

牛牛牛牛牛牛牛牛牛牛牛牛
作者: zzh233    时间: 2022-1-1 12:08
东方财富不都有免费的数据吗
作者: zy988    时间: 2022-1-6 19:54
不同的版本 基址不一样。怎么解决呢
作者: mr1998    时间: 2022-1-25 12:03
有通用取码方法的
作者: roor    时间: 2022-2-2 13:28
后排围观,不错,支持卤煮


                                        藏起来的小尾巴,不让你看!  
作者: roor    时间: 2022-2-2 16:08
留名,看帖必回帖


                                        藏起来的小尾巴,不让你看!  
作者: 寻赚钱项目    时间: 2022-2-11 00:15
zzh233 发表于 2022-1-1 12:08
东方财富不都有免费的数据吗

有介绍资料、网址之类的吗? 我想看下,谢谢
作者: jackylu123    时间: 2022-5-30 00:04
moiliom 发表于 2020-7-30 00:40
我已经会了,谢谢老师,不过绿色的不一定对哦,我有一个办法很容易能找到唯一的那个基址 ...

请教,如何容易地找到唯一的jz?
作者: dlx007    时间: 2022-6-30 18:28
楼主好:有人用这种方法获得同花顺的正在显示的股票代码吗?
作者: 神武灰太狼    时间: 2022-7-6 10:40
认真学习易语言,提高易语言水平
作者: Gosling    时间: 2022-7-29 00:21
这个是好东西,感谢分享
作者: Gosling    时间: 2022-7-29 00:21
这个是好东西,感谢分享
作者: 顺势者    时间: 2023-1-24 12:15
看到楼主的帖子受到启发,把代码改进了下,发出来给需要的人,内存读写一定要初始化........这几天做个所有常用通达信版本通用的联动软件,有兴趣的加我群835195742,一起玩这个山头被我们拿下了
.版本 2
.支持库 ncdx98

.子程序 __启动窗口_创建完毕

TDX_句柄 = 进程_名取句柄 (“TdxW.exe”)
TDX_ID = 取进程ID (“TdxW.exe”)
内存读写_初始化 (, )
时钟1.时钟周期 = 10

.子程序 _时钟1_周期事件

' /***
' * 这里是注释,这里敲回车,自动将下方增加一个注释行
' ***/
_读字节集内存 ()

.子程序 _读字节集内存, 文本型
.局部变量 股票代码_字节集, 字节集
.局部变量 股票代码_文本, 文本型

.循环判断首 ()
    股票代码_字节集 = 内存读写_读字节集 (TDX_ID, 进制_十六到十 (“*********”), 4, )
    股票代码_文本 = 到文本 (取字节集数据 (股票代码_字节集, 4, ))
    .如果真 (文本_取长度 (股票代码_文本) > 0 且 文本_取长度 (股票代码_文本) < 6)
        .如果 (文本_取长度 (股票代码_文本) = 5)
            股票代码_文本 = “0” + 股票代码_文本
        .否则
            .如果 (文本_取长度 (股票代码_文本) = 4)
                股票代码_文本 = “00” + 股票代码_文本
            .否则
                .如果 (文本_取长度 (股票代码_文本) = 3)
                    股票代码_文本 = “000” + 股票代码_文本
                .否则
                    .如果 (文本_取长度 (股票代码_文本) = 2)
                        股票代码_文本 = “0000” + 股票代码_文本
                    .否则
                        .如果 (文本_取长度 (股票代码_文本) = 1)
                            股票代码_文本 = “00000” + 股票代码_文本
                        .否则

                        .如果结束

                    .如果结束

                .如果结束

            .如果结束

        .如果结束

    .如果真结束

.循环判断尾 (文本_取长度 (股票代码_文本) ≠ 6)
标签2.标题 = 股票代码_文本
返回 (到文本 (取字节集数据 (股票代码_字节集, 4, )))

作者: roor    时间: 2023-7-27 01:31

作者: roor    时间: 2023-7-27 01:48

作者: 张升    时间: 2023-8-21 17:27
学习一下下

作者: 前行易语言    时间: 2023-8-22 08:22
谢谢楼主的分享..
作者: 张升    时间: 2023-8-28 21:33
教一下啊,说说如何找到
作者: jangel1    时间: 2023-9-13 03:07
SendWessageA (TDK_ 窗口句柄, 273. 33780. 0)。请问下这个33780是怎么获取的(你的其他帖子关闭了无法回复)
作者: wolfpack    时间: 2023-11-19 19:08

作者: haoyunlai    时间: 2024-7-14 21:11
jangel1 发表于 2023-9-13 03:07
SendWessageA (TDK_ 窗口句柄, 273. 33780. 0)。请问下这个33780是怎么获取的(你的其他帖子关闭了无法回 ...

复制按钮的标识
作者: etec    时间: 2024-8-19 02:55
jangel1 发表于 2023-9-13 03:07
SendWessageA (TDK_ 窗口句柄, 273. 33780. 0)。请问下这个33780是怎么获取的(你的其他帖子关闭了无法回 ...

通过资源查看器Restorator对TDXW.EXE进行“Alt+C”的查找,找到后所对应的键值数字33780(版本不同,数值可能不同)
作者: etec    时间: 2024-8-19 03:03
股票代码_字节集 = XNC.读字节集 (进程ID, 进制_十六到十 (“0014BFE0”), )无论怎么改结果都是0,读不到股票代码,卡在这里了。jz没有问题,有在其他程序上就可读出股票代码。能帮助分析原因吗。谢谢
作者: etec    时间: 2024-8-24 15:16
etec 发表于 2024-8-19 03:03
股票代码_字节集 = XNC.读字节集 (进程ID, 进制_十六到十 (“0014BFE0”), )无论怎么改结果都是0,读不到 ...

全部搞透了,通透。
作者: gusong125    时间: 2024-8-24 16:19
感谢大佬分享
作者: ppppzj    时间: 2024-12-24 22:24
通达信还有一种更简单的方式去获得 股票代码
发送消息整数 (通达信句柄, 273, 33780, 0)——本条是获得老版本的
发送消息整数 (通达信句柄, 273, 33819, 0)——本条是获得新版本的
用完上面一条后,可以理解为是复制了当前可视状态的“股票代码+空格+股票名称“,再用下面一条。返回的文本内容是“000019 深粮控股”的字符串,再选择前6位即可。
返回文本 = 剪辑板_取文本 ()
这种方式可以理解为执行了通达信在空白处点击右键→菜单中的“标记当前品种”→“复制到剪切板”这个命令。



作者: ppppzj    时间: 2024-12-24 23:50
jangel1 发表于 2023-9-13 03:07
SendWessageA (TDK_ 窗口句柄, 273. 33780. 0)。请问下这个33780是怎么获取的(你的其他帖子关闭了无法回 ...

;AHK v1.0 x64/x32 compatible update by jeeswg of:
;Get Info from Context Menu - Scripts and Functions - AutoHotkey Community
;https://autohotkey.com/board/topic/19754-get-info-from-context-menu/

;
; AutoHotkey Version: 1.x
; Language:       English
; Platform:       Win9x/NT
; Author:         micha
;
; Script Function:
;        Demonstrates how to retrieve infos from a context/ popup menu
;

/*
This is the struct we are using.
typedef struct tagMENUITEMINFO {
        UINT    cbSize;
        UINT    fMask;
        UINT    fType;
        UINT    fState;
        UINT    wID;
        HMENU   hSubMenu;
        HBITMAP hbmpChecked;
        HBITMAP hbmpUnchecked;
        ULONG_PTR dwItemData;
        LPTSTR  dwTypeData;
        UINT    cch;
        HBITMAP hbmpItem;
} MENUITEMINFO, *LPMENUITEMINFO;

*/
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
#Persistent
RunAsAdmin()
SetTimer, Demo, 500
return
Demo:
;constants
MFS_ENABLED = 0
MFS_CHECKED = 8
MFS_DEFAULT = 0x1000
MFS_DISABLED = 2
MFS_GRAYED = 1
MFS_HILITE = 0x80
;MFS_UNCHECKED = 0
;MFS_UNHILITE = 0
;Get mouse position and handle to wnd under the mouse cursor
MouseGetPos, MouseScreenX, MouseScreenY, MouseWindowUID, MouseControlID
WinGet,ControlHwnd, ID,ahk_id %MouseWindowUID%
;Get count of menu items
ContextMenCnt := GetContextMenuCount(ControlHwnd)
if ContextMenCnt < 1
{
        Tooltip,
        return
}
TooltipText =
;Read info for each menu item
loop, %ContextMenCnt%
{
        IsEnabled := GetContextMenuState(ControlHwnd, a_index-1)
        {
                CurrentText =
                ;~ if IsEnabled = 0
                ;~ CurrentText = %CurrentText% Enabled
                ;~ if (IsEnabled & MFS_CHECKED)
                ;~ CurrentText = %CurrentText% Checked
                ;~ if (IsEnabled & MFS_DEFAULT)
                ;~ CurrentText = %CurrentText% Default
                ;~ if (IsEnabled & MFS_DISABLED)
                ;~ CurrentText = %CurrentText% Disabled
                ;~ if (IsEnabled & MFS_GRAYED)
                ;~ CurrentText = %CurrentText% Grayed
                ;~ if (IsEnabled & MFS_HILITE)
                ;~ CurrentText = %CurrentText% Highlight
                ;~ TooltipText = %TooltipText%%a_index%:%CurrentText%`n
                if (IsEnabled & MFS_HILITE)
        {
                CurrentText := GetContextMenuID(ControlHwnd, a_index-1) . A_Tab . GetContextMenuText(ControlHwnd, a_index-1)
        TooltipText := CurrentText   
                }
        }
}
;~ TextText =
;~ loop, %ContextMenCnt%
;~ {
        ;~ StrSize := GetContextMenuText(ControlHwnd, a_index-1)
        ;~ nID := GetContextMenuID(ControlHwnd, a_index-1)
        ;~ TextText = %TextText%%a_index%:%StrSize%-ID=%nID%`n
;~ }
CoordMode, Tooltip, Screen
Tooltip, %TooltipText%---`n%TextText%, 0, 0
return
/***************************************************************
* returns the count of menu items
***************************************************************
*/
GetContextMenuCount(hWnd)
{
        WinGetClass, WindowClass, ahk_id %hWnd%
        ;All popups should have the window class #32768
        if WindowClass <> #32768
        {
                return 0
        }
        ; Retrieve menu handle from window
        SendMessage, 0x01E1, , , , ahk_id %hWnd%
        ;Errorlevel is set by SendMessage. It contains the handle to the menu
        hMenu := errorlevel
        menuitemcount:=DllCall("GetMenuItemCount", Ptr,hMenu)
        Return, menuitemcount
}
/***************************************************************
* returns the state of a menu entry
***************************************************************
*/
GetContextMenuState(hWnd, Position)
{
        WinGetClass, WindowClass, ahk_id %hWnd%
        if WindowClass <> #32768
        {
                return -1
        }
        SendMessage, 0x01E1, , , , ahk_id %hWnd%
        ;Errorlevel is set by SendMessage. It contains the handle to the menu
        hMenu := errorlevel
        ;We need to allocate a struct
        VarSetCapacity(MenuItemInfo, 60, 0)
        ;Set Size of Struct to the first member
        NumPut(A_PtrSize=8?80:48, MenuItemInfo, 0, "UInt")
        ;Get only Flags from dllcall GetMenuItemInfo MIIM_TYPE = 1
        NumPut(1, MenuItemInfo, 4, "UInt")
        ;GetMenuItemInfo: Handle to Menu, Index of Position, 0=Menu identifier / 1=Index
        InfoRes := DllCall("user32.dll\GetMenuItemInfo", Ptr,hMenu, UInt,Position, Int,1, Ptr,&MenuItemInfo)
        InfoResError := errorlevel
        LastErrorRes := DllCall("GetLastError", UInt)
        if InfoResError <> 0
        return -1
        if LastErrorRes != 0
        return -1
        ;Get Flag from struct
        GetMenuItemInfoRes := NumGet(MenuItemInfo, 12, "UInt")
        /*
        IsEnabled = 1
        if GetMenuItemInfoRes > 0
        IsEnabled = 0
        return IsEnabled
        */
        return GetMenuItemInfoRes
}
/***************************************************************
* returns the ID of a menu entry
***************************************************************
*/
GetContextMenuID(hWnd, Position)
{
        WinGetClass, WindowClass, ahk_id %hWnd%
        if WindowClass <> #32768
        {
                return -1
        }
        SendMessage, 0x01E1, , , , ahk_id %hWnd%
        ;Errorlevel is set by SendMessage. It contains the handle to the menu
        hMenu := errorlevel
        ;UINT GetMenuItemID(          HMENU hMenu,    int nPos);
        InfoRes := DllCall("user32.dll\GetMenuItemID", Ptr,hMenu, Int,Position, UInt)
        InfoResError := errorlevel
        LastErrorRes := DllCall("GetLastError", UInt)
        if InfoResError <> 0
        return -1
        if LastErrorRes != 0
        return -1
        return InfoRes
}
/***************************************************************
* returns the text of a menu entry (standard windows context menus only!!!)
***************************************************************
*/
GetContextMenuText(hWnd, Position)
{
        WinGetClass, WindowClass, ahk_id %hWnd%
        if WindowClass <> #32768
        {
                return -1
        }
        SendMessage, 0x01E1, , , , ahk_id %hWnd%
        ;Errorlevel is set by SendMessage. It contains the handle to the menu
        hMenu := errorlevel
        ;We need to allocate a struct
        VarSetCapacity(MenuItemInfo, 200, 0)
        ;Set Size of Struct (48) to the first member
        NumPut(A_PtrSize=8?80:48, MenuItemInfo, 0, "UInt")
        ;Retrieve string MIIM_STRING = 0x40 = 64 (/ MIIM_TYPE = 0x10 = 16)
        NumPut(64, MenuItemInfo, 4, "UInt")
        ;Set type - Get only size of string we need to allocate
        ;NumPut(0, MenuItemInfo, 8, "UInt")
        ;GetMenuItemInfo: Handle to Menu, Index of Position, 0=Menu identifier / 1=Index
        InfoRes := DllCall("user32.dll\GetMenuItemInfo", Ptr,hMenu, UInt,Position, Int,1, Ptr,&MenuItemInfo)
        if InfoRes = 0
        return -1
        InfoResError := errorlevel
        LastErrorRes := DllCall("GetLastError", UInt)
        if InfoResError <> 0
        return -1
        if LastErrorRes <> 0
        return -1
        ;Get size of string from struct
        GetMenuItemInfoRes := NumGet(MenuItemInfo, A_PtrSize=8?64:40, "UInt")
        ;If menu is empty return
        If GetMenuItemInfoRes = 0
        return "{Empty String}"
        ;+1 should be enough, we'll use 2
        GetMenuItemInfoRes += 2
        ;Set capacity of string that will be filled by windows
        VarSetCapacity(PopupText, GetMenuItemInfoRes, 0)
        ;Set Size plus 0 terminator + security ;-)
        NumPut(GetMenuItemInfoRes, MenuItemInfo, A_PtrSize=8?64:40, "UInt")
        NumPut(&PopupText, MenuItemInfo, A_PtrSize=8?56:36, "Ptr")
        InfoRes := DllCall("user32.dll\GetMenuItemInfo", Ptr,hMenu, UInt,Position, Int,1, Ptr,&MenuItemInfo)
        if InfoRes = 0
        return -1
        InfoResError := errorlevel
        LastErrorRes := DllCall("GetLastError", UInt)
        if InfoResError <> 0
        return -1
        if LastErrorRes <> 0
        return -1
        return PopupText
}
;PrintScreen::reload
RunAsAdmin() {
        full_command_line := DllCall("GetCommandLine", "str")
        if not (A_IsAdmin or RegExMatch(full_command_line, " /restart(?!\S)"))
        {
                try
                {
                        if A_IsCompiled
                                Run *RunAs "%A_ScriptFullPath%" /restart
                        else
                                Run *RunAs "%A_AhkPath%" /restart "%A_ScriptFullPath%"
                }
                ExitApp
        }
}


以上代码复制到txt,改后缀成ahk,安装autohotkey1.X版本的,2.0版本有问题,安装后,直接运行这个txt改后的ahk文件即可,这样右键点击任何位置的时候,左上角就会出现一个小框,鼠标移动到哪,左上角的代码就会跟着改变。
作者: p4061126    时间: 2025-1-25 11:55
sdfssssssffffff
作者: FAFA08    时间: 2025-2-10 15:59
干嘛去读内存获取数据,那么多数据,很麻烦哦,TDX安装目录有数据文件,直接调用可获取实时数据
作者: asdznl001    时间: 2025-5-12 18:30
回复很重要




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4