BindWindowEx函数简介: 绑定指定的窗口,并指定这个窗口的屏幕颜色获取方式,鼠标仿真模式,键盘仿真模式 高级用户使用.8 @* x7 d8 e5 D0 Z0 }; n( Y. t
函数原型:8 I' k& f/ w2 }' G) z# t% s
, Y. p& ~$ c, I* B$ Olong BindWindowEx(hwnd,display,mouse,keypad,public,mode)
" E6 E8 B: L9 J3 W
; z& C% H& e. C$ z) D
k1 W5 T1 H+ L; p6 p7 l, ~7 W# e3 B! |5 }
6 g3 S4 j( I2 q& F2 j易语言调用BindWindowEx命令见下图
+ S! V5 k e: J4 S; |+ p5 f9 B* I% `/ Z3 ~
8 V9 W% o5 W; g
& `6 F& }& Q* S5 J- w: I. d
Q( L6 [" Y9 E$ y
: x7 A. @6 U: a. b& T, S1 p. f/ R" A
* k0 r) T2 B3 \
" \+ _) p) n- Z: ?0 I: j
参数定义:
F2 ]; n$ M/ C* ^' u1 E* B! S8 ?+ T
hwnd 整形数: 指定的窗口句柄# q! E, g3 h9 h
1 O- R9 k2 O1 X1 V: y0 Y& I; O
display 字符串: 屏幕颜色获取方式 取值有以下几种: b4 |3 { R) E! u
6 Z; ?1 ~2 `2 E C
"normal" : 正常模式,平常我们用的前台截屏模式& d4 S2 s c6 d. @ J. o# M, z
0 C& E& F, d4 I8 R, D
"gdi" : gdi模式,用于窗口采用GDI方式刷新时. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
' a! M1 P0 T5 B) r% q4 ]"gdi2" : gdi2模式,此模式兼容性较强,但是速度比gdi模式要慢许多,如果gdi模式发现后台不刷新时,可以考虑用gdi2模式.
) d) T$ C1 W# N- i0 r
) M6 J! b8 v0 J' {"dx2" : dx2模式,用于窗口采用dx模式刷新,如果dx方式会出现窗口进程崩溃的状况,可以考虑采用这种.采用这种方式要保证窗口有一部分在屏幕外.win7 win8或者vista不需要移动也可后台. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
% B4 j( B8 q( @9 Y"dx3" : dx3模式,同dx2模式,但是如果发现有些窗口后台不刷新时,可以考虑用dx3模式,此模式比dx2模式慢许多. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
& D) H: C. H2 _0 L! q
1 M8 A2 N, T' V$ J. Tdx模式,用于窗口采用dx模式刷新,取值可以是以下任意组合,组合采用"|"符号进行连接. 支持BindWindow中的缩写模式. 比如dx代表" dx.graphic.2d| dx.graphic.3d"# v/ j U- V$ y0 J7 F. H7 ?9 `
1. "dx.graphic.2d" 2d窗口的dx图色模式
2 l- F# I% t1 ]6 y5 A U8 H2. "dx.graphic.2d.2" 2d窗口的dx图色模式 是dx.graphic.2d的增强模式.兼容性更好.. {+ B6 g+ X9 `& B/ _; k
3. "dx.graphic.3d" 3d窗口的dx图色模式,
; C2 N! U* j7 f( U4 b2 P4. "dx.graphic.3d.8" 3d窗口的dx8图色模式, 此模式对64位进程无效.6 g8 T0 x" Y E- N
5. "dx.graphic.opengl" 3d窗口的opengl图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢. ' ~* T6 x& Z0 ~6 }& q5 P
6. "dx.graphic.opengl.esv2" 3d窗口的opengl_esv2图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.7 A. }9 ?9 m) e; |
7. "dx.graphic.3d.10plus" 3d窗口的dx10 dx11图色模式
p% k# g4 K) k! h$ g% f( q
8 [6 \2 j s, W# jmouse 字符串: 鼠标仿真模式 取值有以下几种
: o. ~9 ~% n: \8 \. k
$ L7 F, y5 n- j Z: y& B"normal" : 正常模式,平常我们用的前台鼠标模式
2 s& H0 Q: C) t% t- X% k4 ^& y d' r
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.
9 f; @3 v) ~0 O; t0 l; e9 }"windows3": Windows3模式,采取模拟windows消息方式,可以支持有多个子窗口的窗口后台
g8 e; j$ N" o/ \1 \) P% J; Y/ K9 odx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式,比如windows2代表"dx.mouse.position.lock.api|dx.mouse.position.lock.message|dx.mouse.state.message"
8 J- h) F1 ^& n4 A9 _ P& ]1. "dx.mouse.position.lock.api" 此模式表示通过封锁系统API,来锁定鼠标位置.
$ a) S& e& \6 [" O9 s; Q# j! P2. "dx.mouse.position.lock.message" 此模式表示通过封锁系统消息,来锁定鼠标位置.3 ]) [, r5 U! F/ U+ f: e8 u
3. "dx.mouse.focus.input.api" 此模式表示通过封锁系统API来锁定鼠标输入焦点.
0 S. F+ H, o4 t/ M) Z& ?; i9 ?4. "dx.mouse.focus.input.message"此模式表示通过封锁系统消息来锁定鼠标输入焦点.
9 Q: u8 }3 O9 k& v. K! w$ G$ U5. "dx.mouse.clip.lock.api" 此模式表示通过封锁系统API来锁定刷新区域。注意,使用这个模式,在绑定前,必须要让窗口完全显示出来.9 ~: D* @( Z/ F
6. "dx.mouse.input.lock.api" 此模式表示通过封锁系统API来锁定鼠标输入接口.1 h( c. R2 I1 y
7. "dx.mouse.state.api" 此模式表示通过封锁系统API来锁定鼠标输入状态.
' U9 h' D& V: a; B8. "dx.mouse.state.message" 此模式表示通过封锁系统消息来锁定鼠标输入状态.- g% [+ ]) F! P/ ?+ H' p7 M0 r
9. "dx.mouse.api" 此模式表示通过封锁系统API来模拟dx鼠标输入.0 y6 k( c( e# f' g3 \
10. "dx.mouse.cursor" 开启此模式,可以后台获取鼠标特征码.
" d0 L+ W q' }3 }11. "dx.mouse.raw.input" 有些窗口需要这个才可以正常操作鼠标.
; V& S- _3 [" J$ O12. "dx.mouse.input.lock.api2" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.
, J+ @2 `* P9 L1 M- P& `- t2 Z0 D13. "dx.mouse.input.lock.api3" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性. ! c5 r0 {9 _/ ]
J0 I; U0 B; _6 f2 @. d# D Z0 p( g
keypad 字符串: 键盘仿真模式 取值有以下几种7 C4 {; U3 m$ |/ G3 j
8 k, G7 f2 N; e( ~) y"normal" : 正常模式,平常我们用的前台键盘模式 U! R& [9 I& S+ p* i
; {' v- N! s& N
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.
: {3 \! ^+ N! P0 N7 \( F+ g) f% J2 r* g5 I& e' O6 w! M
dx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式.比如dx代表" dx.public.active.api|dx.public.active.message| dx.keypad.state.api|dx.keypad.api|dx.keypad.input.lock.api"
" D5 X* _7 E1 g/ ~: M O' y1. "dx.keypad.input.lock.api" 此模式表示通过封锁系统API来锁定键盘输入接口.
" V0 u0 ~& W. `. r2. "dx.keypad.state.api" 此模式表示通过封锁系统API来锁定键盘输入状态.
- y; R: R8 g8 o* t3. "dx.keypad.api" 此模式表示通过封锁系统API来模拟dx键盘输入.
3 I( n/ r2 i8 y, G0 [) c% Z: _; P4. "dx.keypad.raw.input" 有些窗口需要这个才可以正常操作键盘.1 B9 @- z$ b7 c* J
( Z2 E9 [ T6 f7 S/ wpublic 字符串: 公共属性 dx模式共有
! ]' W& E2 a5 F, ]( _9 M8 P; R$ Q+ B: C* ^5 D1 f' ~ f# R
取值可以是以下任意组合. 组合采用"|"符号进行连接 这个值可以为空
, J, {$ f- L% i8 b* E" j1. "dx.public.active.api" 此模式表示通过封锁系统API来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. 9 k0 ]' F+ j, h2 H( L8 l
2. "dx.public.active.message" 此模式表示通过封锁系统消息来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. 另外如果要让此模式生效,必须在绑定前,让绑定窗口处于激活状态,否则此模式将失效. 比如dm.SetWindowState hwnd,1 然后再绑定.
% P" c( V# ?' I1 ?& _3. "dx.public.disable.window.position" 此模式将锁定绑定窗口位置.不可与"dx.public.fake.window.min"共用., c, b6 p: F0 O% ?) ?0 b
4. "dx.public.disable.window.size" 此模式将锁定绑定窗口,禁止改变大小. 不可与"dx.public.fake.window.min"共用.
; _4 |, v: V4 C; M5 N5. "dx.public.disable.window.minmax" 此模式将禁止窗口最大化和最小化,但是付出的代价是窗口同时也会被置顶. 不可与"dx.public.fake.window.min"共用.9 S& h' z8 {6 S0 @# u
6. "dx.public.fake.window.min" 此模式将允许目标窗口在最小化状态时,仍然能够像非最小化一样操作.. 另注意,此模式会导致任务栏顺序重排,所以如果是多开模式下,会看起来比较混乱,建议单开使用,多开不建议使用. 同时此模式不是万能的,有些情况下最小化以后图色会不刷新或者黑屏.. N3 j6 V( S: \8 u1 A
7. "dx.public.hide.dll" 此模式将会隐藏目标进程的大漠插件,避免被检测..另外使用此模式前,请仔细做过测试,此模式可能会造成目标进程不稳定,出现崩溃。2 d; r- i( O* U3 a. ]
8. "dx.public.active.api2" 此模式表示通过封锁系统API来锁定窗口激活状态. 部分窗口遮挡无法后台,需要这个属性.
1 }" L& A8 r- i" }- i4 U9. "dx.public.input.ime" 此模式是配合SendStringIme使用. 具体可以查看SendStringIme接口.
6 K Z% |" e8 a4 ]2 a- A10 "dx.public.graphic.protect" 此模式可以保护dx图色不被恶意检测.同时对dx.keypad.api和dx.mouse.api也有保护效果.
: l$ u- G- q2 C11 "dx.public.disable.window.show" 禁止目标窗口显示,这个一般用来配合dx.public.fake.window.min来使用. ; b+ ^4 L3 G+ ~) d' y; |" |9 V
12 "dx.public.anti.api" 此模式可以突破部分窗口对后台的保护.
( z5 e4 H2 s3 J13 "dx.public.km.protect" 此模式可以保护dx键鼠不被恶意检测.最好配合dx.public.anti.api一起使用. 此属性可能会导致部分后台功能失效.
8 A# ]6 ^4 I( q g" @5 V3 R8 b14 "dx.public.prevent.block" 绑定模式1 3 5 7 101 103下,可能会导致部分窗口卡死. 这个属性可以避免卡死.# ~7 @8 @& W; P1 V2 p' C7 U' ^7 W
15 "dx.public.ori.proc" 此属性只能用在模式0 1 2 3和101下. 有些窗口在不同的界面下(比如登录界面和登录进以后的界面),键鼠的控制效果不相同. 那可以用这个属性来尝试让保持一致. 注意的是,这个属性不可以滥用,确保测试无问题才可以使用. 否则可能会导致后台失效.
6 `; J2 d! B; u16 "dx.public.down.cpu" 此模式可以配合DownCpu来降低目标进程CPU占用. 当图色方式降低CPU无效时,可以尝试此种方式./ v7 t% C' N3 e5 ^3 d8 ^
17 "dx.public.focus.message" 当后台绑定后,后台无法正常在焦点窗口输入文字时,可以尝试加入此属性. 此属性会强制键盘消息发送到焦点窗口. 慎用此模式,此模式有可能会导致后台键盘在某些情况下失灵.# f- \" ]8 H" L* M- P7 S
18 "dx.public.graphic.speed" 只针对图色中的dx模式有效.此模式会牺牲目标窗口的性能,来提高DX图色速度,尤其是目标窗口刷新很慢时,这个参数就很有用了.
8 ^2 k3 G& s5 T% d19 "dx.public.memory" 让本对象突破目标进程防护,可以正常使用内存接口. 当用此方式使用内存接口时,内存接口的速度会取决于目标窗口的刷新率.
3 E) }5 S& \$ R- p0 Z- X20 "dx.public.inject.super" 突破某些难以绑定的窗口. 此属性仅对除了模式0和2的其他模式有效.+ |' O% @6 O: h( }" k
21 "dx.public.hack.speed" 类似变速齿轮,配合接口HackSpeed使用. R8 ^2 ]1 T! h! V
" x D' \6 M- _& m$ y* o( [6 `mode 整形数: 模式。取值有以下几种 0 : 推荐模式此模式比较通用,而且后台效果是最好的.* S) C1 R$ _1 t8 W o0 N. K& P
2 : 同模式0,如果模式0有崩溃问题,可以尝试此模式. 注意0和2模式,当主绑定(第一个绑定同个窗口的对象)绑定成功后,那么调用主绑定的线程必须一直维持,否则线程一旦推出,对应的绑定也会消失.
7 z8 Q6 b0 ?/ |3 m1 E 101 : 超级绑定模式. 可隐藏目标进程中的dm.dll.避免被恶意检测.效果要比dx.public.hide.dll好. 推荐使用.
) F; @5 j& m% ~' C: K 103 : 同模式101,如果模式101有崩溃问题,可以尝试此模式.
8 @, Z. Q3 q) e# [! k
# v) @5 F7 g# q- W. T8 H 11 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统1 S0 Z* [2 n$ U6 t5 q, N
' R# O) E: j: a+ }8 E! N- B6 T. v: O
13 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统
5 I& e1 ~* B, P. g* O, T J. p需要注意的是: 模式101 103在大部分窗口下绑定都没问题。但也有少数特殊的窗口,比如有很多子窗口的窗口,对于这种窗口,在绑定时,一定要把鼠标指向一个可以输入文字的窗口,比如一个文本框,最好能激活这个文本框,这样可以保证绑定的成功.( [- o" N) u" {& b5 Z$ L- X3 H2 ^
返回值:
$ ]. C, Z9 p6 l9 r2 j) p- D$ A整形数:
, c: a( I7 Z. L0 o" Y) Z' }0: 失败* q" r7 F0 y% w& F% y: ^0 B
1: 成功6 h& _5 ^9 J: L* |7 l2 f5 a) J
$ f; S$ R& Z& M3 @3 i* E
如果返回0,可以调用GetLastError来查看具体失败错误码,帮助分析问题.: m" l" L6 T% x/ h
示例:0 N; ]# b1 q4 x* g7 K8 ^ a0 S' V
) n( W8 `7 w: d
比如
; y: |5 O5 Q& ?- ?0 }" edm_ret = dm.BindWindowEx(hwnd,"normal","dx.mouse.position.lock.api|dx.mouse.position.lock.message","windows","dx.public.active.api",0)
' z, O5 K" c7 S& }. ]- y, k* P + i- e- [' c' t) v
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","normal","dx.public.active.api",0)
- @" c$ `- {) ~2 Q: z+ e& m2 O 8 l" s0 S! M+ |9 @. a+ j* 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)
* a) O" b5 ^7 ?3 T0 b3 H . I) R( f4 d; z, u9 `2 P. x
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","",0)
! x# Y3 m9 K: H& S; Q4 z8 v/ L
4 {! X' S: |! q, f3 Xdm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","dx.public.disable.window.size|dx.public.disable.window.minmax",0)4 R: ]; Y* t8 }( c1 W( j+ W) A
/ N: ]2 R4 T2 b ~6 n( sdm_ret = dm.BindWindowEx(hwnd,"dx2","windows3","windows","dx.mouse.position.lock.api",0)( Q6 z+ ]/ ]1 r c" z/ w
等等.1 o6 t( P6 D; O- M6 @$ o$ J
3 o5 L0 m F7 v+ B8 q1 L9 t+ @' ~' D
注意:
7 z* m( B& N1 E* v
7 K( Y2 `2 F5 a T绑定之后,所有的坐标都相对于窗口的客户区坐标(不包含窗口边框)
) `3 y* B ?3 U ^0 I* z5 ]另外,绑定窗口后,必须加以下代码,以保证所有资源正常释放
) k) k( {8 f( x8 r5 T这个函数的意思是在脚本结束时,会调用这个函数。需要注意的是,目前的按键版本对于这个函数的执行不是线程级别的,也就是说,这个函数只会在主线程执行,子线程绑定的大漠对象,不保证完全释放。高级语言中则需要自己控制在适当的时候解除绑定.
$ ^% y$ t$ `( T9 mSub OnScriptExit()
3 i; p4 W( G+ B3 u- g- f+ Q! f, M dm_ret = dm.UnBindWindow() * m) H( _, W; B; e9 K
End Sub
* d$ }- x! G1 T; N2 b$ M另外 绑定dx会比较耗时间,请不要频繁调用此函数.
; W* r# b2 N6 G# v还有一点特别要注意的是,有些窗口绑定之后必须加一定的延时,否则后台也无效.一般1秒到2秒的延时就足够.# W- ]5 t1 s3 [2 U: y8 E( w8 q4 {1 F
. S) R% U1 F) t! G发现绑定失败的几种可能(一般是需要管理员权限的模式才有可能会失败)
$ v' {1 s4 K! z2 @9 T r1. 系统登录的帐号必须有Administrators权限 2. 一些防火墙会防止插件注入窗口所在进程,比如360防火墙等,必须把dm.dll设置为信任. 3. 还有一个比较弱智的可能性,那就是插件没有注册到系统中,这时CreateObject压根就是失败的. 检测对象是否创建成功很简单,如下代码 set dm = createobject("dm.dmsoft")
: m1 {; H5 V1 k Iver = dm.Ver()
' g4 i* Y) I ^2 FIf len(ver) = 0 Then
9 Z6 ^$ h8 d" o: W/ J4 S MessageBox "创建对象失败,检查系统是否禁用了vbs脚本权限"
' O5 O- ?4 P/ s) I$ U& m& A EndScript: N$ V" f9 g* S0 h9 k7 X
End If 4. 在沙盘中开的窗口,绑定一些需要管理员权限的模式,会失败。, B1 K. B; u6 {/ ?$ X5 Q0 v ~
解决方法是要配置沙盘参数,参考如何配置沙盘参数. E8 R2 c- I, a, V4 Y
* L( l$ C3 Y8 Q; i
5. 窗口所在进程有保护,这个我也无能为力. ' R2 b0 `8 p4 w, x
$ P0 o4 S. f2 p9 R
|