|
BindWindowEx函数简介: 绑定指定的窗口,并指定这个窗口的屏幕颜色获取方式,鼠标仿真模式,键盘仿真模式 高级用户使用.3 I) _# d$ o9 ~8 E v2 \3 S" b
函数原型:
: |+ | e- b7 r! Q7 z; C1 q- W0 B& K! _1 z+ k, h
long BindWindowEx(hwnd,display,mouse,keypad,public,mode)
5 x% C8 ?: A6 T- y3 s' v) c; V& \3 a$ f
; A) t# O2 o3 A# C8 l- f9 w. }% p$ B4 e+ p3 E
/ f! j4 u% s9 u8 ]; N易语言调用BindWindowEx命令见下图9 U/ a( Z3 [- I
2 d& z) N, a9 S5 N' k" S4 ]% U, @
5 m; C: @. [3 J5 r4 W
2 V4 Z& R7 l2 T* t$ M: L% V, O* r& \# O( i7 |8 f' n
3 ?# y: w5 w% Z. M& J: @8 q8 W! P1 Q$ \
. v+ \/ D8 @# |9 A, E s2 @# H3 m s8 D, C0 U: g
参数定义:
9 [, o3 Y9 D* ?5 W* D1 }
" R% Y5 \8 o) g- Yhwnd 整形数: 指定的窗口句柄
2 ~$ b0 r4 t5 T' u+ D* t
5 f5 A- v& o( \- Z' X" P8 ydisplay 字符串: 屏幕颜色获取方式 取值有以下几种
( D' `0 c" r2 S6 K6 k: O
H J' a, n$ [9 G: G6 j) w# [' z"normal" : 正常模式,平常我们用的前台截屏模式
7 \3 |) R) u9 N2 ^: Y; k
& ?, A* R8 [ s& V6 h& y/ N"gdi" : gdi模式,用于窗口采用GDI方式刷新时. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
n+ M- ~/ g# p8 U"gdi2" : gdi2模式,此模式兼容性较强,但是速度比gdi模式要慢许多,如果gdi模式发现后台不刷新时,可以考虑用gdi2模式.( o, E1 K& w; \$ l
& g) ^+ E9 y$ n+ g7 j5 s"dx2" : dx2模式,用于窗口采用dx模式刷新,如果dx方式会出现窗口进程崩溃的状况,可以考虑采用这种.采用这种方式要保证窗口有一部分在屏幕外.win7 win8或者vista不需要移动也可后台. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。 ( h% {, U! U3 o) x% f3 |, d, Z
"dx3" : dx3模式,同dx2模式,但是如果发现有些窗口后台不刷新时,可以考虑用dx3模式,此模式比dx2模式慢许多. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。8 V0 q) X0 j+ G0 ~
) \. B7 i- x" O% B# U/ d! b/ \dx模式,用于窗口采用dx模式刷新,取值可以是以下任意组合,组合采用"|"符号进行连接. 支持BindWindow中的缩写模式. 比如dx代表" dx.graphic.2d| dx.graphic.3d"9 s8 j5 `9 H* K" Y6 V! M( V8 P9 F
1. "dx.graphic.2d" 2d窗口的dx图色模式
* s" m l$ i4 @2. "dx.graphic.2d.2" 2d窗口的dx图色模式 是dx.graphic.2d的增强模式.兼容性更好.
. h+ i: B* Y- i5 ` T! k& k+ G3 w& a3. "dx.graphic.3d" 3d窗口的dx图色模式, + y( D5 L; K% T, K
4. "dx.graphic.3d.8" 3d窗口的dx8图色模式, 此模式对64位进程无效.5 Z! z9 g2 ?5 ^0 Q
5. "dx.graphic.opengl" 3d窗口的opengl图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.
$ p0 V' k# w% ?2 u6. "dx.graphic.opengl.esv2" 3d窗口的opengl_esv2图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.6 p6 j0 f0 G; ~+ H0 k% }+ q6 E
7. "dx.graphic.3d.10plus" 3d窗口的dx10 dx11图色模式
, g' G1 R- M7 X8 g
" m+ T. m+ x9 P" J0 _: gmouse 字符串: 鼠标仿真模式 取值有以下几种
: I A- W3 l1 A( v& B7 D2 i' G$ o4 J+ n: m% c8 h5 B. ~
"normal" : 正常模式,平常我们用的前台鼠标模式6 e2 F/ X% Q- K
/ R2 q5 D$ J$ I) [9 ]"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.
8 B+ d6 |0 v. P. F"windows3": Windows3模式,采取模拟windows消息方式,可以支持有多个子窗口的窗口后台
5 p, U o% h' ^; v4 R8 b9 Mdx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式,比如windows2代表"dx.mouse.position.lock.api|dx.mouse.position.lock.message|dx.mouse.state.message"8 W+ g) l" Y4 p+ ~9 Z
1. "dx.mouse.position.lock.api" 此模式表示通过封锁系统API,来锁定鼠标位置.
; V5 A; U, j( t5 }/ `0 `2. "dx.mouse.position.lock.message" 此模式表示通过封锁系统消息,来锁定鼠标位置.
" D5 T* Q3 H( `$ u) Y' `9 X3. "dx.mouse.focus.input.api" 此模式表示通过封锁系统API来锁定鼠标输入焦点.
- D' Z- \, }4 l, L6 i1 o4. "dx.mouse.focus.input.message"此模式表示通过封锁系统消息来锁定鼠标输入焦点.
3 F. B5 Q' Z* [( Y7 A5. "dx.mouse.clip.lock.api" 此模式表示通过封锁系统API来锁定刷新区域。注意,使用这个模式,在绑定前,必须要让窗口完全显示出来.
1 \9 ?8 a( }# M* y% t6. "dx.mouse.input.lock.api" 此模式表示通过封锁系统API来锁定鼠标输入接口.
. ^, Y4 C! Q; g7. "dx.mouse.state.api" 此模式表示通过封锁系统API来锁定鼠标输入状态.
% a$ |* j% j% \* n8. "dx.mouse.state.message" 此模式表示通过封锁系统消息来锁定鼠标输入状态.0 X$ d$ D, H2 C5 Z2 e$ `4 G; m
9. "dx.mouse.api" 此模式表示通过封锁系统API来模拟dx鼠标输入.
( d3 Z0 l( [ K6 c10. "dx.mouse.cursor" 开启此模式,可以后台获取鼠标特征码. ! l& f$ B$ \1 B* h
11. "dx.mouse.raw.input" 有些窗口需要这个才可以正常操作鼠标.
0 e# T3 e, h' H, c12. "dx.mouse.input.lock.api2" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.
& `- N8 v- b7 C5 x4 M5 O% {13. "dx.mouse.input.lock.api3" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.
( T7 i4 e9 u: L' Q3 v0 T2 K- }* Z3 ?' J1 y
keypad 字符串: 键盘仿真模式 取值有以下几种
8 D& a4 A9 A) H& ~
0 J* ~& q7 w9 }, w/ `) t0 h"normal" : 正常模式,平常我们用的前台键盘模式4 A$ r: @8 q; T/ n8 H; \
9 x, ?% O8 W( t9 l
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.9 M; k9 S* C; q1 W( y8 J, H
3 [& K$ O0 v! v- n: m' x1 Wdx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式.比如dx代表" dx.public.active.api|dx.public.active.message| dx.keypad.state.api|dx.keypad.api|dx.keypad.input.lock.api"( y9 `9 m" k; x6 r; a+ H) C, P
1. "dx.keypad.input.lock.api" 此模式表示通过封锁系统API来锁定键盘输入接口.
2 J0 L" c" @- k1 F2. "dx.keypad.state.api" 此模式表示通过封锁系统API来锁定键盘输入状态.
# w a5 M8 m/ |; D4 @# _3. "dx.keypad.api" 此模式表示通过封锁系统API来模拟dx键盘输入. 9 j' `% K% M( q. S5 d* t# D3 A
4. "dx.keypad.raw.input" 有些窗口需要这个才可以正常操作键盘.: [! t/ Q+ N( `% H; [ @- [
) ?8 r% U$ O8 i0 q) dpublic 字符串: 公共属性 dx模式共有
. L& P" G; i' {" b$ {4 N0 M5 j% ]1 F$ q0 {% |
取值可以是以下任意组合. 组合采用"|"符号进行连接 这个值可以为空
( x: p* t7 X* h1. "dx.public.active.api" 此模式表示通过封锁系统API来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. 0 N: b( S( E6 S# I
2. "dx.public.active.message" 此模式表示通过封锁系统消息来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. 另外如果要让此模式生效,必须在绑定前,让绑定窗口处于激活状态,否则此模式将失效. 比如dm.SetWindowState hwnd,1 然后再绑定.
# S. ]4 q3 G. v3 g! b0 c- ?3. "dx.public.disable.window.position" 此模式将锁定绑定窗口位置.不可与"dx.public.fake.window.min"共用.
; A$ B( F. f( P- o e4. "dx.public.disable.window.size" 此模式将锁定绑定窗口,禁止改变大小. 不可与"dx.public.fake.window.min"共用.+ E A4 e0 m( X
5. "dx.public.disable.window.minmax" 此模式将禁止窗口最大化和最小化,但是付出的代价是窗口同时也会被置顶. 不可与"dx.public.fake.window.min"共用.
* m- p6 B+ X. { R6. "dx.public.fake.window.min" 此模式将允许目标窗口在最小化状态时,仍然能够像非最小化一样操作.. 另注意,此模式会导致任务栏顺序重排,所以如果是多开模式下,会看起来比较混乱,建议单开使用,多开不建议使用. 同时此模式不是万能的,有些情况下最小化以后图色会不刷新或者黑屏.1 i" A8 E2 U9 \, Z3 o$ u/ [4 S
7. "dx.public.hide.dll" 此模式将会隐藏目标进程的大漠插件,避免被检测..另外使用此模式前,请仔细做过测试,此模式可能会造成目标进程不稳定,出现崩溃。
: H9 z8 E5 u" ~8. "dx.public.active.api2" 此模式表示通过封锁系统API来锁定窗口激活状态. 部分窗口遮挡无法后台,需要这个属性. ; u! k* P3 }, n* Z' G6 `- E
9. "dx.public.input.ime" 此模式是配合SendStringIme使用. 具体可以查看SendStringIme接口.
2 H9 I. @, d% J0 u0 `10 "dx.public.graphic.protect" 此模式可以保护dx图色不被恶意检测.同时对dx.keypad.api和dx.mouse.api也有保护效果./ A. L& a# ^4 T3 B
11 "dx.public.disable.window.show" 禁止目标窗口显示,这个一般用来配合dx.public.fake.window.min来使用. " C$ j' A. a; D4 L9 F& ]% b4 x8 d/ e
12 "dx.public.anti.api" 此模式可以突破部分窗口对后台的保护.
, N4 q* J, H4 d& r3 J# d13 "dx.public.km.protect" 此模式可以保护dx键鼠不被恶意检测.最好配合dx.public.anti.api一起使用. 此属性可能会导致部分后台功能失效.
' ^% |0 M; \. _: e) I; b( U14 "dx.public.prevent.block" 绑定模式1 3 5 7 101 103下,可能会导致部分窗口卡死. 这个属性可以避免卡死.
! S& z" @* i8 v15 "dx.public.ori.proc" 此属性只能用在模式0 1 2 3和101下. 有些窗口在不同的界面下(比如登录界面和登录进以后的界面),键鼠的控制效果不相同. 那可以用这个属性来尝试让保持一致. 注意的是,这个属性不可以滥用,确保测试无问题才可以使用. 否则可能会导致后台失效.
A' ~1 R1 Z) m4 B' e16 "dx.public.down.cpu" 此模式可以配合DownCpu来降低目标进程CPU占用. 当图色方式降低CPU无效时,可以尝试此种方式.
9 U0 r: @4 p# W17 "dx.public.focus.message" 当后台绑定后,后台无法正常在焦点窗口输入文字时,可以尝试加入此属性. 此属性会强制键盘消息发送到焦点窗口. 慎用此模式,此模式有可能会导致后台键盘在某些情况下失灵.
( g) f+ R: v/ l* Y18 "dx.public.graphic.speed" 只针对图色中的dx模式有效.此模式会牺牲目标窗口的性能,来提高DX图色速度,尤其是目标窗口刷新很慢时,这个参数就很有用了.
- q) W( }3 ~# [/ M, A19 "dx.public.memory" 让本对象突破目标进程防护,可以正常使用内存接口. 当用此方式使用内存接口时,内存接口的速度会取决于目标窗口的刷新率.
1 e+ t7 }# Y: j& Y$ e g! p, ]20 "dx.public.inject.super" 突破某些难以绑定的窗口. 此属性仅对除了模式0和2的其他模式有效.1 q& Y5 ]6 O" P1 @8 s
21 "dx.public.hack.speed" 类似变速齿轮,配合接口HackSpeed使用, `* k3 ]* x! h T2 t- ?- X J
5 F" g" U4 Y2 ~5 W
mode 整形数: 模式。取值有以下几种 0 : 推荐模式此模式比较通用,而且后台效果是最好的.
4 m) }, w" k0 B) o' }3 s 2 : 同模式0,如果模式0有崩溃问题,可以尝试此模式. 注意0和2模式,当主绑定(第一个绑定同个窗口的对象)绑定成功后,那么调用主绑定的线程必须一直维持,否则线程一旦推出,对应的绑定也会消失.) q. }9 U& l7 x( z( W' F
101 : 超级绑定模式. 可隐藏目标进程中的dm.dll.避免被恶意检测.效果要比dx.public.hide.dll好. 推荐使用.; d5 \0 x6 N2 e5 ]( n/ M
103 : 同模式101,如果模式101有崩溃问题,可以尝试此模式.
; B R3 o( ?# D3 V3 x7 D; j
) E6 C" D' T! b; j 11 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统& ?9 S9 N2 f6 P& H& ?- B& z/ P; m
) o* h8 X8 `% M& u
13 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统
I$ V) |3 \' K9 s2 ~' V/ @ r需要注意的是: 模式101 103在大部分窗口下绑定都没问题。但也有少数特殊的窗口,比如有很多子窗口的窗口,对于这种窗口,在绑定时,一定要把鼠标指向一个可以输入文字的窗口,比如一个文本框,最好能激活这个文本框,这样可以保证绑定的成功.
& M {% i) q; z9 C/ x. [返回值:5 I3 p, b m5 }# |% c+ E. s: |
整形数:. ~0 i1 {$ h# W$ a! `, H
0: 失败
4 R7 z& g+ \" x9 W9 M: s1: 成功, }: l/ C0 B1 B6 C7 J. Q$ o
6 Z$ ]" h3 ^7 F+ y如果返回0,可以调用GetLastError来查看具体失败错误码,帮助分析问题.& ?. h# o! g0 A0 s+ Y# n
示例:' |% g* H) z6 w* R. o5 { o. K
1 E$ o% U1 M5 Y; `- {: F2 u9 }) |
比如
+ u. f7 v" t/ v7 Qdm_ret = dm.BindWindowEx(hwnd,"normal","dx.mouse.position.lock.api|dx.mouse.position.lock.message","windows","dx.public.active.api",0)# f! i+ R: Y3 h. ^0 j# F
" v( c% G8 e" P1 A
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","normal","dx.public.active.api",0)2 h! B- E7 W. `. F! `3 }
- _% e3 N9 n, e7 i9 R% ]
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)
+ A5 N& l4 Z' j% q2 _ . f K- ?. _ ?1 t1 X f
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","",0)
" R1 Q, Y) x R' F3 D
& Y6 j8 Y4 E2 `; g- b+ edm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","dx.public.disable.window.size|dx.public.disable.window.minmax",0)
$ n) F) _) z* j
/ B& A! F4 e1 j! h% C% [dm_ret = dm.BindWindowEx(hwnd,"dx2","windows3","windows","dx.mouse.position.lock.api",0) z1 T( [$ j" E
等等.
" a& C: l% X6 S/ ] ?: |! k7 [
1 W* A1 L3 y5 }' V' q4 }注意:
8 i+ a+ q9 ^ d! l4 d; F
5 `+ h* j1 K* t1 i: q绑定之后,所有的坐标都相对于窗口的客户区坐标(不包含窗口边框)% I: }+ B" v+ ?9 l. [ Z+ n* K
另外,绑定窗口后,必须加以下代码,以保证所有资源正常释放
& c" s% X7 T# f" B, `2 o这个函数的意思是在脚本结束时,会调用这个函数。需要注意的是,目前的按键版本对于这个函数的执行不是线程级别的,也就是说,这个函数只会在主线程执行,子线程绑定的大漠对象,不保证完全释放。高级语言中则需要自己控制在适当的时候解除绑定.
/ b0 Y5 T! @ u& p, c# CSub OnScriptExit()7 N2 t$ w& l8 C# u
dm_ret = dm.UnBindWindow() 5 Z, c% p- ~- s$ L
End Sub# o9 y' x) U/ O- r9 Q+ e# C/ K
另外 绑定dx会比较耗时间,请不要频繁调用此函数.4 O2 O& V' V5 \* B; @* I( P$ [
还有一点特别要注意的是,有些窗口绑定之后必须加一定的延时,否则后台也无效.一般1秒到2秒的延时就足够.
6 s: C! G; I3 h; |
$ u8 p, Y9 x" {9 j% s! c发现绑定失败的几种可能(一般是需要管理员权限的模式才有可能会失败)5 e6 X4 ]1 i1 m$ P- A4 b
1. 系统登录的帐号必须有Administrators权限 2. 一些防火墙会防止插件注入窗口所在进程,比如360防火墙等,必须把dm.dll设置为信任. 3. 还有一个比较弱智的可能性,那就是插件没有注册到系统中,这时CreateObject压根就是失败的. 检测对象是否创建成功很简单,如下代码 set dm = createobject("dm.dmsoft")$ k" [( h0 j+ z7 s- j
ver = dm.Ver()
' T- ~& T) H' o. ^+ G, LIf len(ver) = 0 Then1 O/ s1 @: `; z8 d: n( t
MessageBox "创建对象失败,检查系统是否禁用了vbs脚本权限", b% x6 O& Z2 M5 l3 r0 ]) M8 W
EndScript
1 Q$ v) \1 A) u7 sEnd If 4. 在沙盘中开的窗口,绑定一些需要管理员权限的模式,会失败。
H0 q* R% a, Z J" D( d; G解决方法是要配置沙盘参数,参考如何配置沙盘参数.
' V# n! L- @8 \# x- }9 [- G! g8 q; ~5 S
5. 窗口所在进程有保护,这个我也无能为力. 5 M. u9 q1 h% c) U* X. M; P
3 k8 [8 {. n% ^1 U9 S% a4 g h |