|
BindWindowEx函数简介: 绑定指定的窗口,并指定这个窗口的屏幕颜色获取方式,鼠标仿真模式,键盘仿真模式 高级用户使用.
- G) }2 g* Z/ {9 z# E5 B1 w函数原型:5 s, [' y- {6 B. L7 s) s4 c
7 c3 D1 \6 i; B, ^1 Plong BindWindowEx(hwnd,display,mouse,keypad,public,mode)
- R6 c N, x; a) d$ e* e. h- X8 Z2 r) _7 i8 _% x
' `1 Z& }) d+ {# m# h4 z$ m
( W3 L3 G7 Q. z# N) I! N9 Z% P% B$ G" [& V: a
易语言调用BindWindowEx命令见下图
1 C, ?2 z+ Q1 {" P+ E) g/ Z$ b7 R5 b6 Y
7 U! P* k) r) H) K; d7 ]* f& u8 b' T6 T- d/ W6 W( g+ {7 \
# [3 X* M/ ^( ~5 O3 E
9 a$ f) [0 A- b k& d
a! g) a8 z( g& {6 R- e1 Y0 ^$ q( w$ A+ `
3 O4 U9 u* [( S% P2 l# I
参数定义:
/ L( R% T0 C. g1 w) W
R8 n6 p" `/ f+ h3 _hwnd 整形数: 指定的窗口句柄
5 H# U- @6 ~( n/ t* E
! w, T4 R5 o( V- [: vdisplay 字符串: 屏幕颜色获取方式 取值有以下几种
8 q/ U) Y$ d# t* I$ H# q( F
3 O7 d6 z0 U7 x; ^4 |( q0 q"normal" : 正常模式,平常我们用的前台截屏模式
1 H7 l O9 s& y0 h
+ ~7 B' E6 [# E2 J8 i) H"gdi" : gdi模式,用于窗口采用GDI方式刷新时. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。 * @; Q" c$ F2 h1 R% P8 p
"gdi2" : gdi2模式,此模式兼容性较强,但是速度比gdi模式要慢许多,如果gdi模式发现后台不刷新时,可以考虑用gdi2模式.+ e5 E9 p k8 b. h, R/ q9 k; l5 p, W
" h5 I+ S7 D& g& F# G$ ~) h! g"dx2" : dx2模式,用于窗口采用dx模式刷新,如果dx方式会出现窗口进程崩溃的状况,可以考虑采用这种.采用这种方式要保证窗口有一部分在屏幕外.win7 win8或者vista不需要移动也可后台. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
+ j$ \) Z5 E5 F: u" M6 R' w( Q"dx3" : dx3模式,同dx2模式,但是如果发现有些窗口后台不刷新时,可以考虑用dx3模式,此模式比dx2模式慢许多. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。' @- O2 L. V" m' q2 G5 R
3 E& N0 V6 x( u: w' s
dx模式,用于窗口采用dx模式刷新,取值可以是以下任意组合,组合采用"|"符号进行连接. 支持BindWindow中的缩写模式. 比如dx代表" dx.graphic.2d| dx.graphic.3d"
$ M% `. c% P9 w. [2 K1. "dx.graphic.2d" 2d窗口的dx图色模式 Z+ e( |5 e0 A# u% x6 w
2. "dx.graphic.2d.2" 2d窗口的dx图色模式 是dx.graphic.2d的增强模式.兼容性更好.9 f% `8 p8 D& _' J# i, N) V
3. "dx.graphic.3d" 3d窗口的dx图色模式,
1 W- m) m# ~: ?8 m4. "dx.graphic.3d.8" 3d窗口的dx8图色模式, 此模式对64位进程无效.
- n0 f6 [$ X, U$ U2 k* q5. "dx.graphic.opengl" 3d窗口的opengl图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢. K# a. R, c$ I
6. "dx.graphic.opengl.esv2" 3d窗口的opengl_esv2图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.
; y9 a- _5 }' g+ S7. "dx.graphic.3d.10plus" 3d窗口的dx10 dx11图色模式
8 y3 c- s" ]! O/ K4 Q- d
; t2 `2 i# R0 U' y8 ]mouse 字符串: 鼠标仿真模式 取值有以下几种
4 @0 o, K1 w, Y
5 b; y5 P% J5 E% R"normal" : 正常模式,平常我们用的前台鼠标模式( G1 t% I. n0 X, _7 p
$ B) w) J" V7 n. |$ n3 i, D
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.% `7 z9 D7 W8 [7 @
"windows3": Windows3模式,采取模拟windows消息方式,可以支持有多个子窗口的窗口后台
, H4 E& m1 w+ @+ }5 gdx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式,比如windows2代表"dx.mouse.position.lock.api|dx.mouse.position.lock.message|dx.mouse.state.message"
, ^/ W- I* m$ ^1. "dx.mouse.position.lock.api" 此模式表示通过封锁系统API,来锁定鼠标位置.
' A L6 Q" Q, k# H- j& ^+ s2. "dx.mouse.position.lock.message" 此模式表示通过封锁系统消息,来锁定鼠标位置.
" k6 c+ `5 s( }+ F9 ]7 v: D3. "dx.mouse.focus.input.api" 此模式表示通过封锁系统API来锁定鼠标输入焦点.& j5 ]. _' ~) d% w2 |3 R7 x1 k# S
4. "dx.mouse.focus.input.message"此模式表示通过封锁系统消息来锁定鼠标输入焦点.
. m1 U$ ]7 e4 s' H! r! L5. "dx.mouse.clip.lock.api" 此模式表示通过封锁系统API来锁定刷新区域。注意,使用这个模式,在绑定前,必须要让窗口完全显示出来.3 b$ q) ]% h1 n' [+ k5 ~6 q
6. "dx.mouse.input.lock.api" 此模式表示通过封锁系统API来锁定鼠标输入接口., |8 g3 F \6 Z6 Z+ q- n
7. "dx.mouse.state.api" 此模式表示通过封锁系统API来锁定鼠标输入状态.) u' c5 i$ Q5 D) f( d/ k
8. "dx.mouse.state.message" 此模式表示通过封锁系统消息来锁定鼠标输入状态.# R: Y8 S+ k( h! |2 q, Q
9. "dx.mouse.api" 此模式表示通过封锁系统API来模拟dx鼠标输入.
& W. [' T! D& {; l% F& V10. "dx.mouse.cursor" 开启此模式,可以后台获取鼠标特征码. 8 n( |* @" W& F' Z% R$ v1 B# o
11. "dx.mouse.raw.input" 有些窗口需要这个才可以正常操作鼠标. 2 ~; o6 O/ R, n. o
12. "dx.mouse.input.lock.api2" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.. U5 [1 L9 W4 b. y0 S. {0 Y6 M3 @
13. "dx.mouse.input.lock.api3" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性. 8 Y; c8 f$ G: A% ?+ p5 X0 K5 o
3 d7 a1 r8 ?0 a4 ~1 m
keypad 字符串: 键盘仿真模式 取值有以下几种; D1 P/ ~ _$ @2 P
# ~/ j5 \3 A/ C
"normal" : 正常模式,平常我们用的前台键盘模式
3 q! g3 Z9 ` b u: o
4 P( {9 M! c/ s2 V3 B* f$ i"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.& b- G0 I4 k# g# [# K2 x$ V- Q
& Z! w: ]& ]! d7 @- t3 E7 K# |dx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式.比如dx代表" dx.public.active.api|dx.public.active.message| dx.keypad.state.api|dx.keypad.api|dx.keypad.input.lock.api") X! K# k& b0 Z) Z2 x( p
1. "dx.keypad.input.lock.api" 此模式表示通过封锁系统API来锁定键盘输入接口.7 {- s- k4 x0 P- }. P
2. "dx.keypad.state.api" 此模式表示通过封锁系统API来锁定键盘输入状态.
2 e% y' N* ^& r7 M3. "dx.keypad.api" 此模式表示通过封锁系统API来模拟dx键盘输入.
; x/ l: R9 v8 \6 y) O4. "dx.keypad.raw.input" 有些窗口需要这个才可以正常操作键盘.8 B. T# B" p1 ^* R9 v6 t! Z
9 {. _( J7 ~0 B- H+ g
public 字符串: 公共属性 dx模式共有 ! r0 o! c/ i/ m2 w1 t
* P# x- m" n6 l取值可以是以下任意组合. 组合采用"|"符号进行连接 这个值可以为空( K6 [* Y7 K7 \, T+ k
1. "dx.public.active.api" 此模式表示通过封锁系统API来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用.
7 Y* V3 J/ @8 u2. "dx.public.active.message" 此模式表示通过封锁系统消息来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. 另外如果要让此模式生效,必须在绑定前,让绑定窗口处于激活状态,否则此模式将失效. 比如dm.SetWindowState hwnd,1 然后再绑定.
; i2 {5 H( c9 F6 @! P7 L) J3. "dx.public.disable.window.position" 此模式将锁定绑定窗口位置.不可与"dx.public.fake.window.min"共用.* _. ]/ c Y! r% A% D- @
4. "dx.public.disable.window.size" 此模式将锁定绑定窗口,禁止改变大小. 不可与"dx.public.fake.window.min"共用.
. ~( t/ `" p$ J; y5 q# [5. "dx.public.disable.window.minmax" 此模式将禁止窗口最大化和最小化,但是付出的代价是窗口同时也会被置顶. 不可与"dx.public.fake.window.min"共用., V9 c1 m* b4 b
6. "dx.public.fake.window.min" 此模式将允许目标窗口在最小化状态时,仍然能够像非最小化一样操作.. 另注意,此模式会导致任务栏顺序重排,所以如果是多开模式下,会看起来比较混乱,建议单开使用,多开不建议使用. 同时此模式不是万能的,有些情况下最小化以后图色会不刷新或者黑屏., P! s2 m- b4 O) ]# l7 M
7. "dx.public.hide.dll" 此模式将会隐藏目标进程的大漠插件,避免被检测..另外使用此模式前,请仔细做过测试,此模式可能会造成目标进程不稳定,出现崩溃。
, y# z% L# ~$ L& N n! g: H3 r' a8. "dx.public.active.api2" 此模式表示通过封锁系统API来锁定窗口激活状态. 部分窗口遮挡无法后台,需要这个属性.
! @& H/ }6 y+ r; ?! s6 o+ G9. "dx.public.input.ime" 此模式是配合SendStringIme使用. 具体可以查看SendStringIme接口.! h) w7 W. C2 X6 s
10 "dx.public.graphic.protect" 此模式可以保护dx图色不被恶意检测.同时对dx.keypad.api和dx.mouse.api也有保护效果.) e5 { {- h: a. W3 Z
11 "dx.public.disable.window.show" 禁止目标窗口显示,这个一般用来配合dx.public.fake.window.min来使用. + `: P& C2 J4 w2 b( I
12 "dx.public.anti.api" 此模式可以突破部分窗口对后台的保护.
" f5 H4 \0 l( F, q! K13 "dx.public.km.protect" 此模式可以保护dx键鼠不被恶意检测.最好配合dx.public.anti.api一起使用. 此属性可能会导致部分后台功能失效.
( p0 ^+ c; `9 s8 ]14 "dx.public.prevent.block" 绑定模式1 3 5 7 101 103下,可能会导致部分窗口卡死. 这个属性可以避免卡死.# |* W+ e6 f: g6 g4 o7 t
15 "dx.public.ori.proc" 此属性只能用在模式0 1 2 3和101下. 有些窗口在不同的界面下(比如登录界面和登录进以后的界面),键鼠的控制效果不相同. 那可以用这个属性来尝试让保持一致. 注意的是,这个属性不可以滥用,确保测试无问题才可以使用. 否则可能会导致后台失效.. j! N! P# L9 V- ?5 `9 H3 H
16 "dx.public.down.cpu" 此模式可以配合DownCpu来降低目标进程CPU占用. 当图色方式降低CPU无效时,可以尝试此种方式.
" h: D3 v. f" l! J, Z8 d. g17 "dx.public.focus.message" 当后台绑定后,后台无法正常在焦点窗口输入文字时,可以尝试加入此属性. 此属性会强制键盘消息发送到焦点窗口. 慎用此模式,此模式有可能会导致后台键盘在某些情况下失灵.
% J4 J- v. {6 m7 ?( u18 "dx.public.graphic.speed" 只针对图色中的dx模式有效.此模式会牺牲目标窗口的性能,来提高DX图色速度,尤其是目标窗口刷新很慢时,这个参数就很有用了.
) ~1 N5 d7 ^# P: o19 "dx.public.memory" 让本对象突破目标进程防护,可以正常使用内存接口. 当用此方式使用内存接口时,内存接口的速度会取决于目标窗口的刷新率.
' Z" w) }$ d, A/ F20 "dx.public.inject.super" 突破某些难以绑定的窗口. 此属性仅对除了模式0和2的其他模式有效.2 Y/ D( `1 z4 V7 `7 b t. u
21 "dx.public.hack.speed" 类似变速齿轮,配合接口HackSpeed使用3 N9 t' e: n! E7 [, f: G+ w! A* Y
. b2 y4 P/ {# j$ `" t S: emode 整形数: 模式。取值有以下几种 0 : 推荐模式此模式比较通用,而且后台效果是最好的.8 Z3 z' S( A% N7 o9 H9 v' i
2 : 同模式0,如果模式0有崩溃问题,可以尝试此模式. 注意0和2模式,当主绑定(第一个绑定同个窗口的对象)绑定成功后,那么调用主绑定的线程必须一直维持,否则线程一旦推出,对应的绑定也会消失.1 w( p3 p; z% X: L s+ k5 t
101 : 超级绑定模式. 可隐藏目标进程中的dm.dll.避免被恶意检测.效果要比dx.public.hide.dll好. 推荐使用.5 {4 S! x# K- I/ I& m$ \* _
103 : 同模式101,如果模式101有崩溃问题,可以尝试此模式.
- f' T$ [) [$ c5 X
( m2 p6 ]2 A- f+ u/ t: T 11 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统
3 Q1 u" I! W1 z4 ~1 G
7 i3 r+ ]/ _* b8 x4 U$ S7 I6 m: B 13 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统# r3 V2 {3 @, h8 V
需要注意的是: 模式101 103在大部分窗口下绑定都没问题。但也有少数特殊的窗口,比如有很多子窗口的窗口,对于这种窗口,在绑定时,一定要把鼠标指向一个可以输入文字的窗口,比如一个文本框,最好能激活这个文本框,这样可以保证绑定的成功./ _( R: ~% D1 G
返回值:$ |) h, S' N o, {& e
整形数:( Y) m e1 r6 A+ _0 ~/ K6 ?* i0 E
0: 失败. c5 A0 f4 m3 [5 Z9 m+ l
1: 成功% X# h U2 D: }1 k! j
5 D: f$ V* V% d
如果返回0,可以调用GetLastError来查看具体失败错误码,帮助分析问题.
& O6 { F- w; V* ^( [8 f9 r示例:/ x0 \1 |# u$ |) U- \4 f( q
5 p! Q. L& H6 N
比如
: n7 Q, t Y6 \. Rdm_ret = dm.BindWindowEx(hwnd,"normal","dx.mouse.position.lock.api|dx.mouse.position.lock.message","windows","dx.public.active.api",0)
0 j' A$ N; P% d1 p3 t * l `! y% N$ f# Y
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","normal","dx.public.active.api",0)4 P( P) C9 t/ y
( D, {# ~ _1 E) v; ]: z
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)- N& T9 M2 C( ?5 X
' ~( M0 V, Z0 Z0 F- c6 ? ]0 @
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","",0)
& ?5 e" V8 _( p- ~0 W, n9 W; s5 [4 i1 E9 `, O1 B& K
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","dx.public.disable.window.size|dx.public.disable.window.minmax",0)7 K7 g& n4 r! r4 x5 I9 z- w
: x! n: O$ h- r- q- s$ Ndm_ret = dm.BindWindowEx(hwnd,"dx2","windows3","windows","dx.mouse.position.lock.api",0)
; _+ R# K6 D9 U: I' d# O9 T等等.* e" M# G, `: `+ B
- V9 c- T& c7 ~$ ]( K1 t7 Z注意:
/ }. ~/ c5 T2 \: n1 y& [; x# K1 |7 ?5 a4 |
绑定之后,所有的坐标都相对于窗口的客户区坐标(不包含窗口边框): e+ D/ G' e! x7 i7 \
另外,绑定窗口后,必须加以下代码,以保证所有资源正常释放. b5 u" {1 U1 X Y' t7 w
这个函数的意思是在脚本结束时,会调用这个函数。需要注意的是,目前的按键版本对于这个函数的执行不是线程级别的,也就是说,这个函数只会在主线程执行,子线程绑定的大漠对象,不保证完全释放。高级语言中则需要自己控制在适当的时候解除绑定.: w# N3 [* o/ T- M% ]
Sub OnScriptExit()$ Z9 A7 p2 S. w4 @
dm_ret = dm.UnBindWindow()
) Z, c, b5 Y5 b0 yEnd Sub
3 M! J, D7 z" _3 M' [另外 绑定dx会比较耗时间,请不要频繁调用此函数.4 {* N0 D# s% c
还有一点特别要注意的是,有些窗口绑定之后必须加一定的延时,否则后台也无效.一般1秒到2秒的延时就足够.
9 z( L0 X M8 \/ ?. g) k/ o9 ~0 V, K 5 [/ n1 s+ w0 h
发现绑定失败的几种可能(一般是需要管理员权限的模式才有可能会失败)) z* W9 K+ ^/ Z$ v+ ]4 U& J5 S k
1. 系统登录的帐号必须有Administrators权限 2. 一些防火墙会防止插件注入窗口所在进程,比如360防火墙等,必须把dm.dll设置为信任. 3. 还有一个比较弱智的可能性,那就是插件没有注册到系统中,这时CreateObject压根就是失败的. 检测对象是否创建成功很简单,如下代码 set dm = createobject("dm.dmsoft")( q& \3 n( t. e5 ^2 K n
ver = dm.Ver()
9 r, [/ }- a, m2 Z$ _' E, eIf len(ver) = 0 Then
8 |0 H) p1 I$ @9 r* o MessageBox "创建对象失败,检查系统是否禁用了vbs脚本权限"
1 K8 g) l+ L8 F- t$ l5 e EndScript& F+ @( Y1 v$ a! B
End If 4. 在沙盘中开的窗口,绑定一些需要管理员权限的模式,会失败。# Q( N' |) ~7 T( H
解决方法是要配置沙盘参数,参考如何配置沙盘参数.
8 \3 }% @! U1 y4 O* k' G' ]$ M7 b
5 ~" H. G3 M0 r; G 5. 窗口所在进程有保护,这个我也无能为力. 2 {; d# ?: G/ Y5 H! l
- a/ \- q6 d5 R
|