TC官方合作论坛
标题:
【hook教程】按住某键_则高速连发,松开即停止。
[打印本页]
作者:
剑仙十号
时间:
2017-6-17 19:49
标题:
【hook教程】按住某键_则高速连发,松开即停止。
本帖最后由 剑仙十号 于 2018-3-23 00:00 编辑
【hook教程】按住某键_则高速连发,松开即停止。
求一个脚本,按住某键_能高速连续触发,松开即停止。
活着_viva_
1楼6-14 23:23
萌新急用,有大佬发个教程或者有现成的都行。
=======================================================
这个必须用hook。拦截真实按键,放行模拟按键。
按键精灵没有回调函数,不能写hook。
tc简单开发 有回调函数,可以写hook。百度搜索:tc简单开发。
=======================================================
低层键盘钩子,WH_KEYBOARD_LL,
回调函数的lParam(参数3),是一个KBDLLHOOKSTRUCT结构。
先看看该结构,在MSDN中的解释
typedef struct tagKBDLLHOOKSTRUCT {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT, *LPKBDLLHOOKSTRUCT;
这个结构.flags(成员3),是一个二进制0--7位。
//
结构体各成员的意义如下:
VkCode:按键的虚拟键码。键盘上的每个按键对应一个虚拟键码
ScanCode:硬件的扫描码
Flags:按键消息的详细信息。是一些标识位的组合
Time:时间。
DwExtraInfo:扩展到按键消息的信息
=======================================================
结构.Flags,是一个二进制0--7位。各位值的标识信息如下:
从右到左数起。
位0:扩展键的标识位。
1表示该键是扩展键;0表示不是。
位1~3:保留位,一般为0。
位4:消息类型的标识位。
1表示消息是模拟的;0表示消息是真实的。
.
位5:Alt键的标识位。
1表示Alt是按住的;0表示Alt键没有被按下
位6:保留位,一般是0
位7:按键的状态标识位。1表示按键是弹起的,0表示按键是按住的
从位0 开始数起的,所以8位二进制,是从位0到位7。
例如:1个32位 二进制数:
00000000 00000000 00000000 01111100
用计算器换成十进制是124。
手动计算,过程是怎样操作的?
.
二进制数从右到左 读起:
第0位是1,则表示2的0次幂,是0则忽略不计。
第1位是1,则表示2的1次幂,是0则忽略不计。
第2位是2的2次幂,按此类推。
……
……
01111100
从右往左
位0是 0 忽略不计。 (2的0次幂 = 1)
位1是 0 忽略不计。 (2的1次幂 = 2)
位2是 1 。2的2次幂 = 4
位3是 1 。2的3次幂 = 8
位4是 1 。2的4次幂 = 16
位5是 1 。2的5次幂 = 32
位6是 1 。2的6次幂 = 64
后面的都是0,则忽略不计。二进制有效位的结果相加,得出十进制结果:124。
假设本次是模拟按键,位4标记为1,
var 位4十进制 = 数学求幂(2, 4)
2的4次幂 = 16
下一步,用二进制.位与运算,判断按键来源。
if(键盘.Flags & 16==16)
traceprint(“模拟按键。不拦截该按键。”)
拦截值 = 0 //0值为不处理消息。
elseif(键盘.Flags & 16==0)
traceprint(“物理按键。拦截该按键。”)
拦截值 = 1 //非0值为处理该消息。
end
=======================================================
代码例子:
var Key = 数组()
功能 连发脚本_初始化()
//把数组定义成结构体.
Key["vkCode"] = 数组("long" = 1 ,"value" = 0)
Key["ScanCode"] = 数组("long" = 1 ,"value" = 0)
Key["Flags"] = 数组("long" = 1 ,"value" = 0)
Key["Time"] = 数组("long" = 1 ,"value" = 0)
Key["DwExtraInfo"] = 数组("long" = 1 ,"value" = 0)
结束
功能 Keyback(ncode, wparam, lparam)
var 拦截值
/*
aj,tc,易语言的变量,都没有指针类型。
所以调用系统API,RtlMoveMemory(),把回调函数_参数3中的数据,复制到刚才定义的结构体中。
查询MSDN,RtlMoveMemory()参数1是结构体指针。参数1的数据类型,定义为上一步的结构体1。勾选传址。
var bool_va= dllcall("kernel32.dll","long","RtlMoveMemory", "pstruct",Key, "long",lparam, "long",20)
*/
/*
tc中没有二进制.位运算,先用易语言封装一个二进制.位与运算,编译生存dll文件,放到tc资源目录中调用。
var ret = dllcall("rc:Bit.dll", "long", "Bitand", "long", Key["Flags"]["value"], "long", 16)
if(ret==16)
traceprint(“模拟按键。不拦截按键。”)
拦截值 = 1
elseif(ret==0)
traceprint(“真实按键。拦截该按键。”)
拦截值 = CallNextHookEx(0, ncode, wparam, lparam)
end
*/
return 拦截值
结束
功能 sethook()
//代码.
结束
功能 unsethook()
//代码.
结束
作者:
剑仙十号
时间:
2017-6-17 19:51
本帖最后由 剑仙十号 于 2018-3-23 00:08 编辑
【hook】二进制,位运算库。
//【鬼玺开源】TC5.0 Win32 API - 汇编调用之位运算 - 更新高速版
//这源码带有5个参数,用来内联汇编也行。带变量的汇编,不带变量的汇编。
//好源码做下备份。否则哪天找不到了。
变量 线程ID
功能 执行()
var ret = 位运算_初始化() //使用前,必须先调用一次。
ret = 位与(16, 16)
messagebox(ret)
结束
功能 启动_热键()
var bool = 线程获取状态(线程ID)
if(bool == false)
线程ID = 线程开启("执行", "")
end
结束
功能 终止_热键()
线程关闭(线程ID)
结束
//--------------------汇编构造位运算库-------------------
var __位运算_AsmCode = array("初始化" = false, "位或" = 0, "位与" = 0, "位反" = 0, "位异或" = 0, "位左移" = 0, "位右移" = 0)
//
function 位运算_初始化() //使用前,必须先调用一次。
if(__位运算_AsmCode["初始化"] == false)
var pAsmCode, AsmCode = array()
AsmCode["0"] = array("short" = 1, "value" = #8B55)
AsmCode["1"] = array("short" = 1, "value" = #8BEC)
AsmCode["2"] = array("short" = 1, "value" = #0845)
AsmCode["3"] = array("short" = 1, "value" = #450B)
AsmCode["4"] = array("short" = 1, "value" = #0B0C)
AsmCode["5"] = array("short" = 1, "value" = #1045)
AsmCode["6"] = array("short" = 1, "value" = #450B)
AsmCode["7"] = array("short" = 1, "value" = #C914)
AsmCode["8"] = array("short" = 1, "value" = #10C2)
AsmCode["9"] = array("short" = 1, "value" = #9000)
AsmCode["10"] = array("short" = 1, "value" = #8B55)
AsmCode["11"] = array("short" = 1, "value" = #8BEC)
AsmCode["12"] = array("short" = 1, "value" = #0845)
AsmCode["13"] = array("short" = 1, "value" = #4523)
AsmCode["14"] = array("short" = 1, "value" = #C90C)
AsmCode["15"] = array("short" = 1, "value" = #10C2)
AsmCode["16"] = array("short" = 1, "value" = #9000)
AsmCode["17"] = array("short" = 1, "value" = #8B55)
AsmCode["18"] = array("short" = 1, "value" = #8BEC)
AsmCode["19"] = array("short" = 1, "value" = #0845)
AsmCode["20"] = array("short" = 1, "value" = #D0F7)
AsmCode["21"] = array("short" = 1, "value" = #C2C9)
AsmCode["22"] = array("short" = 1, "value" = #0010)
AsmCode["23"] = array("short" = 1, "value" = #5590)
AsmCode["24"] = array("short" = 1, "value" = #EC8B)
AsmCode["25"] = array("short" = 1, "value" = #458B)
AsmCode["26"] = array("short" = 1, "value" = #3308)
AsmCode["27"] = array("short" = 1, "value" = #0C45)
AsmCode["28"] = array("short" = 1, "value" = #4533)
AsmCode["29"] = array("short" = 1, "value" = #3310)
AsmCode["30"] = array("short" = 1, "value" = #1445)
AsmCode["31"] = array("short" = 1, "value" = #C2C9)
AsmCode["32"] = array("short" = 1, "value" = #0010)
AsmCode["33"] = array("short" = 1, "value" = #5590)
AsmCode["34"] = array("short" = 1, "value" = #EC8B)
AsmCode["35"] = array("short" = 1, "value" = #458B)
AsmCode["36"] = array("short" = 1, "value" = #8A08)
AsmCode["37"] = array("short" = 1, "value" = #0C4D)
AsmCode["38"] = array("short" = 1, "value" = #E0D3)
AsmCode["39"] = array("short" = 1, "value" = #C2C9)
AsmCode["40"] = array("short" = 1, "value" = #0010)
AsmCode["41"] = array("short" = 1, "value" = #5590)
AsmCode["42"] = array("short" = 1, "value" = #EC8B)
AsmCode["43"] = array("short" = 1, "value" = #458B)
AsmCode["44"] = array("short" = 1, "value" = #8A08)
AsmCode["45"] = array("short" = 1, "value" = #0C4D)
AsmCode["46"] = array("short" = 1, "value" = #E8D3)
AsmCode["47"] = array("short" = 1, "value" = #C2C9)
AsmCode["48"] = array("short" = 1, "value" = #0010)
pAsmCode = structmalloc(AsmCode)
if(dllcall("Kernel32.dll", "long", "VirtualProtect", "long", pAsmCode, "long", structlen(AsmCode), "long", #40, "plong", null))
__位运算_AsmCode["位或"] = pAsmCode
__位运算_AsmCode["位与"] = pAsmCode + 19
__位运算_AsmCode["位反"] = pAsmCode + 33
__位运算_AsmCode["位异或"] = pAsmCode + 46
__位运算_AsmCode["位左移"] = pAsmCode + 66
__位运算_AsmCode["位右移"] = pAsmCode + 82
__位运算_AsmCode["初始化"] = true
end
end
return __位运算_AsmCode["初始化"]
end
//
function 位或(参_整数1, 参_整数2, 参_整数3 = 0, 参_整数4 = 0)
return __CallWindowProc(__位运算_AsmCode["位或"], 参_整数1, 参_整数2, 参_整数3, 参_整数4)
end
function 位与(参_整数1, 参_整数2)
return __CallWindowProc(__位运算_AsmCode["位与"], 参_整数1, 参_整数2, null, null)
end
function 位反(参_整数)
return __CallWindowProc(__位运算_AsmCode["位反"], 参_整数, null, null, null)
end
function 位异或(参_整数1, 参_整数2, 参_整数3 = 0, 参_整数4 = 0)
return __CallWindowProc(__位运算_AsmCode["位异或"], 参_整数1, 参_整数2, 参_整数3, 参_整数4)
end
function 位左移(参_整数, 参_位数 = 0)
return __CallWindowProc(__位运算_AsmCode["位左移"], 参_整数, 参_位数, null, null)
end
function 位右移(参_整数, 参_位数 = 0)
return __CallWindowProc(__位运算_AsmCode["位右移"], 参_整数, 参_位数, null, null)
end
function __CallWindowProc(参_地址, 参_参数1, 参_参数2, 参_参数3, 参_参数4)
return dllcall("User32.dll", "long", "CallWindowProcW", "long", 参_地址, "long", 参_参数1, "long", 参_参数2, "long", 参_参数3, "long", 参_参数4)
end
//--------------------位或--------------------
//nop
//push ebp
//mov ebp , esp
//mov eax,dword [ebp+08h]
//or eax,dword [ebp+0Ch]
//or eax,dword [ebp+10h]
//or eax,dword [ebp+14h]
//leave
//retn 0010h
//90 55 8B EC 8B 45 08 0B 45 0C 0B 45 10 0B 45 14 C9 C2 10 00
//--------------------位与--------------------
//nop
//push ebp
//mov ebp,esp
//mov eax,[ebp+08h]
//and eax,[ebp+0Ch]
//leave
//retn 0010h
//90 55 8B EC 8B 45 08 23 45 0C C9 C2 10 00
//--------------------位反--------------------
//nop
//push ebp
//mov ebp , esp
//mov eax,dword [ebp+08h]
//not eax
//leave
//retn 0010h
//90 55 8B EC 8B 45 08 F7 D0 C9 C2 10 00
//--------------------位异或--------------------
//nop
//push ebp
//mov ebp , esp
//mov eax,dword [ebp+08h]
//xor eax,dword [ebp+0Ch]
//xor eax,dword [ebp+10h]
//xor eax,dword [ebp+14h]
//leave
//retn 0010h
//90 55 8B EC 8B 45 08 33 45 0C 33 45 10 33 45 14 C9 C2 10 00
//--------------------位左移--------------------
//nop
//push ebp
//mov ebp , esp
//mov eax,dword [ebp+08h]
//mov cl,byte [ebp+0Ch]
//shl eax,cl
//leave
//retn 0010h
//90 55 8B EC 8B 45 08 8A 4D 0C D3 E0 C9 C2 10 00
//--------------------位右移--------------------
//nop
//push ebp
//mov ebp , esp
//mov eax,dword [ebp+08h]
//mov cl,byte [ebp+0Ch]
//shr eax,cl
//leave
//retn 0010h
//90 55 8B EC 8B 45 08 8A 4D 0C D3 E8 C9 C2 10 00
作者:
剑仙十号
时间:
2017-6-17 19:53
本帖最后由 剑仙十号 于 2018-3-23 00:02 编辑
tc这边 没有二进制位运算,
位与运算,
位或运算,
位异或,
位取反,
建议TC官方在更新版本时,增加上去。
作者:
东月山
时间:
2017-6-17 20:51
谢谢楼主的无私奉献!!!!!!
作者:
爱上老公
时间:
2017-6-17 21:00
kankan
作者:
yy1457739021
时间:
2017-6-17 22:42
楼主给力啊
作者:
460071560
时间:
2017-6-24 10:55
Dddddd
作者:
1027663760
时间:
2017-6-26 20:29
666666666666666666666666
作者:
sunshadow_ja
时间:
2017-7-13 11:14
666666
作者:
thomascxt
时间:
2017-7-19 17:35
dingdingding
作者:
类人猿
时间:
2017-8-3 22:40
完全可以简化不依赖那么多东西
作者:
wsmeteor
时间:
2017-8-23 00:19
学习学习
作者:
a598764209
时间:
2017-8-23 21:32
支持下 哈哈
作者:
384543121
时间:
2017-8-30 16:34
厉害大佬厉害厉害
作者:
frzreo
时间:
2017-9-4 02:09
学习
作者:
lanlanheningxia
时间:
2017-9-8 11:47
学习这个
作者:
1763721529
时间:
2017-9-20 20:57
333333333333333
作者:
amawolf
时间:
2017-9-25 10:12
数起的,所以8位二进制,是从位0到位7。
作者:
shine233
时间:
2017-10-2 20:32
学习下
作者:
小杰01
时间:
2018-1-3 13:34
这是什么
作者:
1131501214
时间:
2018-1-13 02:32
哈哈哈哈
作者:
usb01
时间:
2018-1-22 11:05
看看怎么样
作者:
472540265
时间:
2018-2-2 15:20
看见了好看了就好看了就会
作者:
cendongwansui
时间:
2018-3-6 11:25
大神瞧瞧瞧瞧瞧瞧
作者:
playis
时间:
2018-3-14 13:17
这个必须学习。。。
作者:
剑仙十号
时间:
2018-4-21 18:33
12345678.
作者:
cs2018hu
时间:
2018-6-1 14:23
谢谢大神分享
作者:
夏末
时间:
2018-7-22 23:08
来学习一下
作者:
littlegao233
时间:
2018-8-1 14:39
谢谢分享。
欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/)
Powered by Discuz! X3.1