|
BindWindowEx函数简介: 绑定指定的窗口,并指定这个窗口的屏幕颜色获取方式,鼠标仿真模式,键盘仿真模式 高级用户使用./ F0 y) J! j. u
函数原型:
5 I M2 [ ~3 o# K @( [! v8 b
% r0 c( k$ G& s' Jlong BindWindowEx(hwnd,display,mouse,keypad,public,mode)
; e9 b7 ^- k0 K. g) v6 H1 _! E( W" ?4 `8 s% L! q
4 l. j+ Q- h" U" R1 n
2 X8 v2 \; I1 a! F& w+ B, q: V6 A
2 N$ P& t" s) Q1 u9 |易语言调用BindWindowEx命令见下图" b" ^$ H9 Y( r' ]! O3 n% }2 W
+ \( e5 Y- t) C5 v- a* b; V. v" |
0 o( e# B! S+ a! }8 M3 [
- W- O0 t7 N# Z* Y) C8 l" M! |
I' p7 e0 @* d) s5 X
/ y3 D1 c' i6 z' C; {
: [6 ] V" x9 x v: l V$ p
% ?0 S' y1 Y) Q" u. q
- w, ~: c0 \9 M' v2 F参数定义:
; Y! {+ r& o1 h% D, N; j d. a& i* J
hwnd 整形数: 指定的窗口句柄
3 w5 S7 b& j. ]8 r( z8 _+ v3 W
: `1 S: V, k5 e0 M' Xdisplay 字符串: 屏幕颜色获取方式 取值有以下几种
. W1 D( x3 U" ^
+ U& M$ o' P1 p; K! U"normal" : 正常模式,平常我们用的前台截屏模式6 g! B( n5 [! E, q9 D: T& V
3 K4 J7 ] S/ z1 V% }; G9 @% I
"gdi" : gdi模式,用于窗口采用GDI方式刷新时. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
& e5 z+ k0 Q7 q"gdi2" : gdi2模式,此模式兼容性较强,但是速度比gdi模式要慢许多,如果gdi模式发现后台不刷新时,可以考虑用gdi2模式.
/ l% F7 C$ u5 v$ \
- z5 B: G5 h/ ?! B9 @5 R"dx2" : dx2模式,用于窗口采用dx模式刷新,如果dx方式会出现窗口进程崩溃的状况,可以考虑采用这种.采用这种方式要保证窗口有一部分在屏幕外.win7 win8或者vista不需要移动也可后台. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
2 q" z: Q( M* Y0 K# n( ?+ n"dx3" : dx3模式,同dx2模式,但是如果发现有些窗口后台不刷新时,可以考虑用dx3模式,此模式比dx2模式慢许多. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。) g, j1 e/ q' Z; Z5 C/ }
+ _' ]1 |7 ^$ E
dx模式,用于窗口采用dx模式刷新,取值可以是以下任意组合,组合采用"|"符号进行连接. 支持BindWindow中的缩写模式. 比如dx代表" dx.graphic.2d| dx.graphic.3d"
; z+ K( X9 _6 ~6 w9 ]0 V1. "dx.graphic.2d" 2d窗口的dx图色模式
; t: ?) B4 ]5 W$ O2. "dx.graphic.2d.2" 2d窗口的dx图色模式 是dx.graphic.2d的增强模式.兼容性更好.
( Q. k, \% t, {3. "dx.graphic.3d" 3d窗口的dx图色模式, }# d/ P" `9 K8 O- D
4. "dx.graphic.3d.8" 3d窗口的dx8图色模式, 此模式对64位进程无效.
* H5 l6 ?7 ^* c. y% _& B5. "dx.graphic.opengl" 3d窗口的opengl图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.
9 E" b7 `* a% C. U" a% x: p$ V6. "dx.graphic.opengl.esv2" 3d窗口的opengl_esv2图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.* v( k* n6 H$ F1 H
7. "dx.graphic.3d.10plus" 3d窗口的dx10 dx11图色模式
3 C1 Q+ I6 j# Y
5 s/ z6 [0 N! {+ _9 Amouse 字符串: 鼠标仿真模式 取值有以下几种
" ?8 o, @6 P$ V! ~; d8 [
# {3 Q4 Z' g4 N/ S4 k2 G"normal" : 正常模式,平常我们用的前台鼠标模式' X& u" R5 y6 E3 r" }+ C5 A. k
: U9 {! k/ V- w, p9 D5 O"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.
! [- u( l( L* i- n"windows3": Windows3模式,采取模拟windows消息方式,可以支持有多个子窗口的窗口后台8 Y0 B9 k' X8 p9 m0 s% o
dx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式,比如windows2代表"dx.mouse.position.lock.api|dx.mouse.position.lock.message|dx.mouse.state.message"
% F3 A( y) f6 ~. _1. "dx.mouse.position.lock.api" 此模式表示通过封锁系统API,来锁定鼠标位置.0 q" ^! d( w. @0 m, g: H" |) r- L
2. "dx.mouse.position.lock.message" 此模式表示通过封锁系统消息,来锁定鼠标位置.2 Z( G1 m) C ]
3. "dx.mouse.focus.input.api" 此模式表示通过封锁系统API来锁定鼠标输入焦点.& ?# J& `( T" z+ z) T' ~( i
4. "dx.mouse.focus.input.message"此模式表示通过封锁系统消息来锁定鼠标输入焦点.3 e" @ x4 G* g) R0 E# y$ g
5. "dx.mouse.clip.lock.api" 此模式表示通过封锁系统API来锁定刷新区域。注意,使用这个模式,在绑定前,必须要让窗口完全显示出来.4 @/ h, k1 `0 o5 ]( T, g
6. "dx.mouse.input.lock.api" 此模式表示通过封锁系统API来锁定鼠标输入接口.# `8 F+ C7 _7 R9 `3 D r, |$ g. J" g
7. "dx.mouse.state.api" 此模式表示通过封锁系统API来锁定鼠标输入状态.% L9 r' d8 a. p0 e1 r+ A# `" {
8. "dx.mouse.state.message" 此模式表示通过封锁系统消息来锁定鼠标输入状态.& f7 v1 a4 N% N+ @
9. "dx.mouse.api" 此模式表示通过封锁系统API来模拟dx鼠标输入.5 X0 I+ e0 c- y2 s
10. "dx.mouse.cursor" 开启此模式,可以后台获取鼠标特征码.
8 a/ b6 h3 T# U$ r# ~11. "dx.mouse.raw.input" 有些窗口需要这个才可以正常操作鼠标.
$ \( v; O0 Q2 U2 w! ~. j12. "dx.mouse.input.lock.api2" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.8 ?, ?+ @' G# k# P( t: B
13. "dx.mouse.input.lock.api3" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性. 6 p1 `2 t7 R/ _& ?0 x
9 }5 t# _' N2 ]' N7 t$ z6 mkeypad 字符串: 键盘仿真模式 取值有以下几种
9 m2 o4 j' A/ G$ y
$ e4 V8 K2 C4 s- `9 |"normal" : 正常模式,平常我们用的前台键盘模式7 b: P+ t$ [' M5 H% ^
" y* c5 `* z& s3 c8 q* e"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.
4 X; x' O/ y& ^. N. n2 y$ H: a) U, N1 D
dx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式.比如dx代表" dx.public.active.api|dx.public.active.message| dx.keypad.state.api|dx.keypad.api|dx.keypad.input.lock.api"* i7 t4 ?: M6 |: T# }4 s* n- t1 }3 W
1. "dx.keypad.input.lock.api" 此模式表示通过封锁系统API来锁定键盘输入接口.
- @3 T1 H, u: V# J2. "dx.keypad.state.api" 此模式表示通过封锁系统API来锁定键盘输入状态.
( L( H1 Y( }' [( N( w8 e3. "dx.keypad.api" 此模式表示通过封锁系统API来模拟dx键盘输入.
, B( R! f# }2 c) ^4. "dx.keypad.raw.input" 有些窗口需要这个才可以正常操作键盘.
7 T- ]: t. F2 K/ J! k
, z1 k0 B0 ?9 a' Bpublic 字符串: 公共属性 dx模式共有
* B2 w* S) w3 u% `
& p* {9 f O# G/ J% q% p" u取值可以是以下任意组合. 组合采用"|"符号进行连接 这个值可以为空
. j% S# b* m3 {9 k( U3 I# ]* v1. "dx.public.active.api" 此模式表示通过封锁系统API来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. & N1 M: x0 x2 F- [+ d
2. "dx.public.active.message" 此模式表示通过封锁系统消息来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. 另外如果要让此模式生效,必须在绑定前,让绑定窗口处于激活状态,否则此模式将失效. 比如dm.SetWindowState hwnd,1 然后再绑定." c" a, t4 c: s9 G
3. "dx.public.disable.window.position" 此模式将锁定绑定窗口位置.不可与"dx.public.fake.window.min"共用.& W$ J1 h' w E$ F
4. "dx.public.disable.window.size" 此模式将锁定绑定窗口,禁止改变大小. 不可与"dx.public.fake.window.min"共用.9 E. N6 t, k' z# l2 S
5. "dx.public.disable.window.minmax" 此模式将禁止窗口最大化和最小化,但是付出的代价是窗口同时也会被置顶. 不可与"dx.public.fake.window.min"共用.
/ b2 w1 e$ j: D3 g k6. "dx.public.fake.window.min" 此模式将允许目标窗口在最小化状态时,仍然能够像非最小化一样操作.. 另注意,此模式会导致任务栏顺序重排,所以如果是多开模式下,会看起来比较混乱,建议单开使用,多开不建议使用. 同时此模式不是万能的,有些情况下最小化以后图色会不刷新或者黑屏.9 `' B8 C: Y7 ~& n* b W! g1 r
7. "dx.public.hide.dll" 此模式将会隐藏目标进程的大漠插件,避免被检测..另外使用此模式前,请仔细做过测试,此模式可能会造成目标进程不稳定,出现崩溃。
- J- [: ] _) X! B& C( E8. "dx.public.active.api2" 此模式表示通过封锁系统API来锁定窗口激活状态. 部分窗口遮挡无法后台,需要这个属性.
t! W. G+ c; |3 U0 z1 \! H/ P9. "dx.public.input.ime" 此模式是配合SendStringIme使用. 具体可以查看SendStringIme接口.! ]3 h3 ^$ m; b+ X- A5 o
10 "dx.public.graphic.protect" 此模式可以保护dx图色不被恶意检测.同时对dx.keypad.api和dx.mouse.api也有保护效果.0 z# r( d: o- g' P2 z
11 "dx.public.disable.window.show" 禁止目标窗口显示,这个一般用来配合dx.public.fake.window.min来使用.
; C ]" y4 b1 y9 u. Q) G12 "dx.public.anti.api" 此模式可以突破部分窗口对后台的保护.
, d: s1 |/ E+ _+ h9 E) g( z0 i2 I5 {13 "dx.public.km.protect" 此模式可以保护dx键鼠不被恶意检测.最好配合dx.public.anti.api一起使用. 此属性可能会导致部分后台功能失效.
+ i" L7 }- [/ l8 J3 I14 "dx.public.prevent.block" 绑定模式1 3 5 7 101 103下,可能会导致部分窗口卡死. 这个属性可以避免卡死.
: _7 j. V7 A0 I9 G: T! T8 O15 "dx.public.ori.proc" 此属性只能用在模式0 1 2 3和101下. 有些窗口在不同的界面下(比如登录界面和登录进以后的界面),键鼠的控制效果不相同. 那可以用这个属性来尝试让保持一致. 注意的是,这个属性不可以滥用,确保测试无问题才可以使用. 否则可能会导致后台失效.% B0 F4 a6 Y U a; y5 n. m# y
16 "dx.public.down.cpu" 此模式可以配合DownCpu来降低目标进程CPU占用. 当图色方式降低CPU无效时,可以尝试此种方式.: {( M9 w- I: d
17 "dx.public.focus.message" 当后台绑定后,后台无法正常在焦点窗口输入文字时,可以尝试加入此属性. 此属性会强制键盘消息发送到焦点窗口. 慎用此模式,此模式有可能会导致后台键盘在某些情况下失灵.) J5 j5 ^# W& X# o% h
18 "dx.public.graphic.speed" 只针对图色中的dx模式有效.此模式会牺牲目标窗口的性能,来提高DX图色速度,尤其是目标窗口刷新很慢时,这个参数就很有用了.$ @% g( ^" {3 F s6 `. w
19 "dx.public.memory" 让本对象突破目标进程防护,可以正常使用内存接口. 当用此方式使用内存接口时,内存接口的速度会取决于目标窗口的刷新率.
% Q# D! ^. e% _4 X) X/ l: f20 "dx.public.inject.super" 突破某些难以绑定的窗口. 此属性仅对除了模式0和2的其他模式有效.- w5 }5 F. v" G0 [$ s9 \0 y [
21 "dx.public.hack.speed" 类似变速齿轮,配合接口HackSpeed使用
. F6 H8 n* J! b, U' E9 ~5 i( _
; l) M! t- w- u- p' Gmode 整形数: 模式。取值有以下几种 0 : 推荐模式此模式比较通用,而且后台效果是最好的.# E1 H5 k9 H/ b) z3 t2 L
2 : 同模式0,如果模式0有崩溃问题,可以尝试此模式. 注意0和2模式,当主绑定(第一个绑定同个窗口的对象)绑定成功后,那么调用主绑定的线程必须一直维持,否则线程一旦推出,对应的绑定也会消失.
# C1 e3 B; D0 G5 N( f 101 : 超级绑定模式. 可隐藏目标进程中的dm.dll.避免被恶意检测.效果要比dx.public.hide.dll好. 推荐使用.
: K& e+ _: N8 f0 [0 ] 103 : 同模式101,如果模式101有崩溃问题,可以尝试此模式.
2 o B0 o( c& k$ g! ~4 A* K% A! y2 R: V! ]. w! Y* ~
11 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统$ z6 H s$ C7 d$ [
: N, F `8 o5 L) `8 @2 M3 x
13 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统
3 ^& c& S. z F2 ?8 p" T& {3 x4 |, @需要注意的是: 模式101 103在大部分窗口下绑定都没问题。但也有少数特殊的窗口,比如有很多子窗口的窗口,对于这种窗口,在绑定时,一定要把鼠标指向一个可以输入文字的窗口,比如一个文本框,最好能激活这个文本框,这样可以保证绑定的成功.
1 W4 ?5 k4 x v$ h3 K& T返回值:
% m: f& C' K/ S( V7 I整形数:
# z5 e8 {' i. Q9 z0: 失败5 J4 g- g' E6 {
1: 成功
, t- a3 w! `4 `: R, P: b
1 f5 g4 w- [. U$ l7 c如果返回0,可以调用GetLastError来查看具体失败错误码,帮助分析问题.& S/ t6 Z$ [7 N7 |
示例:
& G+ q! F7 E/ H' `1 D8 z$ `4 J8 N" O$ m0 q1 v6 B1 Z
比如
/ D' S! i- D! y' F6 Odm_ret = dm.BindWindowEx(hwnd,"normal","dx.mouse.position.lock.api|dx.mouse.position.lock.message","windows","dx.public.active.api",0)
' @7 G' s8 p6 U' C2 D' s/ o Y , X+ P9 n4 O ?3 \- @! i8 l1 t
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","normal","dx.public.active.api",0)$ r& u; F9 G$ P+ e/ H* R2 k
7 U& ^( b; O+ b; C$ ?$ h+ 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)! ^2 a1 l3 c' \3 Z9 }
; g0 g1 n) f; N3 M3 ^" }7 K. ddm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","",0)$ Z, B+ N7 S* o9 M/ M+ O: v5 c. s
- b2 X0 f- W" S2 t* r: D4 Y @: i
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","dx.public.disable.window.size|dx.public.disable.window.minmax",0)
) \1 o2 {1 w! b9 |8 L- B% x
, o" k) I$ k7 N, g2 _8 W" ndm_ret = dm.BindWindowEx(hwnd,"dx2","windows3","windows","dx.mouse.position.lock.api",0)
+ B' {3 ^0 X4 k' Y' G; V# X等等.# x- T ~4 S9 u9 A- v7 X6 g
7 L r& h2 J h- v0 W注意:) I7 U( u- c' b
7 \, R B) E. H) y( G; \
绑定之后,所有的坐标都相对于窗口的客户区坐标(不包含窗口边框)
+ Z& g6 ]) d8 w6 B% y9 D5 Q9 l1 i另外,绑定窗口后,必须加以下代码,以保证所有资源正常释放8 t" v+ g r* P4 a& h
这个函数的意思是在脚本结束时,会调用这个函数。需要注意的是,目前的按键版本对于这个函数的执行不是线程级别的,也就是说,这个函数只会在主线程执行,子线程绑定的大漠对象,不保证完全释放。高级语言中则需要自己控制在适当的时候解除绑定.
. X& \. W2 \6 ]$ b: vSub OnScriptExit(), F& {, V4 Q' d1 P
dm_ret = dm.UnBindWindow()
* X1 j8 I6 F; H, K9 }7 nEnd Sub% R/ ~) E) u, L- ]& _
另外 绑定dx会比较耗时间,请不要频繁调用此函数.1 X! q; |5 d- M. w
还有一点特别要注意的是,有些窗口绑定之后必须加一定的延时,否则后台也无效.一般1秒到2秒的延时就足够.3 x4 l2 `& S' i1 P( `
8 t% ~0 `, J& t发现绑定失败的几种可能(一般是需要管理员权限的模式才有可能会失败)
5 s, I9 c& N; m/ `) T8 W1. 系统登录的帐号必须有Administrators权限 2. 一些防火墙会防止插件注入窗口所在进程,比如360防火墙等,必须把dm.dll设置为信任. 3. 还有一个比较弱智的可能性,那就是插件没有注册到系统中,这时CreateObject压根就是失败的. 检测对象是否创建成功很简单,如下代码 set dm = createobject("dm.dmsoft")1 R$ N: G4 T# D
ver = dm.Ver()
7 a4 V2 {- S, o( i7 R. B( }2 lIf len(ver) = 0 Then! w# _% U. ] X0 s& w3 y
MessageBox "创建对象失败,检查系统是否禁用了vbs脚本权限"
0 U1 E+ I P& A EndScript
& b- X( K: x: VEnd If 4. 在沙盘中开的窗口,绑定一些需要管理员权限的模式,会失败。
$ [2 d& S) M8 }- g6 P& k- X解决方法是要配置沙盘参数,参考如何配置沙盘参数.$ A" W2 c& {0 v) G' M
: y7 v1 v. N: O" N2 `1 h6 c
5. 窗口所在进程有保护,这个我也无能为力.
, F# w% A" p, G1 O# b* R
$ K( x4 ~) z& \- ~6 M z" v |