|
BindWindowEx函数简介: 绑定指定的窗口,并指定这个窗口的屏幕颜色获取方式,鼠标仿真模式,键盘仿真模式 高级用户使用.
& O. Z9 U: C( s4 n1 p函数原型:
3 c: a5 X& ?9 h: w
3 Q( M$ ~5 e# p2 q; c1 Ilong BindWindowEx(hwnd,display,mouse,keypad,public,mode)! I' w( P) U) ?) M; i
+ j; U; C) F5 W0 U
" L! n, [- ~& f6 M9 f
9 O% v3 p3 g2 q ^4 y- W+ o9 u8 O
1 @# j& z# x2 \8 q+ n) y
易语言调用BindWindowEx命令见下图: |0 U) w5 f& u9 H- L
: J: V, K/ z# H3 q6 X8 ?4 B* _7 Y
8 W0 k5 ^! I( t- E+ ~( z
/ {% {/ c" K; c" u- g( w. F
8 g/ W) } n' d
; z3 C# {0 g& t ^8 @
( Q, n( y+ H x9 }6 @( X+ o2 N: f# {2 r: D1 C/ x4 i# o" V
4 Q- C) y! r' H1 X& b8 f7 }
参数定义:7 s/ y- N. ~" w& q0 f
1 V* v3 Q F) X# Y3 A/ B9 y
hwnd 整形数: 指定的窗口句柄' L1 H7 J8 P) C. V" u
" \% d; q# a4 i* I$ t; h4 z
display 字符串: 屏幕颜色获取方式 取值有以下几种4 g( D# J: N2 [5 [7 r
$ m L. c4 M, W8 X"normal" : 正常模式,平常我们用的前台截屏模式1 y7 x, g( h, c7 K. N1 i" q4 z
7 m& H0 k8 B7 e" B0 ?0 y
"gdi" : gdi模式,用于窗口采用GDI方式刷新时. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。 2 Y0 O2 ]* Y; T( a$ d% g) ~
"gdi2" : gdi2模式,此模式兼容性较强,但是速度比gdi模式要慢许多,如果gdi模式发现后台不刷新时,可以考虑用gdi2模式.& t4 T: h" S" K- }8 g! ^8 c+ p- M
% f! u6 k& h4 Q; Q) f
"dx2" : dx2模式,用于窗口采用dx模式刷新,如果dx方式会出现窗口进程崩溃的状况,可以考虑采用这种.采用这种方式要保证窗口有一部分在屏幕外.win7 win8或者vista不需要移动也可后台. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
- f: g% g0 V8 H9 w* V"dx3" : dx3模式,同dx2模式,但是如果发现有些窗口后台不刷新时,可以考虑用dx3模式,此模式比dx2模式慢许多. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。5 S+ s. D9 s/ p. r$ M" ]% r
. N5 g. r- U d4 b3 k
dx模式,用于窗口采用dx模式刷新,取值可以是以下任意组合,组合采用"|"符号进行连接. 支持BindWindow中的缩写模式. 比如dx代表" dx.graphic.2d| dx.graphic.3d"
; I$ S% p4 m$ C2 y* M: l3 l1. "dx.graphic.2d" 2d窗口的dx图色模式 : t, a3 c% i9 e+ |; i& ^# ~7 n
2. "dx.graphic.2d.2" 2d窗口的dx图色模式 是dx.graphic.2d的增强模式.兼容性更好.
2 B+ h- n- x" @8 j3. "dx.graphic.3d" 3d窗口的dx图色模式,
8 p& Z! `9 A- J, a4. "dx.graphic.3d.8" 3d窗口的dx8图色模式, 此模式对64位进程无效.5 E; t; h, |% i% I8 |2 X6 @ q/ K# r
5. "dx.graphic.opengl" 3d窗口的opengl图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.
8 J) K1 [$ R# }; ^6. "dx.graphic.opengl.esv2" 3d窗口的opengl_esv2图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.
, \( y8 B# c& K j7. "dx.graphic.3d.10plus" 3d窗口的dx10 dx11图色模式. R1 [+ O/ V5 s4 l: [
, A1 d$ z+ M! `! ~" W" X
mouse 字符串: 鼠标仿真模式 取值有以下几种
( c4 ~4 C# @$ |0 M) B, c
2 ~9 f" e$ a2 V% t: Z& q, x0 i"normal" : 正常模式,平常我们用的前台鼠标模式
. ]+ T; Q; `4 J8 {# B
. }3 `! T7 |( L. H) O: p: ?"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.& Q; U7 I- Q" w9 U
"windows3": Windows3模式,采取模拟windows消息方式,可以支持有多个子窗口的窗口后台% l; m. |5 i0 M6 G" O: w. R
dx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式,比如windows2代表"dx.mouse.position.lock.api|dx.mouse.position.lock.message|dx.mouse.state.message"
1 }6 P+ x. j+ `0 @1. "dx.mouse.position.lock.api" 此模式表示通过封锁系统API,来锁定鼠标位置.
& b: M% [ O. w3 [# ]. C2. "dx.mouse.position.lock.message" 此模式表示通过封锁系统消息,来锁定鼠标位置.8 l' s f9 r" w- w# u- e- B6 M
3. "dx.mouse.focus.input.api" 此模式表示通过封锁系统API来锁定鼠标输入焦点.
r+ y' K6 \( ?4. "dx.mouse.focus.input.message"此模式表示通过封锁系统消息来锁定鼠标输入焦点.
4 r0 Y, T' ^7 _5. "dx.mouse.clip.lock.api" 此模式表示通过封锁系统API来锁定刷新区域。注意,使用这个模式,在绑定前,必须要让窗口完全显示出来. v4 B% G, |9 N' o7 `& X
6. "dx.mouse.input.lock.api" 此模式表示通过封锁系统API来锁定鼠标输入接口.
$ G0 O9 B1 ], t' D7. "dx.mouse.state.api" 此模式表示通过封锁系统API来锁定鼠标输入状态.
2 g) l+ B. w$ J3 n8. "dx.mouse.state.message" 此模式表示通过封锁系统消息来锁定鼠标输入状态.8 s: E/ }9 F) D6 M7 {' Z/ g5 U- C5 f
9. "dx.mouse.api" 此模式表示通过封锁系统API来模拟dx鼠标输入.2 k7 @$ F9 o6 c2 {2 _) {) I" j* e
10. "dx.mouse.cursor" 开启此模式,可以后台获取鼠标特征码.
' K: y/ P2 [6 R- f: W$ ^11. "dx.mouse.raw.input" 有些窗口需要这个才可以正常操作鼠标.
6 n1 P+ B* i* m; n- y! l. }' a12. "dx.mouse.input.lock.api2" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.$ | f E! h, J( y# p1 h
13. "dx.mouse.input.lock.api3" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.
& a# ~) L5 }- _0 I |& j- _0 } d. x5 x8 d
keypad 字符串: 键盘仿真模式 取值有以下几种
5 A2 s' O# o) ^$ _) q! n$ b0 p/ H. B
"normal" : 正常模式,平常我们用的前台键盘模式* N) y5 W2 v( E4 {
O' ^( f$ G7 y5 {% Q1 b"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件. _2 [ N0 Q. u
3 b8 {& s( p+ {2 p3 l7 bdx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式.比如dx代表" dx.public.active.api|dx.public.active.message| dx.keypad.state.api|dx.keypad.api|dx.keypad.input.lock.api"
2 y1 z& g" \4 W8 M Q1. "dx.keypad.input.lock.api" 此模式表示通过封锁系统API来锁定键盘输入接口." s; N4 m+ i7 r
2. "dx.keypad.state.api" 此模式表示通过封锁系统API来锁定键盘输入状态.
, s# ^' |, c: ^2 S2 ?3. "dx.keypad.api" 此模式表示通过封锁系统API来模拟dx键盘输入. : b: j* }1 q/ U, y
4. "dx.keypad.raw.input" 有些窗口需要这个才可以正常操作键盘.
6 s2 E, K& L. {3 z
3 ?+ r& O# K! e dpublic 字符串: 公共属性 dx模式共有 1 x( G& F# h Y b0 u" m
- S/ n/ @7 u% i8 l取值可以是以下任意组合. 组合采用"|"符号进行连接 这个值可以为空
3 t) L1 A) `; `7 W/ ~1 ~& W% }2 @1. "dx.public.active.api" 此模式表示通过封锁系统API来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. ! f( M* K" I; |) y. R
2. "dx.public.active.message" 此模式表示通过封锁系统消息来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. 另外如果要让此模式生效,必须在绑定前,让绑定窗口处于激活状态,否则此模式将失效. 比如dm.SetWindowState hwnd,1 然后再绑定.+ j h$ o8 o. K6 @6 \. w$ ?1 K6 i/ a! b; x
3. "dx.public.disable.window.position" 此模式将锁定绑定窗口位置.不可与"dx.public.fake.window.min"共用.. `. f' O: x, h0 V' Z- s
4. "dx.public.disable.window.size" 此模式将锁定绑定窗口,禁止改变大小. 不可与"dx.public.fake.window.min"共用.$ V+ M2 J( [2 g/ c- N
5. "dx.public.disable.window.minmax" 此模式将禁止窗口最大化和最小化,但是付出的代价是窗口同时也会被置顶. 不可与"dx.public.fake.window.min"共用., n) R* y) Z1 X8 m; }: H! O0 \
6. "dx.public.fake.window.min" 此模式将允许目标窗口在最小化状态时,仍然能够像非最小化一样操作.. 另注意,此模式会导致任务栏顺序重排,所以如果是多开模式下,会看起来比较混乱,建议单开使用,多开不建议使用. 同时此模式不是万能的,有些情况下最小化以后图色会不刷新或者黑屏.5 E9 c$ D1 m6 U3 f
7. "dx.public.hide.dll" 此模式将会隐藏目标进程的大漠插件,避免被检测..另外使用此模式前,请仔细做过测试,此模式可能会造成目标进程不稳定,出现崩溃。
3 ]* Y5 Z. V8 C+ E4 l3 ?) ]3 z1 u! H8. "dx.public.active.api2" 此模式表示通过封锁系统API来锁定窗口激活状态. 部分窗口遮挡无法后台,需要这个属性. 6 M' T, F9 p9 Q1 Y
9. "dx.public.input.ime" 此模式是配合SendStringIme使用. 具体可以查看SendStringIme接口., T/ t5 I7 H8 @ h
10 "dx.public.graphic.protect" 此模式可以保护dx图色不被恶意检测.同时对dx.keypad.api和dx.mouse.api也有保护效果.6 E- M# G. ]* A g2 ~
11 "dx.public.disable.window.show" 禁止目标窗口显示,这个一般用来配合dx.public.fake.window.min来使用. / ?$ s$ l4 t2 ?1 ?+ B2 N+ U
12 "dx.public.anti.api" 此模式可以突破部分窗口对后台的保护.+ A ^4 C6 I: l' V! u
13 "dx.public.km.protect" 此模式可以保护dx键鼠不被恶意检测.最好配合dx.public.anti.api一起使用. 此属性可能会导致部分后台功能失效.' o, F& r/ p8 ^- r- g
14 "dx.public.prevent.block" 绑定模式1 3 5 7 101 103下,可能会导致部分窗口卡死. 这个属性可以避免卡死.
% u8 x/ d/ |* a+ C: R/ }) Q15 "dx.public.ori.proc" 此属性只能用在模式0 1 2 3和101下. 有些窗口在不同的界面下(比如登录界面和登录进以后的界面),键鼠的控制效果不相同. 那可以用这个属性来尝试让保持一致. 注意的是,这个属性不可以滥用,确保测试无问题才可以使用. 否则可能会导致后台失效.* _; z! B0 r) V1 _: z: y
16 "dx.public.down.cpu" 此模式可以配合DownCpu来降低目标进程CPU占用. 当图色方式降低CPU无效时,可以尝试此种方式.
$ e6 y$ ]9 C& l17 "dx.public.focus.message" 当后台绑定后,后台无法正常在焦点窗口输入文字时,可以尝试加入此属性. 此属性会强制键盘消息发送到焦点窗口. 慎用此模式,此模式有可能会导致后台键盘在某些情况下失灵.0 H7 K7 I" k& n8 R
18 "dx.public.graphic.speed" 只针对图色中的dx模式有效.此模式会牺牲目标窗口的性能,来提高DX图色速度,尤其是目标窗口刷新很慢时,这个参数就很有用了.# h5 n$ L( z% C; E
19 "dx.public.memory" 让本对象突破目标进程防护,可以正常使用内存接口. 当用此方式使用内存接口时,内存接口的速度会取决于目标窗口的刷新率.6 s$ O# w# f" T3 [$ T
20 "dx.public.inject.super" 突破某些难以绑定的窗口. 此属性仅对除了模式0和2的其他模式有效.
4 c4 Z6 L8 L' v21 "dx.public.hack.speed" 类似变速齿轮,配合接口HackSpeed使用4 Q6 E5 V6 m, L: @: o6 d# Z' D8 A
0 m% w- A+ `- M3 c5 h9 _) @: a! jmode 整形数: 模式。取值有以下几种 0 : 推荐模式此模式比较通用,而且后台效果是最好的. g! U8 v' \+ a5 b
2 : 同模式0,如果模式0有崩溃问题,可以尝试此模式. 注意0和2模式,当主绑定(第一个绑定同个窗口的对象)绑定成功后,那么调用主绑定的线程必须一直维持,否则线程一旦推出,对应的绑定也会消失.
% h1 ]# E3 a7 f# I 101 : 超级绑定模式. 可隐藏目标进程中的dm.dll.避免被恶意检测.效果要比dx.public.hide.dll好. 推荐使用.
' ?0 u; k4 [1 W' k 103 : 同模式101,如果模式101有崩溃问题,可以尝试此模式.
- G1 K+ t3 t. M6 Y6 m. d4 d1 S! Y3 L
11 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统, R9 V; U1 m6 V8 S) V
) J" t4 G5 Y, S/ {' m- [- K; R
13 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统; @8 _9 v( @# O$ C+ c
需要注意的是: 模式101 103在大部分窗口下绑定都没问题。但也有少数特殊的窗口,比如有很多子窗口的窗口,对于这种窗口,在绑定时,一定要把鼠标指向一个可以输入文字的窗口,比如一个文本框,最好能激活这个文本框,这样可以保证绑定的成功.2 @! J4 O: M+ w2 R) W
返回值:
: n2 h, ?/ x1 N8 B+ v整形数:5 g# ~4 ]- l2 b5 \: Y% i5 [' q
0: 失败: E' J. l0 N( A9 X; u! }; m9 ~
1: 成功
+ f1 x+ B4 e7 T0 q1 g# w* s# H9 R( Z$ R5 C; t
如果返回0,可以调用GetLastError来查看具体失败错误码,帮助分析问题.2 W {1 o5 U& M) h8 E
示例:0 ]6 W, ~0 U: R
5 _/ K) J; k5 F0 E8 ]2 I8 p8 ], F比如9 M3 n" Y7 U) a6 ?' q! T
dm_ret = dm.BindWindowEx(hwnd,"normal","dx.mouse.position.lock.api|dx.mouse.position.lock.message","windows","dx.public.active.api",0)
& y9 ^% r- r4 F4 p5 ]4 j
1 p, u2 }- R4 [dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","normal","dx.public.active.api",0)
! a$ k+ d# X& t1 c& r ! S9 A' p- @: W- X c8 R; A
dm_ret = dm.BindWindowEx(hwnd,"dx.graphic.2d","dx.mouse.position.lock.api|dx.mouse.position.lock.message","dx.keypad.state.api|dx.keypad.api","",0)9 [7 F0 o0 m% N; m2 ^
& P" M/ k$ J$ w8 t+ C" Z: z) Qdm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","",0)
4 d# T3 n3 |4 G4 X5 M6 P" X7 H& W7 g9 N1 l
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","dx.public.disable.window.size|dx.public.disable.window.minmax",0)
+ f; R; J7 ?" m$ g7 i' }/ }% i2 E
0 a# S, H. r4 J- c& ]dm_ret = dm.BindWindowEx(hwnd,"dx2","windows3","windows","dx.mouse.position.lock.api",0). A: c' l" ]# n% N9 T9 t# M% Y; H
等等., q6 I D6 P1 Z6 T
7 f6 D: ?. u- k5 ~) y注意:; X9 R8 X* t3 m1 C
: \- M& N; |9 m2 ]# B0 Z绑定之后,所有的坐标都相对于窗口的客户区坐标(不包含窗口边框)* h. ^4 L+ y' ^
另外,绑定窗口后,必须加以下代码,以保证所有资源正常释放; }( E7 a3 v( W5 M) a4 J
这个函数的意思是在脚本结束时,会调用这个函数。需要注意的是,目前的按键版本对于这个函数的执行不是线程级别的,也就是说,这个函数只会在主线程执行,子线程绑定的大漠对象,不保证完全释放。高级语言中则需要自己控制在适当的时候解除绑定.
( P; Y; O1 { }: l& aSub OnScriptExit()7 D. g4 m: t. Y' A; h, e( H3 a
dm_ret = dm.UnBindWindow() + h* N% @8 C$ t' z4 M4 P6 h
End Sub7 \0 W1 ]4 K% e, b0 I0 _! J
另外 绑定dx会比较耗时间,请不要频繁调用此函数.
" F8 `' h0 \0 Y还有一点特别要注意的是,有些窗口绑定之后必须加一定的延时,否则后台也无效.一般1秒到2秒的延时就足够., j* m9 @7 |" d% V" I
7 E$ J3 R0 p$ h
发现绑定失败的几种可能(一般是需要管理员权限的模式才有可能会失败)% P9 g. z0 }; y2 z) z' l7 Z' a; y
1. 系统登录的帐号必须有Administrators权限 2. 一些防火墙会防止插件注入窗口所在进程,比如360防火墙等,必须把dm.dll设置为信任. 3. 还有一个比较弱智的可能性,那就是插件没有注册到系统中,这时CreateObject压根就是失败的. 检测对象是否创建成功很简单,如下代码 set dm = createobject("dm.dmsoft")) O7 D; H8 c/ m' L# Y) L
ver = dm.Ver()/ w. _- a! X' C9 m
If len(ver) = 0 Then
) Q8 S7 x* |3 N6 a MessageBox "创建对象失败,检查系统是否禁用了vbs脚本权限"# ?4 I5 R' m/ J1 X
EndScript
' K% f( [) a! V1 _End If 4. 在沙盘中开的窗口,绑定一些需要管理员权限的模式,会失败。
; [ M7 V; v* R* V解决方法是要配置沙盘参数,参考如何配置沙盘参数.. z' ^+ ?2 s7 E3 e
9 A# ?+ Y( p5 Q1 N$ A9 G
5. 窗口所在进程有保护,这个我也无能为力. 4 ?3 o% e3 o2 x* A6 b' P' N
* O# T5 o/ f4 _
|