|
BindWindowEx函数简介: 绑定指定的窗口,并指定这个窗口的屏幕颜色获取方式,鼠标仿真模式,键盘仿真模式 高级用户使用.0 Q. d2 M: D7 W3 l
函数原型:( }5 b. B- _6 b* R# g
5 w* u( T/ j, J- b- y$ P; T5 clong BindWindowEx(hwnd,display,mouse,keypad,public,mode)7 s5 [& f6 a/ e- F- E8 B
$ W! O- \9 P4 G q8 u5 G
m( m6 F2 c9 O* r& u, w3 R( k C( J7 B' n
' j4 J1 w6 M! |1 y& e
易语言调用BindWindowEx命令见下图
& @; W% D9 K4 O3 ]
4 U0 Q0 A3 [$ o! d: D
1 j j5 B7 D3 _' L1 |0 S% r2 }2 ~3 R Z
2 O: a. _+ {1 w+ f! A- b" P' w" I
" d8 Q$ H) T; C2 ~7 |9 ?+ J& a
0 a6 T+ {4 @ `4 u, J; ]7 s* ]& }1 p$ F3 N* k
* N$ v- m, J% y7 ^9 ]6 @& d7 O) j9 H
参数定义:: h6 h- I; M* ]" f' e6 o
9 }" n! j8 R1 P8 Q( E/ }hwnd 整形数: 指定的窗口句柄
9 i% e' Q1 K( P* b. Z) t8 ^9 V: i# R; Y* e$ S2 H
display 字符串: 屏幕颜色获取方式 取值有以下几种0 n! [# m/ v" x, W) F- K4 H; r a
3 ?4 j) ?3 d2 P# E"normal" : 正常模式,平常我们用的前台截屏模式5 j4 F- |2 s) k: j* i
- l" k9 M) U k! F0 I
"gdi" : gdi模式,用于窗口采用GDI方式刷新时. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。 5 y. j/ G7 u# }9 R( W
"gdi2" : gdi2模式,此模式兼容性较强,但是速度比gdi模式要慢许多,如果gdi模式发现后台不刷新时,可以考虑用gdi2模式.) ^0 d9 u" a3 Q: A# x
9 x& u3 m& x6 P: k' y/ y) E$ q: g"dx2" : dx2模式,用于窗口采用dx模式刷新,如果dx方式会出现窗口进程崩溃的状况,可以考虑采用这种.采用这种方式要保证窗口有一部分在屏幕外.win7 win8或者vista不需要移动也可后台. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。 1 z" c, I2 m5 c: S
"dx3" : dx3模式,同dx2模式,但是如果发现有些窗口后台不刷新时,可以考虑用dx3模式,此模式比dx2模式慢许多. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。" e% A7 v B9 E4 a1 L4 n5 `
3 u; ~9 }+ {5 c4 b+ d- \
dx模式,用于窗口采用dx模式刷新,取值可以是以下任意组合,组合采用"|"符号进行连接. 支持BindWindow中的缩写模式. 比如dx代表" dx.graphic.2d| dx.graphic.3d"! B# W; f0 L% Y8 P
1. "dx.graphic.2d" 2d窗口的dx图色模式
}9 |5 S7 ` J$ Z. S2 E2. "dx.graphic.2d.2" 2d窗口的dx图色模式 是dx.graphic.2d的增强模式.兼容性更好.' h$ }* Y6 i4 E3 F7 x
3. "dx.graphic.3d" 3d窗口的dx图色模式,
" f& v9 k, D. \& I1 R! k1 D4. "dx.graphic.3d.8" 3d窗口的dx8图色模式, 此模式对64位进程无效.
& H7 N& ^; x* T) E# m1 A6 s5. "dx.graphic.opengl" 3d窗口的opengl图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.
( v2 E, R7 ]; b/ z7 ]$ S% m" n6. "dx.graphic.opengl.esv2" 3d窗口的opengl_esv2图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.
9 Y! Y+ q; _% i$ C' ^5 O7. "dx.graphic.3d.10plus" 3d窗口的dx10 dx11图色模式
/ e$ r0 ^% T0 h+ k9 x/ {) z# Q |: }0 Z, `7 Z* M
mouse 字符串: 鼠标仿真模式 取值有以下几种
% j9 U4 P0 t( F2 |0 t) r. p; \1 K$ @+ T$ g T4 X
"normal" : 正常模式,平常我们用的前台鼠标模式
4 v; |8 V& ]' d0 h& |
7 B: U9 f3 j: A" [: M z* ["windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.' U0 {3 y. C) R, v* R0 b
"windows3": Windows3模式,采取模拟windows消息方式,可以支持有多个子窗口的窗口后台
0 K5 T P& E% M8 ]" M3 q+ k! e, Q( sdx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式,比如windows2代表"dx.mouse.position.lock.api|dx.mouse.position.lock.message|dx.mouse.state.message"! M6 }& j$ j; g E6 V2 O/ s
1. "dx.mouse.position.lock.api" 此模式表示通过封锁系统API,来锁定鼠标位置.
. k+ L) l) G. j9 g, a2. "dx.mouse.position.lock.message" 此模式表示通过封锁系统消息,来锁定鼠标位置.
" c6 ^8 C. ^# w3. "dx.mouse.focus.input.api" 此模式表示通过封锁系统API来锁定鼠标输入焦点.
6 M8 G4 }! p1 S, @" t1 v4. "dx.mouse.focus.input.message"此模式表示通过封锁系统消息来锁定鼠标输入焦点.
{9 `: x$ [/ e, j+ r* k- ^( P' Y5. "dx.mouse.clip.lock.api" 此模式表示通过封锁系统API来锁定刷新区域。注意,使用这个模式,在绑定前,必须要让窗口完全显示出来.
# v' ?6 u' I( w' E& S5 l* `% G6. "dx.mouse.input.lock.api" 此模式表示通过封锁系统API来锁定鼠标输入接口.
! ~% j; U5 q) D* g7. "dx.mouse.state.api" 此模式表示通过封锁系统API来锁定鼠标输入状态.! ^6 Y. v7 @4 Y1 u
8. "dx.mouse.state.message" 此模式表示通过封锁系统消息来锁定鼠标输入状态.+ S. ~2 L1 ~# U. @0 |* y
9. "dx.mouse.api" 此模式表示通过封锁系统API来模拟dx鼠标输入.' e X2 ^! _) u' A: P
10. "dx.mouse.cursor" 开启此模式,可以后台获取鼠标特征码. * z& i* `) ?6 k( t3 ?. B( N
11. "dx.mouse.raw.input" 有些窗口需要这个才可以正常操作鼠标.
5 L; H5 _( Y" q12. "dx.mouse.input.lock.api2" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.# e7 v7 \" I( n" `
13. "dx.mouse.input.lock.api3" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性. ( q& J; D1 g, q
0 z1 X+ j6 c; \( |/ {keypad 字符串: 键盘仿真模式 取值有以下几种. d. s3 V% G- q+ L3 @+ L
4 c5 t2 _. ]3 ~6 d"normal" : 正常模式,平常我们用的前台键盘模式
: a& T7 I% q& l2 s, `+ \7 v8 }
' g+ I6 E/ T% ]1 y1 M! E"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.
# Y; A1 A. }: o# ^/ |" I I# M. @4 C& j
dx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式.比如dx代表" dx.public.active.api|dx.public.active.message| dx.keypad.state.api|dx.keypad.api|dx.keypad.input.lock.api"
/ X6 a5 f4 K( N: _" C0 r1. "dx.keypad.input.lock.api" 此模式表示通过封锁系统API来锁定键盘输入接口.+ n- f7 F% f4 Z& w
2. "dx.keypad.state.api" 此模式表示通过封锁系统API来锁定键盘输入状态.8 N1 I, }, `' u
3. "dx.keypad.api" 此模式表示通过封锁系统API来模拟dx键盘输入.
7 i8 H% k4 J5 N9 x1 S4. "dx.keypad.raw.input" 有些窗口需要这个才可以正常操作键盘.
6 C) M# ? y4 ^7 V+ ^$ `1 P# k
! p7 Q% z2 R ]6 Lpublic 字符串: 公共属性 dx模式共有
" y7 d+ i! G* r; G6 D: i! a5 O8 m, ^7 ]" s! M0 |( h/ y+ D; ?- u; S
取值可以是以下任意组合. 组合采用"|"符号进行连接 这个值可以为空
O* D$ v/ {, G4 K! [1. "dx.public.active.api" 此模式表示通过封锁系统API来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. ) A" t( u1 {; Q2 T N
2. "dx.public.active.message" 此模式表示通过封锁系统消息来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. 另外如果要让此模式生效,必须在绑定前,让绑定窗口处于激活状态,否则此模式将失效. 比如dm.SetWindowState hwnd,1 然后再绑定.6 M* P( O7 D- s" G
3. "dx.public.disable.window.position" 此模式将锁定绑定窗口位置.不可与"dx.public.fake.window.min"共用.
$ n; b8 @ X0 L9 }/ D! [4. "dx.public.disable.window.size" 此模式将锁定绑定窗口,禁止改变大小. 不可与"dx.public.fake.window.min"共用.: O% k* H6 j5 c D6 p* S
5. "dx.public.disable.window.minmax" 此模式将禁止窗口最大化和最小化,但是付出的代价是窗口同时也会被置顶. 不可与"dx.public.fake.window.min"共用.
9 L/ g# @6 F3 x; Y w! P+ D- ^6. "dx.public.fake.window.min" 此模式将允许目标窗口在最小化状态时,仍然能够像非最小化一样操作.. 另注意,此模式会导致任务栏顺序重排,所以如果是多开模式下,会看起来比较混乱,建议单开使用,多开不建议使用. 同时此模式不是万能的,有些情况下最小化以后图色会不刷新或者黑屏.
+ K& K8 }( I& Y7. "dx.public.hide.dll" 此模式将会隐藏目标进程的大漠插件,避免被检测..另外使用此模式前,请仔细做过测试,此模式可能会造成目标进程不稳定,出现崩溃。1 i% E, `9 _7 [. w; u2 ]9 l
8. "dx.public.active.api2" 此模式表示通过封锁系统API来锁定窗口激活状态. 部分窗口遮挡无法后台,需要这个属性.
8 m3 L4 k8 T0 C9. "dx.public.input.ime" 此模式是配合SendStringIme使用. 具体可以查看SendStringIme接口.
6 J3 V7 B9 C9 k+ l10 "dx.public.graphic.protect" 此模式可以保护dx图色不被恶意检测.同时对dx.keypad.api和dx.mouse.api也有保护效果.: V$ } a# o7 P
11 "dx.public.disable.window.show" 禁止目标窗口显示,这个一般用来配合dx.public.fake.window.min来使用. ' B% t2 W4 R. y* }% o3 U* {
12 "dx.public.anti.api" 此模式可以突破部分窗口对后台的保护.. I; G" l& d' Y. n
13 "dx.public.km.protect" 此模式可以保护dx键鼠不被恶意检测.最好配合dx.public.anti.api一起使用. 此属性可能会导致部分后台功能失效.
* M8 H& v) ], f L0 H14 "dx.public.prevent.block" 绑定模式1 3 5 7 101 103下,可能会导致部分窗口卡死. 这个属性可以避免卡死.
* L+ d7 c4 I" O15 "dx.public.ori.proc" 此属性只能用在模式0 1 2 3和101下. 有些窗口在不同的界面下(比如登录界面和登录进以后的界面),键鼠的控制效果不相同. 那可以用这个属性来尝试让保持一致. 注意的是,这个属性不可以滥用,确保测试无问题才可以使用. 否则可能会导致后台失效., }# ^3 \# {' V
16 "dx.public.down.cpu" 此模式可以配合DownCpu来降低目标进程CPU占用. 当图色方式降低CPU无效时,可以尝试此种方式.+ \% b/ T$ y- `$ I
17 "dx.public.focus.message" 当后台绑定后,后台无法正常在焦点窗口输入文字时,可以尝试加入此属性. 此属性会强制键盘消息发送到焦点窗口. 慎用此模式,此模式有可能会导致后台键盘在某些情况下失灵.( S2 [+ i8 o' ?8 {; B* W+ @* s
18 "dx.public.graphic.speed" 只针对图色中的dx模式有效.此模式会牺牲目标窗口的性能,来提高DX图色速度,尤其是目标窗口刷新很慢时,这个参数就很有用了.
3 x; k- r0 L$ P, ^9 g& n19 "dx.public.memory" 让本对象突破目标进程防护,可以正常使用内存接口. 当用此方式使用内存接口时,内存接口的速度会取决于目标窗口的刷新率.- M* V6 x2 X1 [
20 "dx.public.inject.super" 突破某些难以绑定的窗口. 此属性仅对除了模式0和2的其他模式有效.
! o4 c* j* H/ h$ r. |0 P21 "dx.public.hack.speed" 类似变速齿轮,配合接口HackSpeed使用& F* ]2 F; g& v( a
2 M/ d: f" B/ t$ Y: j* ^mode 整形数: 模式。取值有以下几种 0 : 推荐模式此模式比较通用,而且后台效果是最好的.
! i& `7 q+ o& G7 T' @- l4 ^; x 2 : 同模式0,如果模式0有崩溃问题,可以尝试此模式. 注意0和2模式,当主绑定(第一个绑定同个窗口的对象)绑定成功后,那么调用主绑定的线程必须一直维持,否则线程一旦推出,对应的绑定也会消失.
( i, W2 } r! l( D% A7 C 101 : 超级绑定模式. 可隐藏目标进程中的dm.dll.避免被恶意检测.效果要比dx.public.hide.dll好. 推荐使用.
# k9 v& u2 J9 w" u0 L 103 : 同模式101,如果模式101有崩溃问题,可以尝试此模式.
* m& F9 a# f/ l# N8 _' `1 L! \% P7 O* V
11 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统, j( _0 O0 U7 k8 E
, f) g$ a3 K$ c 13 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统7 r5 i- v4 b6 q! f% o; q
需要注意的是: 模式101 103在大部分窗口下绑定都没问题。但也有少数特殊的窗口,比如有很多子窗口的窗口,对于这种窗口,在绑定时,一定要把鼠标指向一个可以输入文字的窗口,比如一个文本框,最好能激活这个文本框,这样可以保证绑定的成功.
4 \2 p0 q/ G& k T; B返回值:; X; n1 R9 K" m0 @) |" D7 s E1 S+ r
整形数:, Q. N% p6 `5 r5 X0 X# j" c
0: 失败+ H# X5 j* I& X: j2 \% k( A
1: 成功- f0 a& x! \5 o0 {& [) @7 P
& D4 l( d$ N8 m' J
如果返回0,可以调用GetLastError来查看具体失败错误码,帮助分析问题." J8 v1 H9 d. [
示例:
: D% T q2 _2 u1 c. M+ j9 f7 Z1 o1 X6 [- G, o I; G3 t6 I
比如
/ I/ c5 j# f( W& N2 F9 f: {/ z4 cdm_ret = dm.BindWindowEx(hwnd,"normal","dx.mouse.position.lock.api|dx.mouse.position.lock.message","windows","dx.public.active.api",0)
0 U5 Q+ b- Q; L5 n& Y+ Y# P
6 R+ J- t/ R1 j3 @5 b; [dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","normal","dx.public.active.api",0)
I# @" n+ g/ g7 p1 o0 z8 R" M ' R+ @1 E5 \* g$ `5 V# w
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)0 ^8 b9 Z/ T4 }6 }7 E! M6 m/ a
' j1 b7 R$ n0 h' Gdm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","",0)- f; y( o) `) E' r O8 g
, D; _9 b, S) p" k, O' W+ ?
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","dx.public.disable.window.size|dx.public.disable.window.minmax",0)
* n6 E B. q8 D% w * \5 o! G. P! ~) i5 @7 i
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows3","windows","dx.mouse.position.lock.api",0)9 W- J# d L. G- c" ^7 C
等等.& X6 M2 I8 x) m- G/ Z
: Q4 M8 g+ F; u注意:: R' B7 K* E, V
! t* y6 K/ Z# R绑定之后,所有的坐标都相对于窗口的客户区坐标(不包含窗口边框), T% V( T5 C! N7 |8 {) E F
另外,绑定窗口后,必须加以下代码,以保证所有资源正常释放, m, c3 Y7 [1 j W
这个函数的意思是在脚本结束时,会调用这个函数。需要注意的是,目前的按键版本对于这个函数的执行不是线程级别的,也就是说,这个函数只会在主线程执行,子线程绑定的大漠对象,不保证完全释放。高级语言中则需要自己控制在适当的时候解除绑定.
/ C& g+ L( C# [) H0 u8 Y7 I2 i) lSub OnScriptExit()
/ x! W3 @. ?+ w4 U/ ?8 o* l dm_ret = dm.UnBindWindow() ; o: w: `' h8 |: D- N, M {; C B
End Sub
$ \9 h$ H/ G6 I$ X+ u8 S$ q$ N另外 绑定dx会比较耗时间,请不要频繁调用此函数.
; @# j( G! ]5 j# ^还有一点特别要注意的是,有些窗口绑定之后必须加一定的延时,否则后台也无效.一般1秒到2秒的延时就足够.
& q; {! G* W/ v/ t5 ^& N
3 a- |% i' }1 X6 E发现绑定失败的几种可能(一般是需要管理员权限的模式才有可能会失败)
7 Z9 k/ e+ }0 `- [, \1. 系统登录的帐号必须有Administrators权限 2. 一些防火墙会防止插件注入窗口所在进程,比如360防火墙等,必须把dm.dll设置为信任. 3. 还有一个比较弱智的可能性,那就是插件没有注册到系统中,这时CreateObject压根就是失败的. 检测对象是否创建成功很简单,如下代码 set dm = createobject("dm.dmsoft")6 x7 M) `3 Q* B% e
ver = dm.Ver(). X% Y; Q1 b( V% f; @
If len(ver) = 0 Then
3 \' e3 @: v8 d) v+ G MessageBox "创建对象失败,检查系统是否禁用了vbs脚本权限"" T. a. t% x6 Q* D C
EndScript
( N+ W& \& w) C9 V) QEnd If 4. 在沙盘中开的窗口,绑定一些需要管理员权限的模式,会失败。 S$ p: ]6 ~3 ?' @5 F+ d6 I
解决方法是要配置沙盘参数,参考如何配置沙盘参数.
, w- `+ p. C7 }! D7 \- K+ F E( L- T- e
5. 窗口所在进程有保护,这个我也无能为力.
0 ]. c- m# N$ | L
, t5 O# l( ^9 {, i! _ |