|
BindWindowEx函数简介: 绑定指定的窗口,并指定这个窗口的屏幕颜色获取方式,鼠标仿真模式,键盘仿真模式 高级用户使用.
9 f- J# ^4 f7 L7 R* r函数原型:
* Y& W b9 i! L7 I
# _! A* p0 X. Along BindWindowEx(hwnd,display,mouse,keypad,public,mode)
/ H# ^" U- w9 ]/ g
& Z, u. C; s) J* q: t- ^1 A- E
) U+ y- W) y/ T$ l
: a! r- [! ~3 f: G% o4 P: o
) A- J3 w6 M( z# {易语言调用BindWindowEx命令见下图
9 s+ b- n8 T2 J+ S' b" _
- P3 g3 [2 c% h1 j, V: g
- U* f9 K2 y- [8 A, r
3 B; H! S0 l( f6 _& n8 Q. [' G" `5 {. z' F% A* ^/ x8 t$ T4 d
8 `# y6 z0 N+ ?' ^" Y" \
# F7 Z& G0 \$ { n& A5 |+ M
0 m9 I% w7 p5 c$ I' P- q$ z# a5 m8 \+ A3 G' W- D
参数定义:
; |) ]# n( V6 W$ v# g& r( d4 A( G4 \+ p% {- R; H5 X6 p, D! |% Q j" z& V
hwnd 整形数: 指定的窗口句柄$ Z, b3 ^( e, l' z2 F, h0 W% w
1 t4 R* P2 e& R
display 字符串: 屏幕颜色获取方式 取值有以下几种! w! O( l# e7 V4 ~2 j6 Z
8 A- @- N1 u$ E# X"normal" : 正常模式,平常我们用的前台截屏模式
3 B6 A. Q7 ^3 F& q. I/ e# Q$ C
5 i8 n$ y; w, u5 Z8 m" u"gdi" : gdi模式,用于窗口采用GDI方式刷新时. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。 1 `+ C7 h5 J ?
"gdi2" : gdi2模式,此模式兼容性较强,但是速度比gdi模式要慢许多,如果gdi模式发现后台不刷新时,可以考虑用gdi2模式.% c4 ?5 r( x0 w* U
" h% X3 O1 p. u3 v M2 n7 C
"dx2" : dx2模式,用于窗口采用dx模式刷新,如果dx方式会出现窗口进程崩溃的状况,可以考虑采用这种.采用这种方式要保证窗口有一部分在屏幕外.win7 win8或者vista不需要移动也可后台. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
6 c2 [6 n! Y0 ^"dx3" : dx3模式,同dx2模式,但是如果发现有些窗口后台不刷新时,可以考虑用dx3模式,此模式比dx2模式慢许多. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
5 F6 \! e! F5 y' s+ Y+ }
5 x3 [3 b+ J. z- |5 ]# mdx模式,用于窗口采用dx模式刷新,取值可以是以下任意组合,组合采用"|"符号进行连接. 支持BindWindow中的缩写模式. 比如dx代表" dx.graphic.2d| dx.graphic.3d"
, T# x% A% q! A* |) j& d1. "dx.graphic.2d" 2d窗口的dx图色模式 E: m+ C8 P5 |& t
2. "dx.graphic.2d.2" 2d窗口的dx图色模式 是dx.graphic.2d的增强模式.兼容性更好.
# ^3 g- e" I0 u( w. b+ V \3. "dx.graphic.3d" 3d窗口的dx图色模式,
6 h7 [+ {* d1 {, n$ @2 b$ M4. "dx.graphic.3d.8" 3d窗口的dx8图色模式, 此模式对64位进程无效.
7 O) a/ `) a# w- T' B E) D5. "dx.graphic.opengl" 3d窗口的opengl图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢. * N7 g2 D N ^' h5 v2 _; {
6. "dx.graphic.opengl.esv2" 3d窗口的opengl_esv2图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.7 c& O5 r6 C% G, W4 v$ y% V
7. "dx.graphic.3d.10plus" 3d窗口的dx10 dx11图色模式/ r7 C. P t# l# U' M( y
" u* S6 ]" A' P. N3 j
mouse 字符串: 鼠标仿真模式 取值有以下几种" m* J2 i; j' l$ m* H8 L2 k+ J
! v/ y3 h3 m" F# W( Z6 e0 p% B"normal" : 正常模式,平常我们用的前台鼠标模式
. p; K; M' X2 e5 d3 a3 {1 \% V/ S/ M8 m0 A6 t
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.
; h* U. Z* O, c, N3 a0 ?% C"windows3": Windows3模式,采取模拟windows消息方式,可以支持有多个子窗口的窗口后台# O5 R* T: {( |4 y
dx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式,比如windows2代表"dx.mouse.position.lock.api|dx.mouse.position.lock.message|dx.mouse.state.message"
+ C u; b% K8 v, C2 J; x1 [1. "dx.mouse.position.lock.api" 此模式表示通过封锁系统API,来锁定鼠标位置.2 N8 ^8 @1 S, S8 e; t
2. "dx.mouse.position.lock.message" 此模式表示通过封锁系统消息,来锁定鼠标位置.
* u9 ?$ k" d6 n1 \; |* i6 I" I/ a' \3. "dx.mouse.focus.input.api" 此模式表示通过封锁系统API来锁定鼠标输入焦点.3 W; ]& B+ o: h* X! }6 C J
4. "dx.mouse.focus.input.message"此模式表示通过封锁系统消息来锁定鼠标输入焦点.: {, b0 I0 e8 ]" z
5. "dx.mouse.clip.lock.api" 此模式表示通过封锁系统API来锁定刷新区域。注意,使用这个模式,在绑定前,必须要让窗口完全显示出来.
& B) M8 g" G1 S0 i6 M6. "dx.mouse.input.lock.api" 此模式表示通过封锁系统API来锁定鼠标输入接口.
0 H- S1 B# ?9 U3 }4 d7. "dx.mouse.state.api" 此模式表示通过封锁系统API来锁定鼠标输入状态.
, q2 a# {! C. c' H8. "dx.mouse.state.message" 此模式表示通过封锁系统消息来锁定鼠标输入状态.* m$ m) m4 h( D4 _3 N2 Z. K
9. "dx.mouse.api" 此模式表示通过封锁系统API来模拟dx鼠标输入.+ n8 f) v6 U; z
10. "dx.mouse.cursor" 开启此模式,可以后台获取鼠标特征码. # Q7 Z1 W1 T5 P' A& V8 p) K
11. "dx.mouse.raw.input" 有些窗口需要这个才可以正常操作鼠标.
5 a0 j4 n$ E5 @: y; u/ X12. "dx.mouse.input.lock.api2" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.8 j5 @( W$ b" F& @
13. "dx.mouse.input.lock.api3" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性. $ b4 A. c: g# r, I" {
1 B0 W2 V$ i! z0 ukeypad 字符串: 键盘仿真模式 取值有以下几种5 |8 b& o; f! D& y* S
! \' W/ t* v! J. W"normal" : 正常模式,平常我们用的前台键盘模式
: L% ^$ f L& B/ D9 _) {6 p. H2 h! M |
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.
/ T7 ~/ m: \; v. S7 Q$ O% t! Z( z
dx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式.比如dx代表" dx.public.active.api|dx.public.active.message| dx.keypad.state.api|dx.keypad.api|dx.keypad.input.lock.api"& J1 ?8 r/ K O- D& z; s
1. "dx.keypad.input.lock.api" 此模式表示通过封锁系统API来锁定键盘输入接口.4 ?8 r+ r& t" ?' I+ d+ C
2. "dx.keypad.state.api" 此模式表示通过封锁系统API来锁定键盘输入状态.
$ d( I1 F5 S3 G @1 \1 q# B7 J3. "dx.keypad.api" 此模式表示通过封锁系统API来模拟dx键盘输入. / H z0 u$ I3 [& X7 r7 D. m
4. "dx.keypad.raw.input" 有些窗口需要这个才可以正常操作键盘.) r4 `1 l9 b& r8 q1 O, w) b
4 s; R. b, \& p/ e' {
public 字符串: 公共属性 dx模式共有
% N5 F9 B u* P4 S
& p' T# ?3 ~ w4 \' L% U8 K取值可以是以下任意组合. 组合采用"|"符号进行连接 这个值可以为空5 u o* J" e: R% c! n
1. "dx.public.active.api" 此模式表示通过封锁系统API来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用.
5 J9 t/ ~& i' R; n2. "dx.public.active.message" 此模式表示通过封锁系统消息来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. 另外如果要让此模式生效,必须在绑定前,让绑定窗口处于激活状态,否则此模式将失效. 比如dm.SetWindowState hwnd,1 然后再绑定.
7 p5 h5 n& ?9 a p7 t2 `6 u3. "dx.public.disable.window.position" 此模式将锁定绑定窗口位置.不可与"dx.public.fake.window.min"共用.$ Z6 v7 B6 F$ `
4. "dx.public.disable.window.size" 此模式将锁定绑定窗口,禁止改变大小. 不可与"dx.public.fake.window.min"共用.: k- u6 a2 u0 b: E8 ^/ {5 \
5. "dx.public.disable.window.minmax" 此模式将禁止窗口最大化和最小化,但是付出的代价是窗口同时也会被置顶. 不可与"dx.public.fake.window.min"共用.1 s* x4 n* K7 _( q! e N, z4 X
6. "dx.public.fake.window.min" 此模式将允许目标窗口在最小化状态时,仍然能够像非最小化一样操作.. 另注意,此模式会导致任务栏顺序重排,所以如果是多开模式下,会看起来比较混乱,建议单开使用,多开不建议使用. 同时此模式不是万能的,有些情况下最小化以后图色会不刷新或者黑屏.
4 A6 d4 q3 f7 K7 w7. "dx.public.hide.dll" 此模式将会隐藏目标进程的大漠插件,避免被检测..另外使用此模式前,请仔细做过测试,此模式可能会造成目标进程不稳定,出现崩溃。
1 E* d* e% K r, C. c& l% C8. "dx.public.active.api2" 此模式表示通过封锁系统API来锁定窗口激活状态. 部分窗口遮挡无法后台,需要这个属性.
# X9 v$ W0 j4 B$ N* d9. "dx.public.input.ime" 此模式是配合SendStringIme使用. 具体可以查看SendStringIme接口.
" ?; W4 B: _2 F+ v- {10 "dx.public.graphic.protect" 此模式可以保护dx图色不被恶意检测.同时对dx.keypad.api和dx.mouse.api也有保护效果.
9 w& O+ r: p% Z, _% {11 "dx.public.disable.window.show" 禁止目标窗口显示,这个一般用来配合dx.public.fake.window.min来使用.
7 \+ k3 p7 i( ]; d/ _12 "dx.public.anti.api" 此模式可以突破部分窗口对后台的保护.
( Q- Z' N$ f2 }3 E: w6 a1 b6 I, g13 "dx.public.km.protect" 此模式可以保护dx键鼠不被恶意检测.最好配合dx.public.anti.api一起使用. 此属性可能会导致部分后台功能失效.
4 e' ~9 c7 m, g+ X14 "dx.public.prevent.block" 绑定模式1 3 5 7 101 103下,可能会导致部分窗口卡死. 这个属性可以避免卡死.
6 m) V7 U* i; S. S0 Z15 "dx.public.ori.proc" 此属性只能用在模式0 1 2 3和101下. 有些窗口在不同的界面下(比如登录界面和登录进以后的界面),键鼠的控制效果不相同. 那可以用这个属性来尝试让保持一致. 注意的是,这个属性不可以滥用,确保测试无问题才可以使用. 否则可能会导致后台失效. ?- r: ~$ u; H
16 "dx.public.down.cpu" 此模式可以配合DownCpu来降低目标进程CPU占用. 当图色方式降低CPU无效时,可以尝试此种方式.8 H$ V1 s/ x# g) c
17 "dx.public.focus.message" 当后台绑定后,后台无法正常在焦点窗口输入文字时,可以尝试加入此属性. 此属性会强制键盘消息发送到焦点窗口. 慎用此模式,此模式有可能会导致后台键盘在某些情况下失灵.
5 w4 `8 g9 \" Z& N" g& [) S, @18 "dx.public.graphic.speed" 只针对图色中的dx模式有效.此模式会牺牲目标窗口的性能,来提高DX图色速度,尤其是目标窗口刷新很慢时,这个参数就很有用了.. `2 \' h, r& J( `
19 "dx.public.memory" 让本对象突破目标进程防护,可以正常使用内存接口. 当用此方式使用内存接口时,内存接口的速度会取决于目标窗口的刷新率.) g* ~& r% B. r
20 "dx.public.inject.super" 突破某些难以绑定的窗口. 此属性仅对除了模式0和2的其他模式有效.
2 |: f, c. d. _$ y3 |5 Z8 `/ Y21 "dx.public.hack.speed" 类似变速齿轮,配合接口HackSpeed使用, d$ e9 \" g& [! f8 I
- V+ M, w6 a) {/ o9 {9 U) \
mode 整形数: 模式。取值有以下几种 0 : 推荐模式此模式比较通用,而且后台效果是最好的.
& S) ] T% M$ T* V 2 : 同模式0,如果模式0有崩溃问题,可以尝试此模式. 注意0和2模式,当主绑定(第一个绑定同个窗口的对象)绑定成功后,那么调用主绑定的线程必须一直维持,否则线程一旦推出,对应的绑定也会消失./ t( M0 O+ j. k$ c& |: p
101 : 超级绑定模式. 可隐藏目标进程中的dm.dll.避免被恶意检测.效果要比dx.public.hide.dll好. 推荐使用.
* I; g3 W- z; n9 X' u+ B; g1 \ 103 : 同模式101,如果模式101有崩溃问题,可以尝试此模式. , w+ M, }* S2 M' H
4 L' Z& A1 c7 t0 m v4 H" `
11 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统# F, g& a `' \
/ U/ G, W Y( ?+ C7 c4 Y1 I 13 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统, [) f8 M2 |& n, ~
需要注意的是: 模式101 103在大部分窗口下绑定都没问题。但也有少数特殊的窗口,比如有很多子窗口的窗口,对于这种窗口,在绑定时,一定要把鼠标指向一个可以输入文字的窗口,比如一个文本框,最好能激活这个文本框,这样可以保证绑定的成功.
1 Z% ~) K6 f( o3 ^8 K. D返回值:
( @4 ?! }2 P) q8 a& k整形数:$ p& D/ m- M \5 G; K$ Q/ g
0: 失败
; p8 u- v0 J# O5 B1: 成功
( C1 r- }8 K) V* T6 _ V: L
+ P; c' f; E, o) b% ^. g" {, W如果返回0,可以调用GetLastError来查看具体失败错误码,帮助分析问题.
6 y5 }! ~) j. f示例:
$ n* A) Q4 K7 g# l3 O+ u
& z' D- z& J; C6 Z比如9 [3 Y+ C4 K. P* ]- J" P9 ]% f6 W
dm_ret = dm.BindWindowEx(hwnd,"normal","dx.mouse.position.lock.api|dx.mouse.position.lock.message","windows","dx.public.active.api",0)
m4 V1 y% r' X2 }7 D$ n. V $ z' N1 ]4 }# ~; Q5 ]
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","normal","dx.public.active.api",0)
: v; K) k' ?: \/ U+ Q( {* L9 ~
1 q D/ d1 J- G& f8 Q" l8 adm_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)- b: A7 M* j f# [3 U1 D
+ ]1 H) B6 Y' @$ O
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","",0)( T0 p; s. [; w1 O0 u) b
8 V/ K* g0 V. n" b* o# K% ~
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","dx.public.disable.window.size|dx.public.disable.window.minmax",0)
- @4 }" m' r! G4 B7 ^" m; y2 c6 | ! i- L, a( D2 ]8 L1 Z1 G
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows3","windows","dx.mouse.position.lock.api",0)) P8 u, j3 Z: r4 |5 E8 L
等等.. X) r' u7 Y7 w2 A2 C: b2 J( r
! d" x5 h- F/ Y6 l1 j/ X ^注意:
+ H) T0 {8 @; q$ Y' f; ?1 [
& h* j0 H4 p4 X0 n0 Z ] ~* F绑定之后,所有的坐标都相对于窗口的客户区坐标(不包含窗口边框)7 \0 W6 H6 Q+ b1 @/ E$ r7 Q+ E
另外,绑定窗口后,必须加以下代码,以保证所有资源正常释放1 b7 t, U u- B, J0 b( r
这个函数的意思是在脚本结束时,会调用这个函数。需要注意的是,目前的按键版本对于这个函数的执行不是线程级别的,也就是说,这个函数只会在主线程执行,子线程绑定的大漠对象,不保证完全释放。高级语言中则需要自己控制在适当的时候解除绑定.) t" @1 \8 J2 W6 I1 q; T
Sub OnScriptExit()) g) C" w# p" Y/ c0 i- M& l0 _- Y( x
dm_ret = dm.UnBindWindow() 3 F9 Y& S; _ Z* x) o& F4 u
End Sub
2 r( h* l$ K1 h7 L* Y另外 绑定dx会比较耗时间,请不要频繁调用此函数.
& l. _% I5 U' ]: w: d1 N/ N& Q/ e还有一点特别要注意的是,有些窗口绑定之后必须加一定的延时,否则后台也无效.一般1秒到2秒的延时就足够.
0 j! Z4 _4 ^. R+ l; z& c & q. B" K, O0 X* h
发现绑定失败的几种可能(一般是需要管理员权限的模式才有可能会失败)0 l- L; m2 ^2 c/ D ?+ ^& `% y. P' C
1. 系统登录的帐号必须有Administrators权限 2. 一些防火墙会防止插件注入窗口所在进程,比如360防火墙等,必须把dm.dll设置为信任. 3. 还有一个比较弱智的可能性,那就是插件没有注册到系统中,这时CreateObject压根就是失败的. 检测对象是否创建成功很简单,如下代码 set dm = createobject("dm.dmsoft")
+ U2 z% L' l/ }7 x: m3 A, T6 a% `6 ~ver = dm.Ver()
! b! g# p" ?8 i# @: s3 y7 F$ xIf len(ver) = 0 Then% S7 t* ~7 p9 @1 d9 R9 v
MessageBox "创建对象失败,检查系统是否禁用了vbs脚本权限"8 p# I/ g& ]9 K% e/ e$ D
EndScript
4 B( W' d2 _: B, f3 P% B$ GEnd If 4. 在沙盘中开的窗口,绑定一些需要管理员权限的模式,会失败。
! f8 x4 V. ^6 l& X解决方法是要配置沙盘参数,参考如何配置沙盘参数.
% f/ A" c' g9 b% w5 a$ Y( } r# j# r* v' e8 O" i
5. 窗口所在进程有保护,这个我也无能为力.
. j2 Z: _+ E" z: ?% e' G; Y% u. K" a0 w x6 C# n
|