|
BindWindowEx函数简介: 绑定指定的窗口,并指定这个窗口的屏幕颜色获取方式,鼠标仿真模式,键盘仿真模式 高级用户使用.' t* k K1 `' K- ~- \- @
函数原型:
$ m A$ A3 A5 p! l, Y; ~. i J. C
0 V0 K P/ B- H! b, g' Plong BindWindowEx(hwnd,display,mouse,keypad,public,mode)
; p: k/ @$ e: e! Z1 R2 V5 i
( L5 t; {8 |6 M( W, ]0 C
2 F4 f) u2 W$ S1 }6 y1 z' D% }$ O# \
6 k# ~) W' `. `1 Q5 r. f7 {易语言调用BindWindowEx命令见下图
; ]' Y. J* D) ~
9 B: }: Q- X; a+ R
) x- b4 q! u+ L$ G
0 p2 p2 M" [- M- x0 Z/ l
# r2 K. T9 n& y0 u+ S0 r. K, t) k. y
( C. z' C& g5 Y W
+ J5 t" H+ O- U- L1 k
9 W1 a' \( b5 C9 n4 A; c参数定义:% O0 o1 F/ h' C! k
9 J" @6 R% I' T R8 K
hwnd 整形数: 指定的窗口句柄
' p# A) M O, U7 G8 x- e& }3 x, r: E* A. p9 Z3 J
display 字符串: 屏幕颜色获取方式 取值有以下几种5 v+ N- Q/ G7 b3 A' X
/ H8 \$ G: f5 x7 b
"normal" : 正常模式,平常我们用的前台截屏模式: }- t* H3 y, b5 W" N3 L* |! h
/ X) p1 O9 x9 M0 R' s"gdi" : gdi模式,用于窗口采用GDI方式刷新时. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
& F1 X. x# s$ l# h3 T' e"gdi2" : gdi2模式,此模式兼容性较强,但是速度比gdi模式要慢许多,如果gdi模式发现后台不刷新时,可以考虑用gdi2模式., @4 t4 z" x& g
4 E$ `0 T% Z2 U; _! o6 ^5 d# o8 t
"dx2" : dx2模式,用于窗口采用dx模式刷新,如果dx方式会出现窗口进程崩溃的状况,可以考虑采用这种.采用这种方式要保证窗口有一部分在屏幕外.win7 win8或者vista不需要移动也可后台. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。 ) E: f2 Z4 ?% [6 ^* ~
"dx3" : dx3模式,同dx2模式,但是如果发现有些窗口后台不刷新时,可以考虑用dx3模式,此模式比dx2模式慢许多. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。; r9 r9 ~" P5 N4 W _
+ l) S" Y. s% A- h. \7 y5 l7 a7 L2 g
dx模式,用于窗口采用dx模式刷新,取值可以是以下任意组合,组合采用"|"符号进行连接. 支持BindWindow中的缩写模式. 比如dx代表" dx.graphic.2d| dx.graphic.3d"
9 E N i! u! B1. "dx.graphic.2d" 2d窗口的dx图色模式
' {) E/ ]; Y( j4 r9 K* P* E2. "dx.graphic.2d.2" 2d窗口的dx图色模式 是dx.graphic.2d的增强模式.兼容性更好.
8 |0 T5 T- Q% {3. "dx.graphic.3d" 3d窗口的dx图色模式, 8 ?: L7 D* Y$ I) D, D
4. "dx.graphic.3d.8" 3d窗口的dx8图色模式, 此模式对64位进程无效.$ ^/ }8 m. W v2 T% v- @3 v% X- V
5. "dx.graphic.opengl" 3d窗口的opengl图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢. 2 H7 S* q0 {% t& Q, P' Z
6. "dx.graphic.opengl.esv2" 3d窗口的opengl_esv2图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.! e: {3 a2 s: G& T
7. "dx.graphic.3d.10plus" 3d窗口的dx10 dx11图色模式
4 g5 d! V5 J# ^8 ]1 ?& ~4 N: Q8 k% |9 b; b
mouse 字符串: 鼠标仿真模式 取值有以下几种
* L% J* Q) B" Z' w- ]6 r
: ]4 l# A& {' o- g' w"normal" : 正常模式,平常我们用的前台鼠标模式
" Z. G1 [7 O* n( k2 A6 @: j* q* M. Z% b
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.
# z3 O8 S6 `& A7 |- o"windows3": Windows3模式,采取模拟windows消息方式,可以支持有多个子窗口的窗口后台
* d. K; ?0 ?! }9 Adx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式,比如windows2代表"dx.mouse.position.lock.api|dx.mouse.position.lock.message|dx.mouse.state.message"0 w9 }$ Y$ W$ k R6 K
1. "dx.mouse.position.lock.api" 此模式表示通过封锁系统API,来锁定鼠标位置.8 ^7 `& j% Z& t) \& q& G: b& `; u) C" Q
2. "dx.mouse.position.lock.message" 此模式表示通过封锁系统消息,来锁定鼠标位置.
6 N) m2 x+ S5 [2 z, R3. "dx.mouse.focus.input.api" 此模式表示通过封锁系统API来锁定鼠标输入焦点.( M: O' o0 N; ~8 {+ s
4. "dx.mouse.focus.input.message"此模式表示通过封锁系统消息来锁定鼠标输入焦点.
8 K8 _# k7 r9 n5. "dx.mouse.clip.lock.api" 此模式表示通过封锁系统API来锁定刷新区域。注意,使用这个模式,在绑定前,必须要让窗口完全显示出来.
* c" R+ ~9 A: ?7 p$ T6. "dx.mouse.input.lock.api" 此模式表示通过封锁系统API来锁定鼠标输入接口.
' a7 {$ x2 W5 j7. "dx.mouse.state.api" 此模式表示通过封锁系统API来锁定鼠标输入状态.5 O. M2 U0 x8 A8 F/ M- h- p4 N0 r/ u' t
8. "dx.mouse.state.message" 此模式表示通过封锁系统消息来锁定鼠标输入状态.5 C( z/ ?' A+ u' i' E7 f6 G) x8 S
9. "dx.mouse.api" 此模式表示通过封锁系统API来模拟dx鼠标输入.* V8 i, d% Y: C) {; l! k# ?
10. "dx.mouse.cursor" 开启此模式,可以后台获取鼠标特征码.
8 O G& y7 m, o6 s2 g3 J1 `11. "dx.mouse.raw.input" 有些窗口需要这个才可以正常操作鼠标. $ x8 h- q+ X+ W8 z) R5 l, t) E
12. "dx.mouse.input.lock.api2" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.9 V# U- h( D3 `8 q& ~7 |) ]
13. "dx.mouse.input.lock.api3" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性. m( H1 P2 E/ ?7 U
9 C9 ?1 x7 b/ \% f. akeypad 字符串: 键盘仿真模式 取值有以下几种
, n7 L8 B% Y$ y) I
. x* p" d* F0 n& ]+ e" E* z"normal" : 正常模式,平常我们用的前台键盘模式
+ g) B6 Q, U+ a1 y5 c" D- Z$ D0 i! ?" j: g& ?
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.
* g/ [. O$ Y' [# I$ w
# {' {- k. E l J9 @5 s/ ?dx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式.比如dx代表" dx.public.active.api|dx.public.active.message| dx.keypad.state.api|dx.keypad.api|dx.keypad.input.lock.api"; C: d6 F8 e% R8 }' C* o
1. "dx.keypad.input.lock.api" 此模式表示通过封锁系统API来锁定键盘输入接口.
3 U2 ~- i: I7 p2. "dx.keypad.state.api" 此模式表示通过封锁系统API来锁定键盘输入状态.' r) E/ D% ?" @4 S0 ~7 a
3. "dx.keypad.api" 此模式表示通过封锁系统API来模拟dx键盘输入.
- S. u. l" {% d5 Y8 P! c4 b4. "dx.keypad.raw.input" 有些窗口需要这个才可以正常操作键盘.
/ O% X( S1 m; W ( l; T8 X% I! c
public 字符串: 公共属性 dx模式共有
0 z5 y6 @+ B4 l2 v
& X0 B. x b+ N" e* K+ t$ G/ T# S( ]- f取值可以是以下任意组合. 组合采用"|"符号进行连接 这个值可以为空
2 c, ?. y7 y3 P4 f2 D! F1. "dx.public.active.api" 此模式表示通过封锁系统API来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. N, l& p, _: g6 P' Z2 {' f
2. "dx.public.active.message" 此模式表示通过封锁系统消息来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. 另外如果要让此模式生效,必须在绑定前,让绑定窗口处于激活状态,否则此模式将失效. 比如dm.SetWindowState hwnd,1 然后再绑定.; M1 Z3 b; a( G8 D: }
3. "dx.public.disable.window.position" 此模式将锁定绑定窗口位置.不可与"dx.public.fake.window.min"共用.5 J( S7 r2 Z5 L- c
4. "dx.public.disable.window.size" 此模式将锁定绑定窗口,禁止改变大小. 不可与"dx.public.fake.window.min"共用.
+ x5 D/ V/ D N) i5. "dx.public.disable.window.minmax" 此模式将禁止窗口最大化和最小化,但是付出的代价是窗口同时也会被置顶. 不可与"dx.public.fake.window.min"共用.5 h w" ?8 A* N/ _
6. "dx.public.fake.window.min" 此模式将允许目标窗口在最小化状态时,仍然能够像非最小化一样操作.. 另注意,此模式会导致任务栏顺序重排,所以如果是多开模式下,会看起来比较混乱,建议单开使用,多开不建议使用. 同时此模式不是万能的,有些情况下最小化以后图色会不刷新或者黑屏.
5 l& j7 L# q) V1 \7. "dx.public.hide.dll" 此模式将会隐藏目标进程的大漠插件,避免被检测..另外使用此模式前,请仔细做过测试,此模式可能会造成目标进程不稳定,出现崩溃。5 u s3 |; y" B2 |( Y; d
8. "dx.public.active.api2" 此模式表示通过封锁系统API来锁定窗口激活状态. 部分窗口遮挡无法后台,需要这个属性. 7 D) W. R$ F$ D( o% o
9. "dx.public.input.ime" 此模式是配合SendStringIme使用. 具体可以查看SendStringIme接口.9 k( J. A* ~* |$ v; }
10 "dx.public.graphic.protect" 此模式可以保护dx图色不被恶意检测.同时对dx.keypad.api和dx.mouse.api也有保护效果.2 C: w6 i. J( Z% D5 i. T
11 "dx.public.disable.window.show" 禁止目标窗口显示,这个一般用来配合dx.public.fake.window.min来使用. % p4 I* D: F, ^3 O. e+ f
12 "dx.public.anti.api" 此模式可以突破部分窗口对后台的保护.
% ~ z2 @& w. v* l13 "dx.public.km.protect" 此模式可以保护dx键鼠不被恶意检测.最好配合dx.public.anti.api一起使用. 此属性可能会导致部分后台功能失效.
* a7 r' V; b% m9 C+ h' B14 "dx.public.prevent.block" 绑定模式1 3 5 7 101 103下,可能会导致部分窗口卡死. 这个属性可以避免卡死.
; w+ h+ z: L, [' F0 g15 "dx.public.ori.proc" 此属性只能用在模式0 1 2 3和101下. 有些窗口在不同的界面下(比如登录界面和登录进以后的界面),键鼠的控制效果不相同. 那可以用这个属性来尝试让保持一致. 注意的是,这个属性不可以滥用,确保测试无问题才可以使用. 否则可能会导致后台失效., S( ]% G; q d2 `
16 "dx.public.down.cpu" 此模式可以配合DownCpu来降低目标进程CPU占用. 当图色方式降低CPU无效时,可以尝试此种方式.
3 _, P. S$ ^( @/ M17 "dx.public.focus.message" 当后台绑定后,后台无法正常在焦点窗口输入文字时,可以尝试加入此属性. 此属性会强制键盘消息发送到焦点窗口. 慎用此模式,此模式有可能会导致后台键盘在某些情况下失灵.2 ? ?/ t- i7 C8 d4 M! t( f s: t
18 "dx.public.graphic.speed" 只针对图色中的dx模式有效.此模式会牺牲目标窗口的性能,来提高DX图色速度,尤其是目标窗口刷新很慢时,这个参数就很有用了.! d! ]5 M! S3 O$ I4 |0 z; H
19 "dx.public.memory" 让本对象突破目标进程防护,可以正常使用内存接口. 当用此方式使用内存接口时,内存接口的速度会取决于目标窗口的刷新率.
+ [. k* S" G- z3 {& W( x" n8 x$ y20 "dx.public.inject.super" 突破某些难以绑定的窗口. 此属性仅对除了模式0和2的其他模式有效.
4 J- g9 ^8 O: E/ T1 E! h/ p21 "dx.public.hack.speed" 类似变速齿轮,配合接口HackSpeed使用 A% s8 _! j3 ~- E. c4 @
, K: D/ ~7 \# ^! c" X0 j6 K; s
mode 整形数: 模式。取值有以下几种 0 : 推荐模式此模式比较通用,而且后台效果是最好的.
3 c1 M; s5 w% }( c 2 : 同模式0,如果模式0有崩溃问题,可以尝试此模式. 注意0和2模式,当主绑定(第一个绑定同个窗口的对象)绑定成功后,那么调用主绑定的线程必须一直维持,否则线程一旦推出,对应的绑定也会消失.
% [2 _3 l$ h' D5 n: b' T, G 101 : 超级绑定模式. 可隐藏目标进程中的dm.dll.避免被恶意检测.效果要比dx.public.hide.dll好. 推荐使用.
; ?2 K3 J: E1 W5 v# [ 103 : 同模式101,如果模式101有崩溃问题,可以尝试此模式.
+ e7 Q; F+ t. B9 \) D6 ]; F3 t5 d" ?. ?: X' T1 M/ X8 D. S4 ?% L
11 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统
$ l# ?' N' x6 o3 w( {, A' [) r% v' C: \
13 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统
' L& s" c! D" c) f, f需要注意的是: 模式101 103在大部分窗口下绑定都没问题。但也有少数特殊的窗口,比如有很多子窗口的窗口,对于这种窗口,在绑定时,一定要把鼠标指向一个可以输入文字的窗口,比如一个文本框,最好能激活这个文本框,这样可以保证绑定的成功.
' I7 M. |$ f) U7 Q返回值:& q: ]4 J% I3 U- M+ w) G) P. H
整形数:
4 I/ r4 ^4 [# ~! W! N0: 失败 J6 n- B& R. k$ B. {. P& u
1: 成功
3 e5 ]7 G! |6 P7 e8 k" w9 R4 E M+ i2 P- }" l9 U
如果返回0,可以调用GetLastError来查看具体失败错误码,帮助分析问题.
% F( }" M; L9 _% f" J& B" ^& |示例:: Y0 f, G( T( u: N* i# U3 x, d) |
, m; [/ I3 y- k1 b! J0 r/ |0 ?
比如
V0 s( E3 u! T$ q; t" {8 S0 c- Mdm_ret = dm.BindWindowEx(hwnd,"normal","dx.mouse.position.lock.api|dx.mouse.position.lock.message","windows","dx.public.active.api",0)" W" W: z8 I3 C
3 p0 X: a5 W# V& W- P% h9 fdm_ret = dm.BindWindowEx(hwnd,"dx2","windows","normal","dx.public.active.api",0)+ G5 B1 T X4 r3 s, M
8 Y/ L i- e* g( r' ], C( f
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)
1 l( h2 e4 j* [0 i! M4 Z* P* k8 v , X( S& R* D" V
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","",0)8 s) ]) M, B0 Q2 Z7 s
6 B& Q3 B, O w& k
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","dx.public.disable.window.size|dx.public.disable.window.minmax",0)
3 G, g& Y. Q: h7 \7 W! e% A% _ * w' [5 V3 f ~5 C6 c6 b* @
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows3","windows","dx.mouse.position.lock.api",0)
% D3 h0 d; K K4 u等等.- Q2 j- r" G. s9 c5 c3 r
$ h8 @, o2 w! R \) L
注意:
3 Q/ L, `$ p# V+ V2 i$ V" D( T
! l8 t i7 S& w$ c6 @/ E& G( c! Q绑定之后,所有的坐标都相对于窗口的客户区坐标(不包含窗口边框)
5 @2 j7 I0 v1 l' x另外,绑定窗口后,必须加以下代码,以保证所有资源正常释放5 b |" q& X! i/ f
这个函数的意思是在脚本结束时,会调用这个函数。需要注意的是,目前的按键版本对于这个函数的执行不是线程级别的,也就是说,这个函数只会在主线程执行,子线程绑定的大漠对象,不保证完全释放。高级语言中则需要自己控制在适当的时候解除绑定.
K2 R. W1 f0 F7 M* O; f3 W3 G( |Sub OnScriptExit()
" x! C: }6 ?1 u5 W+ `! y1 ] dm_ret = dm.UnBindWindow()
2 d' [8 I+ ^' I# B$ Q: IEnd Sub
- Q/ r* I$ S% q+ r& m+ c, J另外 绑定dx会比较耗时间,请不要频繁调用此函数.
9 Y" o7 i: x3 a3 c; x' J' h还有一点特别要注意的是,有些窗口绑定之后必须加一定的延时,否则后台也无效.一般1秒到2秒的延时就足够.
% s1 x/ G- ^, L$ ^( e0 O" ~9 @ 0 e7 H& D+ ^2 e! x
发现绑定失败的几种可能(一般是需要管理员权限的模式才有可能会失败): J# }1 f& Z# [; @
1. 系统登录的帐号必须有Administrators权限 2. 一些防火墙会防止插件注入窗口所在进程,比如360防火墙等,必须把dm.dll设置为信任. 3. 还有一个比较弱智的可能性,那就是插件没有注册到系统中,这时CreateObject压根就是失败的. 检测对象是否创建成功很简单,如下代码 set dm = createobject("dm.dmsoft")9 l/ o5 z. i1 Q7 v/ s
ver = dm.Ver()
^7 y: \! o0 F! HIf len(ver) = 0 Then+ H$ t* m1 d% @5 l- i
MessageBox "创建对象失败,检查系统是否禁用了vbs脚本权限"
6 a- l& X Z' G5 l EndScript( N( Q2 w0 q/ @$ h# }8 i
End If 4. 在沙盘中开的窗口,绑定一些需要管理员权限的模式,会失败。
: ]/ T0 V. C9 A% f' U解决方法是要配置沙盘参数,参考如何配置沙盘参数.
; L2 }* b4 U# o$ u' }8 A; F: R' ~
0 _: m( Y5 P; v0 y+ S3 d 5. 窗口所在进程有保护,这个我也无能为力. + n6 b5 j& \! @8 ?" M) j2 s
4 [( h( w3 V, \& |2 y
|