|
BindWindowEx函数简介: 绑定指定的窗口,并指定这个窗口的屏幕颜色获取方式,鼠标仿真模式,键盘仿真模式 高级用户使用.9 Z8 ^+ S, L4 H8 b7 ]1 ]
函数原型:
* a5 b5 q& |- Q1 H
8 e) D# U0 b2 F: |. B% i2 {long BindWindowEx(hwnd,display,mouse,keypad,public,mode)' L$ @! B9 Q& K3 `9 k$ _
# _9 N3 n( p8 j; j/ G
) F9 n4 j, \$ }* q) Y, I9 t3 M+ L: {% q e
/ `9 w6 |9 B9 Y
易语言调用BindWindowEx命令见下图
+ z+ u! V! _- S7 P; _, ^! q f( B3 k: R
# X/ d: `" L& n( ^1 l# p
% f2 Z i3 ~5 U, n) s
* h2 k7 s$ B w d6 l3 a. g9 j
; e) U/ n0 U# A% ]8 r
3 e$ ~; g( f x+ X( ?9 z ^% g+ _2 J+ `& w( E0 E( u/ b4 [$ M/ i' d
8 d6 C# c9 L# K% k1 |参数定义:+ V+ M1 ^+ A5 l; b- `8 z; P; `
# O' _) c! L+ S9 D0 Z$ \+ i
hwnd 整形数: 指定的窗口句柄
& q2 G' S* I; m; ?5 q' U
6 D9 U4 B0 _, @: W( C. udisplay 字符串: 屏幕颜色获取方式 取值有以下几种1 P: E# M8 a( D6 Y8 V
) Q4 @4 ^- S T
"normal" : 正常模式,平常我们用的前台截屏模式6 h" ^/ }. X3 `' J
1 Y: `2 G; m9 d. p"gdi" : gdi模式,用于窗口采用GDI方式刷新时. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。 7 B4 R7 {0 K4 E3 h& J" I* J! y
"gdi2" : gdi2模式,此模式兼容性较强,但是速度比gdi模式要慢许多,如果gdi模式发现后台不刷新时,可以考虑用gdi2模式.
. {: @) _# i& I* G) Q: F4 t7 f E" K8 w* ^3 O+ c; U
"dx2" : dx2模式,用于窗口采用dx模式刷新,如果dx方式会出现窗口进程崩溃的状况,可以考虑采用这种.采用这种方式要保证窗口有一部分在屏幕外.win7 win8或者vista不需要移动也可后台. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
1 l4 [# n8 c; V1 _, h6 @"dx3" : dx3模式,同dx2模式,但是如果发现有些窗口后台不刷新时,可以考虑用dx3模式,此模式比dx2模式慢许多. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
2 O* y( o+ m7 U- g; `( C2 R, D, u. c
dx模式,用于窗口采用dx模式刷新,取值可以是以下任意组合,组合采用"|"符号进行连接. 支持BindWindow中的缩写模式. 比如dx代表" dx.graphic.2d| dx.graphic.3d". P$ F' d6 Z T2 C
1. "dx.graphic.2d" 2d窗口的dx图色模式 / y" i9 I! Q" ]$ `/ ^& ~4 y$ F
2. "dx.graphic.2d.2" 2d窗口的dx图色模式 是dx.graphic.2d的增强模式.兼容性更好.; V: a# j3 ^ ], t: y S8 T
3. "dx.graphic.3d" 3d窗口的dx图色模式, 5 T2 U7 P6 f+ K. i( S3 q2 S
4. "dx.graphic.3d.8" 3d窗口的dx8图色模式, 此模式对64位进程无效.
, `1 b8 k$ }5 z5. "dx.graphic.opengl" 3d窗口的opengl图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢. 9 N3 h. F5 M2 @2 H6 x
6. "dx.graphic.opengl.esv2" 3d窗口的opengl_esv2图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.
8 Z' h: `# @2 f o$ G( t7. "dx.graphic.3d.10plus" 3d窗口的dx10 dx11图色模式6 e5 h, V+ l( G+ x! G) O
* Z- O9 u9 f/ A# e7 @ T
mouse 字符串: 鼠标仿真模式 取值有以下几种
+ ^$ C' I* \, J. h# f: S$ P% P R, a: ^* `
"normal" : 正常模式,平常我们用的前台鼠标模式 T8 n* {0 W: i) i! d/ |# U
~" K' {9 |& J/ u2 r- @" ?0 i
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.
% ^4 \* z s: j. U1 K"windows3": Windows3模式,采取模拟windows消息方式,可以支持有多个子窗口的窗口后台
2 a$ n% @! X6 i7 I5 A Fdx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式,比如windows2代表"dx.mouse.position.lock.api|dx.mouse.position.lock.message|dx.mouse.state.message"
0 {5 U) h- P N7 g( Z1. "dx.mouse.position.lock.api" 此模式表示通过封锁系统API,来锁定鼠标位置.
c" W0 i: r1 P# B2 N% u& E2. "dx.mouse.position.lock.message" 此模式表示通过封锁系统消息,来锁定鼠标位置.
, J8 {4 e; V5 P5 }3. "dx.mouse.focus.input.api" 此模式表示通过封锁系统API来锁定鼠标输入焦点.
3 t" C* `' z- P# s2 B4. "dx.mouse.focus.input.message"此模式表示通过封锁系统消息来锁定鼠标输入焦点. {# T: A. A# Y. [
5. "dx.mouse.clip.lock.api" 此模式表示通过封锁系统API来锁定刷新区域。注意,使用这个模式,在绑定前,必须要让窗口完全显示出来.
) w5 @! ?, z5 O" F7 U1 B7 \7 I2 c+ h6. "dx.mouse.input.lock.api" 此模式表示通过封锁系统API来锁定鼠标输入接口.' c. Z% q) G) b/ ]
7. "dx.mouse.state.api" 此模式表示通过封锁系统API来锁定鼠标输入状态.. X, C1 C1 G3 ^' I9 [& z
8. "dx.mouse.state.message" 此模式表示通过封锁系统消息来锁定鼠标输入状态.4 I- E+ Z: g# D5 H# c0 k6 ~% a& y! c
9. "dx.mouse.api" 此模式表示通过封锁系统API来模拟dx鼠标输入.
8 W6 P0 k/ u2 d/ B$ U' Y/ Y$ L10. "dx.mouse.cursor" 开启此模式,可以后台获取鼠标特征码.
$ h0 S7 V3 b! ~: N) F( V: ]11. "dx.mouse.raw.input" 有些窗口需要这个才可以正常操作鼠标.
, R7 o- q: \2 X7 V12. "dx.mouse.input.lock.api2" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.
, z$ [$ C+ x8 B0 K, `; [, [/ j13. "dx.mouse.input.lock.api3" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.
6 m6 t' n5 F7 L' H& K0 L. S3 D) w9 A! X) f B+ [
keypad 字符串: 键盘仿真模式 取值有以下几种
$ n6 a. c# c9 |; k. g$ P. \& M% a& W( C8 `# T# }/ R) ^
"normal" : 正常模式,平常我们用的前台键盘模式8 k& V. {8 i- ?3 R' ^5 [
/ p8 F; C) n1 t. A$ ?/ J"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.- W$ v- [3 `0 ?8 n
T" c; M9 X0 X$ Udx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式.比如dx代表" dx.public.active.api|dx.public.active.message| dx.keypad.state.api|dx.keypad.api|dx.keypad.input.lock.api"1 l" A$ O, i% z
1. "dx.keypad.input.lock.api" 此模式表示通过封锁系统API来锁定键盘输入接口.
( U a+ y% C9 x2. "dx.keypad.state.api" 此模式表示通过封锁系统API来锁定键盘输入状态./ ]: U! U7 j) [( p% ^
3. "dx.keypad.api" 此模式表示通过封锁系统API来模拟dx键盘输入.
. ], h- |% X# y/ z' W+ O4 G. L6 L4. "dx.keypad.raw.input" 有些窗口需要这个才可以正常操作键盘.
9 F8 [) K0 i) f
5 L" d: A& L; B6 E& Wpublic 字符串: 公共属性 dx模式共有 ; [7 i* [4 P) u5 G3 t) i! h
" O. i; s1 m$ H8 ^2 R6 s
取值可以是以下任意组合. 组合采用"|"符号进行连接 这个值可以为空9 l0 U5 V" S5 R& z s5 o
1. "dx.public.active.api" 此模式表示通过封锁系统API来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. # g* i) H. c& K/ s+ ^- \
2. "dx.public.active.message" 此模式表示通过封锁系统消息来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. 另外如果要让此模式生效,必须在绑定前,让绑定窗口处于激活状态,否则此模式将失效. 比如dm.SetWindowState hwnd,1 然后再绑定.. c/ D- C, L8 d
3. "dx.public.disable.window.position" 此模式将锁定绑定窗口位置.不可与"dx.public.fake.window.min"共用.
8 L* N. J; q% w/ {4. "dx.public.disable.window.size" 此模式将锁定绑定窗口,禁止改变大小. 不可与"dx.public.fake.window.min"共用.5 ?' Z' T$ Q" d& ^+ B
5. "dx.public.disable.window.minmax" 此模式将禁止窗口最大化和最小化,但是付出的代价是窗口同时也会被置顶. 不可与"dx.public.fake.window.min"共用.3 h) y$ o% t, L P/ v0 q( q
6. "dx.public.fake.window.min" 此模式将允许目标窗口在最小化状态时,仍然能够像非最小化一样操作.. 另注意,此模式会导致任务栏顺序重排,所以如果是多开模式下,会看起来比较混乱,建议单开使用,多开不建议使用. 同时此模式不是万能的,有些情况下最小化以后图色会不刷新或者黑屏.
3 X* b0 S: o! B; Z6 G3 i8 ]# l7. "dx.public.hide.dll" 此模式将会隐藏目标进程的大漠插件,避免被检测..另外使用此模式前,请仔细做过测试,此模式可能会造成目标进程不稳定,出现崩溃。
/ y. F7 {& y# W( U8. "dx.public.active.api2" 此模式表示通过封锁系统API来锁定窗口激活状态. 部分窗口遮挡无法后台,需要这个属性. $ ~$ [; x$ g' c/ L! w2 q
9. "dx.public.input.ime" 此模式是配合SendStringIme使用. 具体可以查看SendStringIme接口.) c7 f G6 x# c6 C0 J+ R1 N f
10 "dx.public.graphic.protect" 此模式可以保护dx图色不被恶意检测.同时对dx.keypad.api和dx.mouse.api也有保护效果.1 u0 S" |# B1 s2 v' T
11 "dx.public.disable.window.show" 禁止目标窗口显示,这个一般用来配合dx.public.fake.window.min来使用. 5 u+ ~; j) Z8 `& G& {& _4 ^0 H
12 "dx.public.anti.api" 此模式可以突破部分窗口对后台的保护.& H, ]8 O* b# S. V
13 "dx.public.km.protect" 此模式可以保护dx键鼠不被恶意检测.最好配合dx.public.anti.api一起使用. 此属性可能会导致部分后台功能失效.
+ v- k) O- j! }5 B14 "dx.public.prevent.block" 绑定模式1 3 5 7 101 103下,可能会导致部分窗口卡死. 这个属性可以避免卡死.
; {/ n2 V6 |9 _+ G4 T2 L15 "dx.public.ori.proc" 此属性只能用在模式0 1 2 3和101下. 有些窗口在不同的界面下(比如登录界面和登录进以后的界面),键鼠的控制效果不相同. 那可以用这个属性来尝试让保持一致. 注意的是,这个属性不可以滥用,确保测试无问题才可以使用. 否则可能会导致后台失效.' S0 I, I) ?/ c1 ?* U
16 "dx.public.down.cpu" 此模式可以配合DownCpu来降低目标进程CPU占用. 当图色方式降低CPU无效时,可以尝试此种方式.
6 G' |* n; ^7 r7 H5 @17 "dx.public.focus.message" 当后台绑定后,后台无法正常在焦点窗口输入文字时,可以尝试加入此属性. 此属性会强制键盘消息发送到焦点窗口. 慎用此模式,此模式有可能会导致后台键盘在某些情况下失灵.
+ y8 O% b7 ?" s) h& K: ~& B3 M18 "dx.public.graphic.speed" 只针对图色中的dx模式有效.此模式会牺牲目标窗口的性能,来提高DX图色速度,尤其是目标窗口刷新很慢时,这个参数就很有用了.( x& W r4 Y& ^" {; \; _
19 "dx.public.memory" 让本对象突破目标进程防护,可以正常使用内存接口. 当用此方式使用内存接口时,内存接口的速度会取决于目标窗口的刷新率.
) Z1 ~( K) l0 R4 z20 "dx.public.inject.super" 突破某些难以绑定的窗口. 此属性仅对除了模式0和2的其他模式有效. b2 v- M% Z) b U+ i2 ]0 v
21 "dx.public.hack.speed" 类似变速齿轮,配合接口HackSpeed使用* Y6 ?/ O& `, u2 b4 a1 c
6 ?4 m, F/ P% q4 t: k
mode 整形数: 模式。取值有以下几种 0 : 推荐模式此模式比较通用,而且后台效果是最好的.) Y0 X% T, b0 v: {+ M. W
2 : 同模式0,如果模式0有崩溃问题,可以尝试此模式. 注意0和2模式,当主绑定(第一个绑定同个窗口的对象)绑定成功后,那么调用主绑定的线程必须一直维持,否则线程一旦推出,对应的绑定也会消失.9 P2 A" A6 H' g3 `$ g/ |6 u
101 : 超级绑定模式. 可隐藏目标进程中的dm.dll.避免被恶意检测.效果要比dx.public.hide.dll好. 推荐使用.
; ?9 J: o) H8 R0 w( E% @9 K 103 : 同模式101,如果模式101有崩溃问题,可以尝试此模式.
, m; b& e2 X8 O. K% n2 I4 \
* b g5 \% Z' I/ c) C1 v 11 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统* j: E+ C" G: J
5 g3 R+ L D3 b" p( p6 x9 p: Q
13 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统
5 D2 n2 w6 q' A5 i6 D( E需要注意的是: 模式101 103在大部分窗口下绑定都没问题。但也有少数特殊的窗口,比如有很多子窗口的窗口,对于这种窗口,在绑定时,一定要把鼠标指向一个可以输入文字的窗口,比如一个文本框,最好能激活这个文本框,这样可以保证绑定的成功.9 }% ]2 n+ R8 K
返回值:
( n) ]. \5 k" d. o6 Q整形数:5 `$ U; W6 ?, `0 R* p) q
0: 失败' d" ~$ E9 L) @% h- c
1: 成功6 `5 A) |& w/ |1 q* z' M( t5 g
) f3 j# Q' l; v! y# D5 w
如果返回0,可以调用GetLastError来查看具体失败错误码,帮助分析问题.
5 x# a6 y- W! P% O' q, u: ]+ i& H7 w6 O示例:, ?' H& j7 Y- E4 D. I$ y5 v
4 w+ c) z* b/ ?+ o9 V- q7 w比如$ t) |) ?2 r+ \ p
dm_ret = dm.BindWindowEx(hwnd,"normal","dx.mouse.position.lock.api|dx.mouse.position.lock.message","windows","dx.public.active.api",0)
/ E2 n' Z$ a5 t% w, Y1 e) f6 ~& b2 r 9 W4 l5 J1 a9 g5 W |' j8 I
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","normal","dx.public.active.api",0)0 T/ r6 N6 K5 K4 G4 `' Z1 d7 w7 T
+ c0 d6 v9 L4 r5 a+ tdm_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)! b1 M; R7 U; Q! P
% o$ L( A3 X9 x0 g6 H- _- Z Z
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","",0)
5 z. ]- t: J1 J* S& J+ k2 o/ _4 M
: N+ ~$ b" P3 u5 v1 p2 Jdm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","dx.public.disable.window.size|dx.public.disable.window.minmax",0). O8 Q, X1 _6 G+ Y5 e4 B& B- c
1 q6 K5 v8 L- i# [6 ddm_ret = dm.BindWindowEx(hwnd,"dx2","windows3","windows","dx.mouse.position.lock.api",0)
6 }2 n6 p: ?$ P) O6 J8 z, \等等.
0 q! t6 m+ T) U0 Z; l$ K4 i- |. ~7 u
8 g9 Y7 B4 p# H! s2 T2 ?1 a+ a* e注意:, T3 ~) u) X. _5 o
u3 J7 P/ b$ I' {
绑定之后,所有的坐标都相对于窗口的客户区坐标(不包含窗口边框)
$ d- w/ n5 U; ~$ _另外,绑定窗口后,必须加以下代码,以保证所有资源正常释放
- i4 T8 k$ g& X5 R这个函数的意思是在脚本结束时,会调用这个函数。需要注意的是,目前的按键版本对于这个函数的执行不是线程级别的,也就是说,这个函数只会在主线程执行,子线程绑定的大漠对象,不保证完全释放。高级语言中则需要自己控制在适当的时候解除绑定.0 k. @$ Y! @8 o6 d8 N
Sub OnScriptExit()
8 D8 l/ A1 m Z4 W dm_ret = dm.UnBindWindow() Z* C0 j! v2 l7 N5 a
End Sub
6 P @ c& o2 L2 V另外 绑定dx会比较耗时间,请不要频繁调用此函数.
% D5 g6 Y7 p( J2 Y( n& G还有一点特别要注意的是,有些窗口绑定之后必须加一定的延时,否则后台也无效.一般1秒到2秒的延时就足够.7 }" `% `8 O& T8 X p
- F4 ]/ [* p0 p( U+ y
发现绑定失败的几种可能(一般是需要管理员权限的模式才有可能会失败)
( _" ?4 I/ Q/ I( v, p& ?1. 系统登录的帐号必须有Administrators权限 2. 一些防火墙会防止插件注入窗口所在进程,比如360防火墙等,必须把dm.dll设置为信任. 3. 还有一个比较弱智的可能性,那就是插件没有注册到系统中,这时CreateObject压根就是失败的. 检测对象是否创建成功很简单,如下代码 set dm = createobject("dm.dmsoft")! J4 X; b. c- z1 G1 ^
ver = dm.Ver()
& F8 g# g3 u2 U7 i# I1 ~If len(ver) = 0 Then
( ^7 b, P( c4 a2 G MessageBox "创建对象失败,检查系统是否禁用了vbs脚本权限"' |8 S: K3 b9 \2 ?+ i' m
EndScript" y: C) m! {1 |3 Q N
End If 4. 在沙盘中开的窗口,绑定一些需要管理员权限的模式,会失败。
: W/ g6 h; k1 X1 }4 J! F8 ?5 P8 ?解决方法是要配置沙盘参数,参考如何配置沙盘参数.$ v% X, G. X- R
) v1 ]/ `3 Q1 v' x 5. 窗口所在进程有保护,这个我也无能为力. : Q9 z4 U; r$ z( E
/ I$ {9 S( Q% U" r9 J/ c. }
|