|
BindWindowEx函数简介: 绑定指定的窗口,并指定这个窗口的屏幕颜色获取方式,鼠标仿真模式,键盘仿真模式 高级用户使用., O! ]3 `* M4 S7 _$ T- J0 u) D/ E! c
函数原型:6 n; m% B0 \. W I
+ \8 y8 ^1 ?2 u
long BindWindowEx(hwnd,display,mouse,keypad,public,mode)
' |5 R5 ~6 ], I# k3 n4 ^7 W' ~9 r/ f, e: b- E8 a! p( f: K
' j$ L' Q+ O j$ C( `" k1 P* h
5 [4 s. {9 K* F$ w) j8 V5 D
9 j( b) ~, ] _2 E易语言调用BindWindowEx命令见下图( g. v' g- R: q$ K; {6 c( S
1 g# W o$ C& U8 m U& @
3 D" j8 o( ~! M5 J, M0 G. Y5 R3 S! B8 I r2 |
; D5 ^9 V$ J* {7 r. g( v; ?
) K' @- N& s" g
- U- U) S& K5 @9 `) p" D& z
! d- v! S. G: `/ X4 s7 M: Q
1 w! d1 j6 K& h) k8 l) L4 `参数定义:
- Z( J3 u/ B7 z `8 c0 G. [1 L" u: R g% u5 @5 n5 U+ P
hwnd 整形数: 指定的窗口句柄
" \2 q' h4 X( w% m
0 G* I* R; P) P- a5 Ndisplay 字符串: 屏幕颜色获取方式 取值有以下几种% I6 I( a9 j7 d: Q% W
2 u; b0 q+ |& S"normal" : 正常模式,平常我们用的前台截屏模式
; y5 N; }" |: U, `' g# T( m$ E
"gdi" : gdi模式,用于窗口采用GDI方式刷新时. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
2 o# J4 C. U& ~0 J) h& G"gdi2" : gdi2模式,此模式兼容性较强,但是速度比gdi模式要慢许多,如果gdi模式发现后台不刷新时,可以考虑用gdi2模式.
" R+ X2 \5 k& K
& s+ a/ Z* c v5 F6 D0 m0 i"dx2" : dx2模式,用于窗口采用dx模式刷新,如果dx方式会出现窗口进程崩溃的状况,可以考虑采用这种.采用这种方式要保证窗口有一部分在屏幕外.win7 win8或者vista不需要移动也可后台. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
( t% W D2 p9 C9 J7 i, }! O2 ]"dx3" : dx3模式,同dx2模式,但是如果发现有些窗口后台不刷新时,可以考虑用dx3模式,此模式比dx2模式慢许多. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。& ?- D' k" s& H- J) W" n: j
* f* u8 a$ `; R- Ydx模式,用于窗口采用dx模式刷新,取值可以是以下任意组合,组合采用"|"符号进行连接. 支持BindWindow中的缩写模式. 比如dx代表" dx.graphic.2d| dx.graphic.3d"
# t. N- O, _& ]1 T1 Q1. "dx.graphic.2d" 2d窗口的dx图色模式 5 K" B3 J5 O+ O% L3 q8 K, j
2. "dx.graphic.2d.2" 2d窗口的dx图色模式 是dx.graphic.2d的增强模式.兼容性更好.
: o M, B# _* Z+ B3 t: W Y' H! O3. "dx.graphic.3d" 3d窗口的dx图色模式, . }1 @! H& |) K% ?) X1 v2 S$ x% C
4. "dx.graphic.3d.8" 3d窗口的dx8图色模式, 此模式对64位进程无效., y0 G# Y/ H5 R5 H* D4 n
5. "dx.graphic.opengl" 3d窗口的opengl图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.
( B/ K, |5 S' S& V' x6. "dx.graphic.opengl.esv2" 3d窗口的opengl_esv2图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.
6 I4 W3 O* O" ~0 g/ A7. "dx.graphic.3d.10plus" 3d窗口的dx10 dx11图色模式2 z2 l) v- |/ Z( ]6 _- }; P1 q1 k, |8 f
3 H) h. i0 g* s4 Umouse 字符串: 鼠标仿真模式 取值有以下几种
0 J9 I- O( _# U7 @0 _
6 i( Q+ o0 y$ x: Y) h3 A"normal" : 正常模式,平常我们用的前台鼠标模式
) D2 k& N, [* W2 n& E- x3 k: o! @' ]5 I5 j' Z
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.2 W8 e; P5 N% @5 F: E8 F) s
"windows3": Windows3模式,采取模拟windows消息方式,可以支持有多个子窗口的窗口后台7 ^% }8 u* ]- [
dx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式,比如windows2代表"dx.mouse.position.lock.api|dx.mouse.position.lock.message|dx.mouse.state.message"4 V) l& {7 S, |
1. "dx.mouse.position.lock.api" 此模式表示通过封锁系统API,来锁定鼠标位置.
6 Y1 ]% L4 B% k- _ R* t: w2. "dx.mouse.position.lock.message" 此模式表示通过封锁系统消息,来锁定鼠标位置.$ A+ B4 `/ ^" c* i; }! F
3. "dx.mouse.focus.input.api" 此模式表示通过封锁系统API来锁定鼠标输入焦点.
! v* Y- e2 ]; D. h3 d4. "dx.mouse.focus.input.message"此模式表示通过封锁系统消息来锁定鼠标输入焦点.3 g p7 Y* o5 a9 p
5. "dx.mouse.clip.lock.api" 此模式表示通过封锁系统API来锁定刷新区域。注意,使用这个模式,在绑定前,必须要让窗口完全显示出来.
3 w0 u2 D$ a6 u& ?: d; V; K& m( m6. "dx.mouse.input.lock.api" 此模式表示通过封锁系统API来锁定鼠标输入接口.4 m# }! u3 }( J: E& M4 v
7. "dx.mouse.state.api" 此模式表示通过封锁系统API来锁定鼠标输入状态.
! ^# ~+ f7 G" N/ h3 k; _2 V2 v: W: `8. "dx.mouse.state.message" 此模式表示通过封锁系统消息来锁定鼠标输入状态.
- q/ b. z8 R1 S7 B [/ W& S9. "dx.mouse.api" 此模式表示通过封锁系统API来模拟dx鼠标输入.
4 `# T- I l% ? Y; E10. "dx.mouse.cursor" 开启此模式,可以后台获取鼠标特征码. * e% M: f, z# I
11. "dx.mouse.raw.input" 有些窗口需要这个才可以正常操作鼠标. ! n+ F- B) B4 Z' S+ y
12. "dx.mouse.input.lock.api2" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.$ }. b$ d$ j$ B# I# f; t$ S
13. "dx.mouse.input.lock.api3" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.
0 x. z5 y8 N' m: r, | h/ `) N6 d2 X7 Z) c
keypad 字符串: 键盘仿真模式 取值有以下几种4 V4 M& V; \, D
* j4 e) i' l3 ?6 L"normal" : 正常模式,平常我们用的前台键盘模式
, u3 \' | @) l* p, A$ q1 _! S$ [0 \! o
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.2 a: t7 Z: G+ V2 r1 P: Q
0 P% ^; b" M- kdx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式.比如dx代表" dx.public.active.api|dx.public.active.message| dx.keypad.state.api|dx.keypad.api|dx.keypad.input.lock.api"
5 B2 x5 U9 b' s1 i- s! ~1. "dx.keypad.input.lock.api" 此模式表示通过封锁系统API来锁定键盘输入接口.
5 P( M, |. @( n2. "dx.keypad.state.api" 此模式表示通过封锁系统API来锁定键盘输入状态.3 ^2 _9 h$ X4 q+ P0 T' o3 g; a
3. "dx.keypad.api" 此模式表示通过封锁系统API来模拟dx键盘输入.
% `) k: b0 A9 ^. s6 M# o! ]4. "dx.keypad.raw.input" 有些窗口需要这个才可以正常操作键盘.; E( j3 w) N" J9 ^: T
3 z3 z' c6 U: [! l0 f+ H; epublic 字符串: 公共属性 dx模式共有 4 Q! c7 O; D) p
* C7 n% U# m5 ^) {) p1 f取值可以是以下任意组合. 组合采用"|"符号进行连接 这个值可以为空
/ u+ }4 j1 v, a/ }: |4 Q( T1. "dx.public.active.api" 此模式表示通过封锁系统API来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用.
7 {1 i9 ~2 C: t0 X2. "dx.public.active.message" 此模式表示通过封锁系统消息来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. 另外如果要让此模式生效,必须在绑定前,让绑定窗口处于激活状态,否则此模式将失效. 比如dm.SetWindowState hwnd,1 然后再绑定.$ t3 F0 s& A9 F E$ C0 ~; q
3. "dx.public.disable.window.position" 此模式将锁定绑定窗口位置.不可与"dx.public.fake.window.min"共用.- {9 T+ Y: F' E
4. "dx.public.disable.window.size" 此模式将锁定绑定窗口,禁止改变大小. 不可与"dx.public.fake.window.min"共用.
! A( |8 Z8 C6 W) V" j& D. y5 G: o5. "dx.public.disable.window.minmax" 此模式将禁止窗口最大化和最小化,但是付出的代价是窗口同时也会被置顶. 不可与"dx.public.fake.window.min"共用.2 a3 Y9 q2 g5 Y4 S
6. "dx.public.fake.window.min" 此模式将允许目标窗口在最小化状态时,仍然能够像非最小化一样操作.. 另注意,此模式会导致任务栏顺序重排,所以如果是多开模式下,会看起来比较混乱,建议单开使用,多开不建议使用. 同时此模式不是万能的,有些情况下最小化以后图色会不刷新或者黑屏.
* O7 D! {6 ]- a2 c: O7 b1 z0 K7. "dx.public.hide.dll" 此模式将会隐藏目标进程的大漠插件,避免被检测..另外使用此模式前,请仔细做过测试,此模式可能会造成目标进程不稳定,出现崩溃。/ m# {) s- S& h# F
8. "dx.public.active.api2" 此模式表示通过封锁系统API来锁定窗口激活状态. 部分窗口遮挡无法后台,需要这个属性. % j) i" @* Y$ p+ g5 ?# e& `
9. "dx.public.input.ime" 此模式是配合SendStringIme使用. 具体可以查看SendStringIme接口.
; K8 z0 }( A& w7 j3 }10 "dx.public.graphic.protect" 此模式可以保护dx图色不被恶意检测.同时对dx.keypad.api和dx.mouse.api也有保护效果.7 d0 X$ t; M; r4 B, s
11 "dx.public.disable.window.show" 禁止目标窗口显示,这个一般用来配合dx.public.fake.window.min来使用. 9 n% f" k! @/ C" Y3 H* `
12 "dx.public.anti.api" 此模式可以突破部分窗口对后台的保护.
6 M+ c6 ~' M7 K7 g0 t n13 "dx.public.km.protect" 此模式可以保护dx键鼠不被恶意检测.最好配合dx.public.anti.api一起使用. 此属性可能会导致部分后台功能失效.
3 O1 Z2 y$ o/ [# k3 Z7 ?14 "dx.public.prevent.block" 绑定模式1 3 5 7 101 103下,可能会导致部分窗口卡死. 这个属性可以避免卡死.
" j2 M5 I4 o' Y$ ^15 "dx.public.ori.proc" 此属性只能用在模式0 1 2 3和101下. 有些窗口在不同的界面下(比如登录界面和登录进以后的界面),键鼠的控制效果不相同. 那可以用这个属性来尝试让保持一致. 注意的是,这个属性不可以滥用,确保测试无问题才可以使用. 否则可能会导致后台失效.( X" \; f$ M' B9 }' J: |, u
16 "dx.public.down.cpu" 此模式可以配合DownCpu来降低目标进程CPU占用. 当图色方式降低CPU无效时,可以尝试此种方式.5 q- Q2 T: q) H, E( K
17 "dx.public.focus.message" 当后台绑定后,后台无法正常在焦点窗口输入文字时,可以尝试加入此属性. 此属性会强制键盘消息发送到焦点窗口. 慎用此模式,此模式有可能会导致后台键盘在某些情况下失灵.
6 g2 q% F. d* [+ k% W* j18 "dx.public.graphic.speed" 只针对图色中的dx模式有效.此模式会牺牲目标窗口的性能,来提高DX图色速度,尤其是目标窗口刷新很慢时,这个参数就很有用了. ?, `6 A$ E+ L" J6 }3 j# s
19 "dx.public.memory" 让本对象突破目标进程防护,可以正常使用内存接口. 当用此方式使用内存接口时,内存接口的速度会取决于目标窗口的刷新率.9 G* z0 N4 O( N# A
20 "dx.public.inject.super" 突破某些难以绑定的窗口. 此属性仅对除了模式0和2的其他模式有效.
& x1 a7 z! j2 |21 "dx.public.hack.speed" 类似变速齿轮,配合接口HackSpeed使用: I" X# x& m4 s! R- k
7 _* F! G( H. Y! Dmode 整形数: 模式。取值有以下几种 0 : 推荐模式此模式比较通用,而且后台效果是最好的.
8 d1 p- e9 Z, k# d) A5 y# c 2 : 同模式0,如果模式0有崩溃问题,可以尝试此模式. 注意0和2模式,当主绑定(第一个绑定同个窗口的对象)绑定成功后,那么调用主绑定的线程必须一直维持,否则线程一旦推出,对应的绑定也会消失.
. }6 {) i$ T4 X 101 : 超级绑定模式. 可隐藏目标进程中的dm.dll.避免被恶意检测.效果要比dx.public.hide.dll好. 推荐使用.
4 S8 l! E$ v7 P# M 103 : 同模式101,如果模式101有崩溃问题,可以尝试此模式. & X* G0 X2 x! @ a" u8 `/ I: z
7 o1 |+ G$ E: f1 P7 @: A 11 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统( F$ t# X6 ~' }4 ~( O
0 P. }, G; L9 h7 ?) M3 }
13 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统
! G5 d( s. g+ a8 V, K需要注意的是: 模式101 103在大部分窗口下绑定都没问题。但也有少数特殊的窗口,比如有很多子窗口的窗口,对于这种窗口,在绑定时,一定要把鼠标指向一个可以输入文字的窗口,比如一个文本框,最好能激活这个文本框,这样可以保证绑定的成功.& v9 c3 } |- u* ^
返回值:
2 p4 L6 U$ s9 i8 [整形数:
4 \- x/ \6 j' m3 ~3 X0: 失败+ ^* f$ [) ~7 ^3 [9 Z/ d# D
1: 成功
. o8 i* f+ e8 x1 ~; I7 h, O2 x
* s; \( w! l O( U3 m! H/ h如果返回0,可以调用GetLastError来查看具体失败错误码,帮助分析问题.8 V7 L1 P3 V7 i$ Y0 B0 {% c
示例:
" g S) }* b: C, z1 @: F2 v
# d `. A. ^8 A' e. e4 Y# _8 P比如% N7 ~ z ~2 a
dm_ret = dm.BindWindowEx(hwnd,"normal","dx.mouse.position.lock.api|dx.mouse.position.lock.message","windows","dx.public.active.api",0)
R5 `' a! I6 Y& [& e- C C% a! K/ E( v/ ?! x ]
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","normal","dx.public.active.api",0)0 ^% A8 v, S6 ~8 Q
+ y9 G4 C! k! @* D: \
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); _8 D% \, b$ Q7 h4 M0 i, n2 T1 r( X
; n; E* P. m4 T. F6 ^2 fdm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","",0)7 c( F. g% O9 k6 S3 @! q/ p
, D1 ?6 S; }' h& r8 h$ l1 @2 ]3 v
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","dx.public.disable.window.size|dx.public.disable.window.minmax",0)
4 R" w* `, t: {/ w# ]
2 l2 l" e1 y3 w2 o. K# odm_ret = dm.BindWindowEx(hwnd,"dx2","windows3","windows","dx.mouse.position.lock.api",0)" W" g, U0 f1 i$ g" D" C
等等.
; ]3 {! {8 O2 O7 ~' Z5 A. `
- U! _: s( H+ Z* k7 q注意:
, E" Z9 b+ u+ l/ k( U5 P; C2 z; ?
/ S( x' H% W, m o% H8 P/ _绑定之后,所有的坐标都相对于窗口的客户区坐标(不包含窗口边框)
- F9 a+ o' \6 _0 w另外,绑定窗口后,必须加以下代码,以保证所有资源正常释放
( Z {0 z9 H+ Z3 T' B' ?) X这个函数的意思是在脚本结束时,会调用这个函数。需要注意的是,目前的按键版本对于这个函数的执行不是线程级别的,也就是说,这个函数只会在主线程执行,子线程绑定的大漠对象,不保证完全释放。高级语言中则需要自己控制在适当的时候解除绑定.
% E s: H/ Y0 DSub OnScriptExit()
) [- J1 V' y4 ?3 P, G dm_ret = dm.UnBindWindow() . u. C8 L/ m o& v( a7 F/ g3 v
End Sub8 r' R6 @0 ~* _' }' A& o
另外 绑定dx会比较耗时间,请不要频繁调用此函数.
5 V& ~: Y- D7 k# u7 D9 p还有一点特别要注意的是,有些窗口绑定之后必须加一定的延时,否则后台也无效.一般1秒到2秒的延时就足够.
! M# o U6 {/ \4 }( s- E) `( c: J
Y0 O$ h, p# |" q1 [9 C! D! Z+ ?8 q发现绑定失败的几种可能(一般是需要管理员权限的模式才有可能会失败)- h! W F: @. l1 W
1. 系统登录的帐号必须有Administrators权限 2. 一些防火墙会防止插件注入窗口所在进程,比如360防火墙等,必须把dm.dll设置为信任. 3. 还有一个比较弱智的可能性,那就是插件没有注册到系统中,这时CreateObject压根就是失败的. 检测对象是否创建成功很简单,如下代码 set dm = createobject("dm.dmsoft")/ P6 `8 A' p2 p$ S" v1 T
ver = dm.Ver(). p6 ?0 A# y+ F( D0 D/ `$ a' x# ~- C
If len(ver) = 0 Then
2 c ~: V( O0 ?, J' k MessageBox "创建对象失败,检查系统是否禁用了vbs脚本权限"
& V. t) Z" k3 v O, c EndScript* M% V& }' n, E2 v: g
End If 4. 在沙盘中开的窗口,绑定一些需要管理员权限的模式,会失败。( ]) {$ w8 h0 U4 V5 G
解决方法是要配置沙盘参数,参考如何配置沙盘参数.
0 L: c* u& f& W8 E+ ?' Q1 l
5 d6 u% d, M9 _1 l6 S a 5. 窗口所在进程有保护,这个我也无能为力. ! E( s. S p7 t' N2 w Z
& N. d! w4 d" G# z. g. Z
|