TC官方合作论坛

标题: 限制鼠标移动 tc调用带结构体(自定义数据类型)的winapi [打印本页]

作者: rainshine    时间: 2014-8-17 11:54
标题: 限制鼠标移动 tc调用带结构体(自定义数据类型)的winapi
本帖最后由 rainshine 于 2014-8-17 11:56 编辑

这次的源码是限制鼠标在一个矩形范围内移动,参数是一个结构体指针。http://www.c2014.cc,www.rblog.cc,欢迎。
那么tc怎么搞定这个结构体呢?其实只要懂得结构体内存对齐之后 其他的就是分配内存和写内存就行了、
我尽量说得像人话哈。------建议你有点c/c++基础再看。
一个结构体狭义地说就是几个变量凑在一块,比如呢个RECT structure,在msdn的解释是这样滴,http://msdn.microsoft.com/en-us/library/dd162897(VS.85).aspx。可以看到他的原型是
typedef struct _RECT {  LONG left;  LONG top;  LONG right;  LONG bottom;} RECT, *PRECT;
那么这个结构体在内存中就体现为4个4字节(long算4bytes)变量,连着的哦。也就是说,我们调用api的时候让你传进去一个结构体的指针,那么这个指针指向的内存区域应该有4*4一共16个字节,首四字节存放的是left成员变量的值,第二个四字节存放的就是top的值,第三个四字节存放的就是right,最后四个字节存放的是bottom(中文:底)。这是个比较简单的结构体,成员类型都一样,无需考虑对齐的问题,那么复杂点的结构体默认如何对齐呢,可以参考如下三个原则(ps:sizeof(结构体类型)函数可以直接得到其总大小):
•原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
•原则2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)
•原则3、收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

==so,那么我们只需要在内存里模拟出来这个结构体就完事了。分配16字节的内存,然后分别偏移0,4,8,12,写4字节整型变量即可。这就需要用到分配内存、写内存的函数,分配先不说了,globalalloc(0,dwsize),globalfree(hMem)可以很方便地分配内存(ps:对于巨大量的数据不推荐使用此函数分配【固定】内存)。
那么写内存怎么办呢。tcapi木有,难道要用插件么!不,这不是rain的风格0.0。那么找到写内存的winapi,WriteProcessMemory,msdn:http://msdn.microsoft.com/en-us/library/aa909195.aspx
我们可以看到他的函数原型,我一个一个解释参数。
hProcess,int,进程句柄,自己的进程写-1。
lpBaseAddress,int,要写入的内存区域首地址,globalalloc(0,size)返回值。
lpBuffer,int,待写入的数据【指针】,nSize,int,要写入多长。
lpNumberOfBytesWritten,int,指针,返回实际写入的字节数,可NULL忽略。
现在问题来了,待写入的数据要传进去指针,但是tc不支持传整型的地址。肿么办呢,解决方案总是有的。不支持整型,支持字符串吧!那咱们就用字符串实现。先解释一下,不管什么类型,在内存里都是一位一位,一个字节一个字节地存储。所以咱们只需要自己制造一个神奇的字符串,让它在内存中存储的每个字节跟我们需要的整型数是一样的不就得了!然后dllcall writeprocessmem,lpBuffer类型写char *或者wchar *,这样就能让lpBuffer传进去字符串的首地址(指针)!那么函数就会把字符串写进去,实际上写的是我们需要的整型数。
这里还有一点需要注意的是,tc的dllcall在传字符串指针的时候,支持把字符串转成ANSI或UNICODE两种编码方式。ANSI在内存中,每个字符占一个字节,而UNICODE每个字符占2个字节。所以unicode写一个字符实际上是占两个字节的。一个字符就能顶两个字节,so,我选择用unicode,比ansi用更少的代码实现同样的操作。好了,现在就剩下一个问题,如何拼凑这个神奇的字符串,我结合源码解释。
function write4byte2(lpBuffer,iData)
    hiword=type.int(iData/65536)
    loword=iData%65536
    temp.WriteProcessMemoryW(-1,lpBuffer,str.format("%c%c",loword,hiword),4)
endfunction
这里我把一个int看作dword型,然后把它的hiword(高16位),loword(低16位)取出来。因为每个word在内存中就是占2个字节的大小,正好符合unicode一个字符的大小。所以我们分别把hiword和loword格式化成一个unicode字符,然后拼成一个字符串,这就ok啦。这个字符串在内存中就体现为4个字节的一块小区域,以int方式都出来就是我们刚写入的整型数。
接着,调用writeprocessmem函数,lpBuffer类型为:wchar *,数据就是那个格式化完的字符串。
终于差不多讲完了0.0,我感觉我的世界观要崩溃了,这些概念乱七八糟的都很难理解,特别是很难表达出来,而且还要表达的让地球人能看懂。。。
==
那么,知道了如何写到内存一个整型数据,现在把四个整型数据连着写,做成一个结构体的样子。然后传给windowsapi函数,参数就写上这四个整形数据的首地址……搞定。。
说了这么多理论神马的,我觉得还是看看源码、结合源码学习比较容易理解。好的那么源码时间到!!!啦啦啦。另外。。我再插句话,这里边还有个方法写int,一个字节一个字节地填充,有兴趣的可以研究一下。我就不解释了。获取其他【本源码】信息请移步:http://rblog.cc/archives/987
小广告:http://www.c2014.cc,www.rblog.cc,期待您的访问。
看在我花了一上午的时间弄这个源码,和纯手打这么些字,,神(da)啊(jia)给我点回复吧,神(da)啊(jia)给我点金币威望吧!
链接: http://pan.baidu.com/s/1i3vGrYX 密码:




作者: jimye0526    时间: 2014-8-17 12:30
不明觉厉
作者: YGV    时间: 2014-8-17 12:33
这个支持是必须的
作者: dear    时间: 2014-8-17 12:56

作者: 如此美丽。    时间: 2014-8-17 13:02
..  你猜我把这些字看完了么
作者: 千叶de悠一    时间: 2014-8-17 15:59
还能再详细点
不懂得在怎么解释也还是不懂
作者: rainshine    时间: 2014-8-17 16:21
如此美丽。 发表于 2014-8-17 13:02
..  你猜我把这些字看完了么

肯定没。估计看完标题就知道怎么实现的了。
作者: rainshine    时间: 2014-8-17 16:21
如此美丽。 发表于 2014-8-17 13:02
..  你猜我把这些字看完了么

我觉得我说的,,,,,很像人话了 5555,美丽姐要不你发个贴帮我解释下吧……
作者: 如此美丽。    时间: 2014-8-17 16:33
rainshine 发表于 2014-8-17 16:21
我觉得我说的,,,,,很像人话了 5555,美丽姐要不你发个贴帮我解释下吧…… ...

  我也母鸡呀 ..  不过 又不用解释  

你前面的函数又不会变动 让他们复制粘贴就行

主要是解释怎么构造结构体

在堆申请空间
写入参数
调用API (传入堆)
释放堆


作者: 千叶de悠一    时间: 2014-8-17 17:03
...............还真想解释啊
作者: 超自然    时间: 2014-8-17 17:16
牛!!很不一样的思路
作者: cylhb    时间: 2014-8-17 19:11
技术贴,必须支持
作者: rainshine    时间: 2014-8-17 19:42
如此美丽。 发表于 2014-8-17 16:33
我也母鸡呀 ..  不过 又不用解释  

你前面的函数又不会变动 让他们复制粘贴就行

0.0嗯,,我就是想让他们明白这个原理。。
heapalloc- -writeprocessmemory- -heapfree,哇好精辟的答案。
作者: rainshine    时间: 2014-8-17 19:42
cylhb 发表于 2014-8-17 19:11
技术贴,必须支持

谢谢~
作者: rainshine    时间: 2014-8-17 19:43
超自然 发表于 2014-8-17 17:16
牛!!很不一样的思路

0.0自然神,其实我是踏入佛门10年修炼才顿悟的。。
作者: 236686595    时间: 2014-8-17 20:57
顶楼主啦..希望楼主多发精品好帖啦.....
作者: julele    时间: 2014-8-18 21:43
本帖最后由 julele 于 2014-8-20 02:51 编辑

学习, 赶脚很有用最难得的是源码都有了

作者: sam7894604    时间: 2014-8-20 13:11
不错..跟我实现的差不多...
不过我懒得写成代码  
作者: iookk2012    时间: 2014-8-20 17:11
瞧瞧瞧瞧
作者: 亚太丶    时间: 2014-8-22 15:16
好分享,先收藏了~
作者: rainshine    时间: 2014-8-22 16:15
236686595 发表于 2014-8-17 20:57
顶楼主啦..希望楼主多发精品好帖啦.....

谢谢。
作者: rainshine    时间: 2014-8-22 16:15
julele 发表于 2014-8-18 21:43
学习, 赶脚很有用最难得的是源码都有了

啊哈哈 谢谢。
作者: rainshine    时间: 2014-8-22 16:16
sam7894604 发表于 2014-8-20 13:11
不错..跟我实现的差不多...
不过我懒得写成代码

0.0= =合着你是有思路懒得动0.0
其实。。。。。哈哈 跟我差不多 我是这几天闲着才弄一下~
作者: sam7894604    时间: 2014-8-22 16:40
rainshine 发表于 2014-8-22 16:16
0.0= =合着你是有思路懒得动0.0
其实。。。。。哈哈 跟我差不多 我是这几天闲着才弄一下~ ...

哈哈哈 是的...
TC拿来开发脚本足够就好...
改天有空在写个结构库
作者: rainshine    时间: 2014-8-22 17:03
sam7894604 发表于 2014-8-22 16:40
哈哈哈 是的...
TC拿来开发脚本足够就好...
改天有空在写个结构库

结构体库?我写了个内存操作库- -。待会公开
作者: sam7894604    时间: 2014-8-22 17:15
rainshine 发表于 2014-8-22 17:03
结构体库?我写了个内存操作库- -。待会公开

坐等公开!!

省得我在写一次…


简单的说就是用函数定义结构…
作者: rainshine    时间: 2014-8-22 17:41
sam7894604 发表于 2014-8-22 17:15
坐等公开!!

省得我在写一次…

嗯好吧,可以啊,哎,你这想法不错、
作者: staygold    时间: 2014-8-29 08:16
kkkkkkkkkkkkkkkk

作者: torino    时间: 2014-9-1 20:48
谢谢分享,学习了~~~~~
作者: 贪吃蛇    时间: 2014-9-3 18:19
解释的够直白的了,到这份上还不懂的是不想懂了,是只想要鱼而不要钓竿的
作者: 472491031    时间: 2014-9-7 23:38

作者: Calm++    时间: 2014-9-10 21:03
厉害 看看
作者: haizhen005    时间: 2014-9-14 02:33
看看学习一下
作者: tangryo    时间: 2014-9-21 21:40
11111111111
作者: rjsvictor    时间: 2014-9-22 15:14
嘿嘿,不错,鼎力支持!!...
作者: My水乐    时间: 2014-9-24 01:32
必须回复
作者: ro897321    时间: 2014-9-28 17:43
看看

作者: 风动鸣    时间: 2014-10-1 21:07
支持
作者: david1378    时间: 2014-10-1 22:27
ssssssssss
作者: 屌的一笔    时间: 2014-10-4 18:19

作者: 610761555    时间: 2014-10-15 02:55
学习~
作者: a837198    时间: 2014-10-17 13:43
1111111111111
作者: 蓝骷髅    时间: 2014-10-27 21:07
顶顶顶顶顶顶顶顶顶顶顶顶顶
作者: wullsb    时间: 2014-10-28 03:11
ddddddddddddddddddddddddddd
作者: try    时间: 2014-10-29 02:04
结构体?
作者: 飞飞fsadf    时间: 2014-10-30 10:23
/2222222222222222222222222222222
作者: jiangyutao1999    时间: 2014-11-1 22:17

作者: warcraftii    时间: 2014-11-12 17:25
盘口价格
作者: djzlove129    时间: 2014-11-29 23:50
看看
作者: lmp2015    时间: 2014-12-1 20:32
全程售后
作者: mzbqhbc    时间: 2014-12-10 17:40
看到卡死你速度快
作者: p6301854    时间: 2014-12-13 08:06
000000000000000000
作者: T星人    时间: 2014-12-17 15:05
支持大神~~
作者: faabb    时间: 2014-12-23 20:05
看到眼晕......
作者: venski    时间: 2014-12-24 14:16
TC 这个给解决了,接下来,我可以实现很多好玩,有趣的事情
作者: venski    时间: 2014-12-24 14:53
结构中的类型中又有自定义结构怎么办?
作者: 兔失志    时间: 2015-1-12 15:19
111111111
作者: rainshine    时间: 2015-1-12 22:40
venski 发表于 2014-12-24 14:16
TC 这个给解决了,接下来,我可以实现很多好玩,有趣的事情

嗯- -有道理
作者: rainshine    时间: 2015-1-12 22:40
venski 发表于 2014-12-24 14:16
TC 这个给解决了,接下来,我可以实现很多好玩,有趣的事情

坏坏的你懂的
作者: 671745838    时间: 2015-1-13 18:18
hfghvcvxcvcxvcxvdsfsd
作者: dragon07zn    时间: 2015-1-15 19:53
看看
作者: dragon07zn    时间: 2015-1-15 19:53
看看
作者: 2822610753    时间: 2015-2-3 20:19
zzzzzzz
作者: ma50000146    时间: 2015-2-25 13:33
学习学习学习
作者: wushengweo    时间: 2015-2-25 18:21
大苏打
作者: z1481281370    时间: 2015-3-13 19:27
支持支持支持
作者: 墨染年华    时间: 2015-4-26 16:06

作者: qsmoon    时间: 2015-10-11 22:35
tc调用带结构体
作者: sanmaodo    时间: 2015-10-12 02:51
向你学习
作者: shoutianyu    时间: 2015-11-4 22:30
看看学写下
作者: 家园网络    时间: 2015-11-16 07:47
dfsdsfffffffffffffffffffffffffffffffffffffffff
作者: dihlgame    时间: 2015-12-8 13:33
学习 数据结构
作者: 伊泽    时间: 2015-12-14 10:38
1111111111111
作者: 啊谦    时间: 2016-3-2 22:18
神啊
作者: dzb123    时间: 2016-4-24 14:35
看看  ?
作者: snakehmq    时间: 2016-5-3 14:49
11111111111111
作者: luowen333    时间: 2016-6-23 11:06
sASas
作者: itsok    时间: 2016-7-21 04:43
ddddddddd
作者: tbmbx2017    时间: 2016-9-11 08:19
牛逼,我是自愧不如
作者: xw0207    时间: 2016-12-17 17:08
谢谢;楼主分享!!!!
作者: wjyzl0569    时间: 2017-1-15 16:24
顶楼主啦..希望楼主多发精品好帖啦.....
作者: xiaoqunqun    时间: 2017-5-8 10:35
学习学习
作者: ms5084456    时间: 2017-5-9 23:38
支持

作者: long904248247    时间: 2017-6-24 22:53
adawdasds
作者: cxmin123456    时间: 2017-7-31 10:12
.................................
作者: Eyill    时间: 2018-4-28 08:15
学习技巧、
作者: 1364770121    时间: 2018-7-21 15:34
66666
作者: mlqqmv    时间: 2018-8-3 03:15
限制鼠标移动 tc调用带结构体(自定义数据类型)的winapi [修改]




欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/) Powered by Discuz! X3.1