BindWindowEx函数简介: 绑定指定的窗口,并指定这个窗口的屏幕颜色获取方式,鼠标仿真模式,键盘仿真模式 高级用户使用.0 M/ \2 P- a u+ W. V% P/ v
函数原型:
1 @% K) ~5 Y; X& {& X8 V K) ^ c( U3 @: Y2 S9 \0 O
long BindWindowEx(hwnd,display,mouse,keypad,public,mode)* i1 } {5 X1 G1 e4 {3 Z! j9 G
" H; ]. o+ {5 e& I; l
' `- `; U, T( }5 p- U! {
& |/ g# m& Y1 G0 n. u
3 R% K4 G& h y2 p Y6 S+ d6 ?易语言调用BindWindowEx命令见下图
% c/ w4 Z7 m+ m* }8 L
, w. s7 x, l: h8 f
k `9 T+ I1 C7 ^
" S' E$ Y. c+ Y- ~
- ]3 U! B M1 p+ w' f
# J# h+ G2 T* |, X8 P+ C$ M+ O
" X7 K7 d" e$ ]9 {5 W
" c8 {4 f3 g: d, A. a: R$ N- r z, M4 I1 N4 y
参数定义:
% X! P/ S( j! s2 b7 V
5 Q5 r$ Z+ H! c! g' g6 \. ^hwnd 整形数: 指定的窗口句柄. o1 M& m1 [) E' g% u: O' F
- {2 V0 I. _# E3 W: D5 w: g, Q
display 字符串: 屏幕颜色获取方式 取值有以下几种
; l( O9 \" R a5 D# U
6 Z M' q- W1 Z4 H' {3 r! d" G, {"normal" : 正常模式,平常我们用的前台截屏模式# ]9 x+ V L5 T& S
% G$ d" |' E$ a& Q( _
"gdi" : gdi模式,用于窗口采用GDI方式刷新时. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
+ C/ L1 v8 ^$ k- b9 m"gdi2" : gdi2模式,此模式兼容性较强,但是速度比gdi模式要慢许多,如果gdi模式发现后台不刷新时,可以考虑用gdi2模式.* ~, G2 C! l( Q
" T: z7 k. k. l; I3 S5 Z5 V"dx2" : dx2模式,用于窗口采用dx模式刷新,如果dx方式会出现窗口进程崩溃的状况,可以考虑采用这种.采用这种方式要保证窗口有一部分在屏幕外.win7 win8或者vista不需要移动也可后台. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
) [8 a; S! I3 s$ C: L1 [- Y"dx3" : dx3模式,同dx2模式,但是如果发现有些窗口后台不刷新时,可以考虑用dx3模式,此模式比dx2模式慢许多. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。3 g* n. o! Y4 R8 }! q
7 J" p J/ Y" v0 c) _" Sdx模式,用于窗口采用dx模式刷新,取值可以是以下任意组合,组合采用"|"符号进行连接. 支持BindWindow中的缩写模式. 比如dx代表" dx.graphic.2d| dx.graphic.3d"
# r: R8 G0 ?, l1. "dx.graphic.2d" 2d窗口的dx图色模式 , S( s7 K( t$ m, o1 o# O1 i
2. "dx.graphic.2d.2" 2d窗口的dx图色模式 是dx.graphic.2d的增强模式.兼容性更好.
& J% |- Y }* _0 V& ^& S3. "dx.graphic.3d" 3d窗口的dx图色模式, * I7 o3 D, Q3 T) D7 i# E9 \; I
4. "dx.graphic.3d.8" 3d窗口的dx8图色模式, 此模式对64位进程无效.
- {" m! w6 ^% b4 H& N. I5. "dx.graphic.opengl" 3d窗口的opengl图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.
( h) `7 d ]& a6. "dx.graphic.opengl.esv2" 3d窗口的opengl_esv2图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.- \: m# B3 V! H! Q2 J P; X- i V
7. "dx.graphic.3d.10plus" 3d窗口的dx10 dx11图色模式5 F& j r" Y& ?- D$ E% d
) c, I! E, A6 P( T/ f% w5 R( `
mouse 字符串: 鼠标仿真模式 取值有以下几种
7 _- v; c6 L( [7 O P1 ~6 ]& x8 X# y7 Z0 C( c3 V) S
"normal" : 正常模式,平常我们用的前台鼠标模式
& k. \) H' S9 w- h5 ^6 P# Y" P# B% f9 B% Z6 p- E! f
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.. q3 C, ^' S( h& {- y! `& ^. f3 f$ T
"windows3": Windows3模式,采取模拟windows消息方式,可以支持有多个子窗口的窗口后台
! X, a. ?( n+ q) z3 b6 b' P) Ydx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式,比如windows2代表"dx.mouse.position.lock.api|dx.mouse.position.lock.message|dx.mouse.state.message"# {" Z6 A7 r1 i( \ H c( F
1. "dx.mouse.position.lock.api" 此模式表示通过封锁系统API,来锁定鼠标位置.& D! O/ Q& I+ x- t- E' [/ ^5 @
2. "dx.mouse.position.lock.message" 此模式表示通过封锁系统消息,来锁定鼠标位置.4 p# I4 v, N Y W
3. "dx.mouse.focus.input.api" 此模式表示通过封锁系统API来锁定鼠标输入焦点.
! y t8 W- k2 {" G5 g5 s4. "dx.mouse.focus.input.message"此模式表示通过封锁系统消息来锁定鼠标输入焦点.
# q- J9 \ f9 U- l1 V5. "dx.mouse.clip.lock.api" 此模式表示通过封锁系统API来锁定刷新区域。注意,使用这个模式,在绑定前,必须要让窗口完全显示出来.
. j4 B* C9 }$ I" m$ O( ]& U6. "dx.mouse.input.lock.api" 此模式表示通过封锁系统API来锁定鼠标输入接口.& j, j6 S' B* [5 t
7. "dx.mouse.state.api" 此模式表示通过封锁系统API来锁定鼠标输入状态.% s* X6 @5 A* V1 P+ ~
8. "dx.mouse.state.message" 此模式表示通过封锁系统消息来锁定鼠标输入状态.5 m+ A: Q0 c F# G" W# j3 C, ^9 D
9. "dx.mouse.api" 此模式表示通过封锁系统API来模拟dx鼠标输入.: Q9 w. C7 [; V( Z- |* `& g
10. "dx.mouse.cursor" 开启此模式,可以后台获取鼠标特征码. 8 q/ a( m) T% Z; [8 S
11. "dx.mouse.raw.input" 有些窗口需要这个才可以正常操作鼠标. - X5 v, g+ y: f* o+ {! A
12. "dx.mouse.input.lock.api2" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.. {* P- O" C0 L( q: A% O
13. "dx.mouse.input.lock.api3" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.
+ h; R4 Y: B" s% L) `. P1 ~9 U6 B: y4 p e/ q
keypad 字符串: 键盘仿真模式 取值有以下几种# B6 A, J2 F+ U7 f" p6 q
9 d( l5 I, H5 z8 Y4 L& _ `- S; K
"normal" : 正常模式,平常我们用的前台键盘模式
# B" r4 K8 n7 X+ i$ Q) u# y1 m) q1 }* o0 t1 ]& a) j; m
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.8 C9 d! ?, M o. S) b. K
9 J1 D2 a+ ]2 B7 x
dx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式.比如dx代表" dx.public.active.api|dx.public.active.message| dx.keypad.state.api|dx.keypad.api|dx.keypad.input.lock.api"
2 D( O& j M( p& L2 e1. "dx.keypad.input.lock.api" 此模式表示通过封锁系统API来锁定键盘输入接口.
2 E2 Q- [; P6 F3 t# n2. "dx.keypad.state.api" 此模式表示通过封锁系统API来锁定键盘输入状态.
% h3 w2 Q8 g. m+ z$ x3. "dx.keypad.api" 此模式表示通过封锁系统API来模拟dx键盘输入. : ]# v3 U" U+ D! o2 @" _' N" K4 z
4. "dx.keypad.raw.input" 有些窗口需要这个才可以正常操作键盘.) Z4 u; y( w' P7 n0 b: N) C
4 l7 c# J5 C% D( T0 lpublic 字符串: 公共属性 dx模式共有
* J. G! N# h1 [0 o' ^( _) i+ }3 t' H, A( F8 s- W, @
取值可以是以下任意组合. 组合采用"|"符号进行连接 这个值可以为空
Z. B Q2 |: O/ f( x1 c1. "dx.public.active.api" 此模式表示通过封锁系统API来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用.
/ ^, |8 w3 f2 V2. "dx.public.active.message" 此模式表示通过封锁系统消息来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. 另外如果要让此模式生效,必须在绑定前,让绑定窗口处于激活状态,否则此模式将失效. 比如dm.SetWindowState hwnd,1 然后再绑定.& K% s& C; S: w6 n
3. "dx.public.disable.window.position" 此模式将锁定绑定窗口位置.不可与"dx.public.fake.window.min"共用.
1 y8 o/ V' |, \" b4. "dx.public.disable.window.size" 此模式将锁定绑定窗口,禁止改变大小. 不可与"dx.public.fake.window.min"共用.
- e* B5 j z' S" F) t5. "dx.public.disable.window.minmax" 此模式将禁止窗口最大化和最小化,但是付出的代价是窗口同时也会被置顶. 不可与"dx.public.fake.window.min"共用.
6 m& f. z. O4 z5 L6. "dx.public.fake.window.min" 此模式将允许目标窗口在最小化状态时,仍然能够像非最小化一样操作.. 另注意,此模式会导致任务栏顺序重排,所以如果是多开模式下,会看起来比较混乱,建议单开使用,多开不建议使用. 同时此模式不是万能的,有些情况下最小化以后图色会不刷新或者黑屏.
. |3 f, ^+ d7 G& x# m+ E7. "dx.public.hide.dll" 此模式将会隐藏目标进程的大漠插件,避免被检测..另外使用此模式前,请仔细做过测试,此模式可能会造成目标进程不稳定,出现崩溃。
9 S# W; U+ r |8. "dx.public.active.api2" 此模式表示通过封锁系统API来锁定窗口激活状态. 部分窗口遮挡无法后台,需要这个属性. ( a0 z- u; Y8 Y5 x
9. "dx.public.input.ime" 此模式是配合SendStringIme使用. 具体可以查看SendStringIme接口.. c- |: T4 Q. u8 w a. Z2 z
10 "dx.public.graphic.protect" 此模式可以保护dx图色不被恶意检测.同时对dx.keypad.api和dx.mouse.api也有保护效果.
: E' U$ p, i0 _% r11 "dx.public.disable.window.show" 禁止目标窗口显示,这个一般用来配合dx.public.fake.window.min来使用.
* j0 H$ K2 ?3 d: B+ H12 "dx.public.anti.api" 此模式可以突破部分窗口对后台的保护.
2 G* e$ @5 i3 E4 l( ?# b" |* S13 "dx.public.km.protect" 此模式可以保护dx键鼠不被恶意检测.最好配合dx.public.anti.api一起使用. 此属性可能会导致部分后台功能失效.
# C6 ^! Z4 z7 q" m4 J+ o8 J1 v14 "dx.public.prevent.block" 绑定模式1 3 5 7 101 103下,可能会导致部分窗口卡死. 这个属性可以避免卡死.
0 t6 S7 Q. D. a* i2 b15 "dx.public.ori.proc" 此属性只能用在模式0 1 2 3和101下. 有些窗口在不同的界面下(比如登录界面和登录进以后的界面),键鼠的控制效果不相同. 那可以用这个属性来尝试让保持一致. 注意的是,这个属性不可以滥用,确保测试无问题才可以使用. 否则可能会导致后台失效.5 }' P' O. |8 r: ~( R% d! p/ V) d& y
16 "dx.public.down.cpu" 此模式可以配合DownCpu来降低目标进程CPU占用. 当图色方式降低CPU无效时,可以尝试此种方式.1 h5 z* K4 Z! H, [+ G
17 "dx.public.focus.message" 当后台绑定后,后台无法正常在焦点窗口输入文字时,可以尝试加入此属性. 此属性会强制键盘消息发送到焦点窗口. 慎用此模式,此模式有可能会导致后台键盘在某些情况下失灵.
# o0 N2 x/ v) ~8 C$ r- i6 x0 M18 "dx.public.graphic.speed" 只针对图色中的dx模式有效.此模式会牺牲目标窗口的性能,来提高DX图色速度,尤其是目标窗口刷新很慢时,这个参数就很有用了.
4 v* X- r9 J4 v* o. p% C/ g/ M19 "dx.public.memory" 让本对象突破目标进程防护,可以正常使用内存接口. 当用此方式使用内存接口时,内存接口的速度会取决于目标窗口的刷新率.9 g9 r/ C( _, \9 B T+ m
20 "dx.public.inject.super" 突破某些难以绑定的窗口. 此属性仅对除了模式0和2的其他模式有效.
, m9 j; Z% n6 g* G+ G8 \2 V21 "dx.public.hack.speed" 类似变速齿轮,配合接口HackSpeed使用7 `- E) E6 b/ Q e4 I/ v6 p- Y
' w5 Z, I0 F& m- N5 j. d; V
mode 整形数: 模式。取值有以下几种 0 : 推荐模式此模式比较通用,而且后台效果是最好的.. Z0 {1 b8 C: T7 B3 t% e; _* U2 L
2 : 同模式0,如果模式0有崩溃问题,可以尝试此模式. 注意0和2模式,当主绑定(第一个绑定同个窗口的对象)绑定成功后,那么调用主绑定的线程必须一直维持,否则线程一旦推出,对应的绑定也会消失.+ x/ a7 b/ o1 h x7 @- U
101 : 超级绑定模式. 可隐藏目标进程中的dm.dll.避免被恶意检测.效果要比dx.public.hide.dll好. 推荐使用.
# d) P* Q4 L9 U& I9 H+ E: e0 G c 103 : 同模式101,如果模式101有崩溃问题,可以尝试此模式.
( m; [( x" ~' { k; \8 {4 G8 ]" c- N, O
11 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统
r6 b2 G/ {' y2 m3 ?" U3 P* K9 Q: x" b+ x! i
13 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统
: j) E) O2 }, r( q/ b/ G+ V; N3 a* b需要注意的是: 模式101 103在大部分窗口下绑定都没问题。但也有少数特殊的窗口,比如有很多子窗口的窗口,对于这种窗口,在绑定时,一定要把鼠标指向一个可以输入文字的窗口,比如一个文本框,最好能激活这个文本框,这样可以保证绑定的成功.
& q+ ?& F- m7 |* t返回值:" [ X% u, k7 X9 p3 i! f" G; _
整形数:
- U; m8 a6 N# _) {9 E. J1 w0: 失败
9 i/ D& Q! X+ ^6 f0 {1: 成功( q% z k, y( I) [: g+ l- b% S+ U; x, d
) S! D# O$ F- p4 z, X9 J如果返回0,可以调用GetLastError来查看具体失败错误码,帮助分析问题.7 M9 |% W: r' ^
示例:# t2 k$ X1 g$ L. [( L
8 j* j( Q$ \+ v: y0 Z6 r/ k比如
3 V5 K: k) Z4 M; `/ cdm_ret = dm.BindWindowEx(hwnd,"normal","dx.mouse.position.lock.api|dx.mouse.position.lock.message","windows","dx.public.active.api",0)
# w: p$ W7 d' h: u$ v. c1 D* B" n
( H. U" }+ m, o! }# Gdm_ret = dm.BindWindowEx(hwnd,"dx2","windows","normal","dx.public.active.api",0). n' n! N/ X1 s' T& |2 _
4 M- G5 a; v9 p. V* ydm_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)7 S9 O, l! g5 w" U
5 [& x" C7 j. w- R* P* F" W
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","",0)* B. e2 s m6 T# U) q- @
" y+ {, a9 [8 r' `' U
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","dx.public.disable.window.size|dx.public.disable.window.minmax",0)
" q3 Z! I5 O3 D1 k2 F
8 ]# B/ g' I( P5 Y) xdm_ret = dm.BindWindowEx(hwnd,"dx2","windows3","windows","dx.mouse.position.lock.api",0)
7 L% @1 ]! b) M1 j等等.4 c3 T. d3 V4 c4 J
: d5 b0 |! |9 M注意:
0 C8 R6 t) y2 l" s4 X' j. O- F4 O- X; M) D4 \7 Y# p. J2 n
绑定之后,所有的坐标都相对于窗口的客户区坐标(不包含窗口边框)! b8 V9 r% T6 f; K1 e
另外,绑定窗口后,必须加以下代码,以保证所有资源正常释放8 M' J! K2 A5 P+ {
这个函数的意思是在脚本结束时,会调用这个函数。需要注意的是,目前的按键版本对于这个函数的执行不是线程级别的,也就是说,这个函数只会在主线程执行,子线程绑定的大漠对象,不保证完全释放。高级语言中则需要自己控制在适当的时候解除绑定.( d q7 d0 W# A g: O! l' r
Sub OnScriptExit()
3 O5 H9 K" S5 P/ C2 U dm_ret = dm.UnBindWindow() 2 V2 k7 h* f1 }6 V& i! [
End Sub3 ^, g& D) M+ u! P1 I
另外 绑定dx会比较耗时间,请不要频繁调用此函数.0 ^6 d. }0 A2 q1 ]6 ?& {# v
还有一点特别要注意的是,有些窗口绑定之后必须加一定的延时,否则后台也无效.一般1秒到2秒的延时就足够.
3 ]1 L' E; W+ f
9 @, z: B; w5 b: M3 G: S+ S发现绑定失败的几种可能(一般是需要管理员权限的模式才有可能会失败)0 b7 h- \: S. V/ Q- j9 K
1. 系统登录的帐号必须有Administrators权限 2. 一些防火墙会防止插件注入窗口所在进程,比如360防火墙等,必须把dm.dll设置为信任. 3. 还有一个比较弱智的可能性,那就是插件没有注册到系统中,这时CreateObject压根就是失败的. 检测对象是否创建成功很简单,如下代码 set dm = createobject("dm.dmsoft"); z Q# X& c( n% K
ver = dm.Ver()
# E/ t7 A, X% a6 v4 I3 U0 CIf len(ver) = 0 Then: |/ n+ {8 h3 R" v3 H7 h% @
MessageBox "创建对象失败,检查系统是否禁用了vbs脚本权限"
1 M8 F/ I! k# ~$ y5 l EndScript
8 Z9 R2 n" p" V1 tEnd If 4. 在沙盘中开的窗口,绑定一些需要管理员权限的模式,会失败。
% O; U, _' o7 I* s解决方法是要配置沙盘参数,参考如何配置沙盘参数.4 Y9 x. ]1 m+ |! W& i/ u) r
+ _* w4 [- T( M! p3 G
5. 窗口所在进程有保护,这个我也无能为力. ) r- v8 S6 D" H1 ^2 a
# G) u, V: Y7 d1 \; m5 d5 a
|