BindWindowEx函数简介: 绑定指定的窗口,并指定这个窗口的屏幕颜色获取方式,鼠标仿真模式,键盘仿真模式 高级用户使用.! _& K2 Z" G q# C. N
函数原型:4 U# A+ Y' r% Q$ c( B: [( X
9 x- o3 W$ r2 G1 m1 b& Y& plong BindWindowEx(hwnd,display,mouse,keypad,public,mode)
Q8 y: ?8 [/ R. u% x
! G4 d+ k. f7 w* V5 K& |
5 D) c B9 s: _$ U8 }
0 s" ]# u( x* a, F! f8 q( `) [# x+ h
易语言调用BindWindowEx命令见下图
' ]$ g5 U6 p2 N7 Q7 i9 \
; Z& r% U$ L+ b: A* {
1 c. V3 |1 H4 |# [( y2 M( O" S! j; a5 w( W9 L
; I6 _$ T3 S/ V R
; x/ y/ l" H( ]. F3 T
. q: U) T6 j5 T; ]6 {# c! x/ Y, N+ _9 _6 F( j! A
p4 V v P/ ]& d3 c
参数定义:
, S9 m. I) Z' i0 Z# S4 @( K6 W! r. o7 d" i0 V
hwnd 整形数: 指定的窗口句柄- D0 B g/ `- I+ E2 D2 _& M5 M
: L8 C+ S3 G& }6 g& D& k1 _
display 字符串: 屏幕颜色获取方式 取值有以下几种
2 x' q5 r% t6 a# @- _
% v8 y2 {+ G, S8 k"normal" : 正常模式,平常我们用的前台截屏模式- b$ U8 c" u+ T7 { e; J
. r' B$ v. k6 D/ H" I
"gdi" : gdi模式,用于窗口采用GDI方式刷新时. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。 # {3 V6 U2 L) S8 Z
"gdi2" : gdi2模式,此模式兼容性较强,但是速度比gdi模式要慢许多,如果gdi模式发现后台不刷新时,可以考虑用gdi2模式.
4 H; h0 [% @# O: [# L! ~
6 Z1 T3 `; \' U! Z"dx2" : dx2模式,用于窗口采用dx模式刷新,如果dx方式会出现窗口进程崩溃的状况,可以考虑采用这种.采用这种方式要保证窗口有一部分在屏幕外.win7 win8或者vista不需要移动也可后台. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。 ) ^8 V7 h+ @; v9 J4 e c) K
"dx3" : dx3模式,同dx2模式,但是如果发现有些窗口后台不刷新时,可以考虑用dx3模式,此模式比dx2模式慢许多. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
; A; g @9 E/ ^! h4 q* J& S
7 @" y' m* R9 v7 pdx模式,用于窗口采用dx模式刷新,取值可以是以下任意组合,组合采用"|"符号进行连接. 支持BindWindow中的缩写模式. 比如dx代表" dx.graphic.2d| dx.graphic.3d"1 L& u W1 Q* p& J% m2 x
1. "dx.graphic.2d" 2d窗口的dx图色模式
# s9 P# W! Z% ~% M; n. L2. "dx.graphic.2d.2" 2d窗口的dx图色模式 是dx.graphic.2d的增强模式.兼容性更好., t# N, Y2 j+ Y& r$ w: X
3. "dx.graphic.3d" 3d窗口的dx图色模式,
; E* R& a9 K, x9 x8 d3 W9 ~# N4. "dx.graphic.3d.8" 3d窗口的dx8图色模式, 此模式对64位进程无效.
, N. `( u- @! w" z; D4 c2 R" ~5. "dx.graphic.opengl" 3d窗口的opengl图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.
7 {& S% x, q: k2 z7 b3 Y* l7 A6. "dx.graphic.opengl.esv2" 3d窗口的opengl_esv2图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢. S2 B R8 @2 f% U+ [% `/ N4 g
7. "dx.graphic.3d.10plus" 3d窗口的dx10 dx11图色模式
3 ]: |% K) ? Z+ O$ `% `6 I0 N1 ]! b9 H' g# m5 y0 b" z7 R
mouse 字符串: 鼠标仿真模式 取值有以下几种4 k' p. p& `6 I! i
1 @4 z- a7 x8 R a. M
"normal" : 正常模式,平常我们用的前台鼠标模式
+ W0 p3 o. l7 q. P- z1 [
; }9 B$ f( Q* J"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.
& u. i7 q) V: Q3 z& U! g9 O"windows3": Windows3模式,采取模拟windows消息方式,可以支持有多个子窗口的窗口后台
, l$ p4 Z$ I# c# o6 gdx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式,比如windows2代表"dx.mouse.position.lock.api|dx.mouse.position.lock.message|dx.mouse.state.message"" j! d! Q& G) o, z" t
1. "dx.mouse.position.lock.api" 此模式表示通过封锁系统API,来锁定鼠标位置.
' N4 x& A3 o' D2. "dx.mouse.position.lock.message" 此模式表示通过封锁系统消息,来锁定鼠标位置.
2 F! |- z8 q( X: \5 s; o3. "dx.mouse.focus.input.api" 此模式表示通过封锁系统API来锁定鼠标输入焦点.5 K. N- g- v9 M. ~
4. "dx.mouse.focus.input.message"此模式表示通过封锁系统消息来锁定鼠标输入焦点.% q U6 @) T! Q0 ~$ V- f
5. "dx.mouse.clip.lock.api" 此模式表示通过封锁系统API来锁定刷新区域。注意,使用这个模式,在绑定前,必须要让窗口完全显示出来.( g; C6 L/ w) z% p& k
6. "dx.mouse.input.lock.api" 此模式表示通过封锁系统API来锁定鼠标输入接口.
: M( F& _/ a3 ]) P7. "dx.mouse.state.api" 此模式表示通过封锁系统API来锁定鼠标输入状态.) `& w4 \' p6 w- a5 y
8. "dx.mouse.state.message" 此模式表示通过封锁系统消息来锁定鼠标输入状态." l. K5 y2 o* Y7 M
9. "dx.mouse.api" 此模式表示通过封锁系统API来模拟dx鼠标输入.
( _0 s3 E% E) o) ]& [6 Z i* n5 r10. "dx.mouse.cursor" 开启此模式,可以后台获取鼠标特征码.
5 A% T. `' j* j: d/ c" u11. "dx.mouse.raw.input" 有些窗口需要这个才可以正常操作鼠标.
$ h G) S9 K; _8 k12. "dx.mouse.input.lock.api2" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.: l5 b' A# f; {& Q2 V- K/ n' S5 F
13. "dx.mouse.input.lock.api3" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性. : c8 R5 n% e+ R% J& L, z R
8 P1 T7 M3 p# e& m# }& ]- Qkeypad 字符串: 键盘仿真模式 取值有以下几种: R! k3 Y" d/ C4 G7 r9 Y
/ R# d# \; h7 p+ m- q# l F) V
"normal" : 正常模式,平常我们用的前台键盘模式
& p; W$ [8 g: j- w9 N* D9 _$ c4 W, H/ I& n/ `& L
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.
' o4 X4 m# V; O
* o8 F, P$ \: gdx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式.比如dx代表" dx.public.active.api|dx.public.active.message| dx.keypad.state.api|dx.keypad.api|dx.keypad.input.lock.api"
% ~) w5 k& N' q1. "dx.keypad.input.lock.api" 此模式表示通过封锁系统API来锁定键盘输入接口.9 a! o8 S) V# u) p% M3 w! u( k
2. "dx.keypad.state.api" 此模式表示通过封锁系统API来锁定键盘输入状态.7 `) g( C6 V O
3. "dx.keypad.api" 此模式表示通过封锁系统API来模拟dx键盘输入. 8 c0 l$ O$ @9 x* {1 O8 R; U) b
4. "dx.keypad.raw.input" 有些窗口需要这个才可以正常操作键盘.9 `8 A3 { Q5 e7 p
" M6 [2 s; U# ]! v2 bpublic 字符串: 公共属性 dx模式共有
' Q( G& V7 @$ K" F, x
1 i7 X3 O. A) ?& S$ {/ }取值可以是以下任意组合. 组合采用"|"符号进行连接 这个值可以为空
" ^/ I* C- h6 g; j4 q* X# `1. "dx.public.active.api" 此模式表示通过封锁系统API来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. " u4 d" K6 [4 _5 {, G# A
2. "dx.public.active.message" 此模式表示通过封锁系统消息来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. 另外如果要让此模式生效,必须在绑定前,让绑定窗口处于激活状态,否则此模式将失效. 比如dm.SetWindowState hwnd,1 然后再绑定.
* M9 @% E- C8 E) j+ u3. "dx.public.disable.window.position" 此模式将锁定绑定窗口位置.不可与"dx.public.fake.window.min"共用.
) O- w: B1 z+ r+ j# j1 @4. "dx.public.disable.window.size" 此模式将锁定绑定窗口,禁止改变大小. 不可与"dx.public.fake.window.min"共用.
9 F7 c f3 u% o: U9 M: o& o; o5. "dx.public.disable.window.minmax" 此模式将禁止窗口最大化和最小化,但是付出的代价是窗口同时也会被置顶. 不可与"dx.public.fake.window.min"共用.
9 X: ~/ v$ E2 c' I1 N& u9 G6. "dx.public.fake.window.min" 此模式将允许目标窗口在最小化状态时,仍然能够像非最小化一样操作.. 另注意,此模式会导致任务栏顺序重排,所以如果是多开模式下,会看起来比较混乱,建议单开使用,多开不建议使用. 同时此模式不是万能的,有些情况下最小化以后图色会不刷新或者黑屏.9 N" p4 V' }6 F% y
7. "dx.public.hide.dll" 此模式将会隐藏目标进程的大漠插件,避免被检测..另外使用此模式前,请仔细做过测试,此模式可能会造成目标进程不稳定,出现崩溃。
# \0 ~! T0 \! N, J5 L8. "dx.public.active.api2" 此模式表示通过封锁系统API来锁定窗口激活状态. 部分窗口遮挡无法后台,需要这个属性.
) M- K; a& g/ j @9. "dx.public.input.ime" 此模式是配合SendStringIme使用. 具体可以查看SendStringIme接口.# |( c Y4 h% Q* ~1 W; L2 m
10 "dx.public.graphic.protect" 此模式可以保护dx图色不被恶意检测.同时对dx.keypad.api和dx.mouse.api也有保护效果.
0 M+ U( s* T5 q7 _11 "dx.public.disable.window.show" 禁止目标窗口显示,这个一般用来配合dx.public.fake.window.min来使用.
z7 W# }' t' C/ D" S, w12 "dx.public.anti.api" 此模式可以突破部分窗口对后台的保护.; b% K$ M! L( h9 A
13 "dx.public.km.protect" 此模式可以保护dx键鼠不被恶意检测.最好配合dx.public.anti.api一起使用. 此属性可能会导致部分后台功能失效.7 \4 H* _; _ C7 y. Z1 W0 b
14 "dx.public.prevent.block" 绑定模式1 3 5 7 101 103下,可能会导致部分窗口卡死. 这个属性可以避免卡死.$ S" ^9 J: R; g, b: f& K/ v7 h
15 "dx.public.ori.proc" 此属性只能用在模式0 1 2 3和101下. 有些窗口在不同的界面下(比如登录界面和登录进以后的界面),键鼠的控制效果不相同. 那可以用这个属性来尝试让保持一致. 注意的是,这个属性不可以滥用,确保测试无问题才可以使用. 否则可能会导致后台失效.
$ t! a4 S3 }2 W/ C16 "dx.public.down.cpu" 此模式可以配合DownCpu来降低目标进程CPU占用. 当图色方式降低CPU无效时,可以尝试此种方式.2 ?( H7 s- F" n
17 "dx.public.focus.message" 当后台绑定后,后台无法正常在焦点窗口输入文字时,可以尝试加入此属性. 此属性会强制键盘消息发送到焦点窗口. 慎用此模式,此模式有可能会导致后台键盘在某些情况下失灵.
& s4 {* ?, W/ G$ `7 e6 b18 "dx.public.graphic.speed" 只针对图色中的dx模式有效.此模式会牺牲目标窗口的性能,来提高DX图色速度,尤其是目标窗口刷新很慢时,这个参数就很有用了.7 O0 m6 w9 n- i5 L
19 "dx.public.memory" 让本对象突破目标进程防护,可以正常使用内存接口. 当用此方式使用内存接口时,内存接口的速度会取决于目标窗口的刷新率.7 K" R T% S2 e& C! U2 y& z
20 "dx.public.inject.super" 突破某些难以绑定的窗口. 此属性仅对除了模式0和2的其他模式有效.
* C6 z8 b8 C3 q$ t' o9 B21 "dx.public.hack.speed" 类似变速齿轮,配合接口HackSpeed使用' T7 P$ Q* C0 Q8 t
- V- G( g( W+ i3 G" V* I
mode 整形数: 模式。取值有以下几种 0 : 推荐模式此模式比较通用,而且后台效果是最好的.
9 [& |" z% N2 x! Y* m4 A 2 : 同模式0,如果模式0有崩溃问题,可以尝试此模式. 注意0和2模式,当主绑定(第一个绑定同个窗口的对象)绑定成功后,那么调用主绑定的线程必须一直维持,否则线程一旦推出,对应的绑定也会消失.
+ ?3 A( m0 T( Y, m0 P+ [ 101 : 超级绑定模式. 可隐藏目标进程中的dm.dll.避免被恶意检测.效果要比dx.public.hide.dll好. 推荐使用.
5 D. H9 m7 c) J7 i E 103 : 同模式101,如果模式101有崩溃问题,可以尝试此模式. 0 \0 k5 {8 l2 g
* l# n( z9 c) w3 ?+ f) w c
11 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统! R; ]* \: K* ]9 a4 u
% ^+ o/ k7 L% N) Q 13 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统
7 O- ~0 i# D* m/ Q需要注意的是: 模式101 103在大部分窗口下绑定都没问题。但也有少数特殊的窗口,比如有很多子窗口的窗口,对于这种窗口,在绑定时,一定要把鼠标指向一个可以输入文字的窗口,比如一个文本框,最好能激活这个文本框,这样可以保证绑定的成功.
! r- c7 m- R& {% E3 x% e, _返回值:
# P2 }& N2 _' {4 N5 m整形数:
& J5 T0 R6 }. t# G7 F( Z0: 失败! V$ Q" b. D+ ^: x. Q
1: 成功; i7 h- C3 P7 U3 f
/ D8 K" {9 ^2 {* S: m如果返回0,可以调用GetLastError来查看具体失败错误码,帮助分析问题.; o4 a( X3 |4 V7 m) r
示例:
. E) n1 z/ P2 R( Q3 w I) {, k
; M+ x# f' V/ q, n4 N2 |比如
4 J8 i' u7 m! \( ^8 X3 cdm_ret = dm.BindWindowEx(hwnd,"normal","dx.mouse.position.lock.api|dx.mouse.position.lock.message","windows","dx.public.active.api",0)
( M6 q+ c: u; `) `% ~
8 m- D2 X3 w( _! P9 L* Udm_ret = dm.BindWindowEx(hwnd,"dx2","windows","normal","dx.public.active.api",0)
9 ~+ ~6 y# q5 o+ e, c! ~8 _ 6 M2 e& v; A, L' W, y( l
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)6 g9 [& N' h- r8 `: U o
2 l- B/ @6 w, j$ |9 ]dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","",0)
" o) w4 ?& ?* D& A7 X' L! C+ z1 }4 y
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","dx.public.disable.window.size|dx.public.disable.window.minmax",0)) C" ~$ @3 Q [6 S
& W& ^6 E$ {( m; _. f2 Z
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows3","windows","dx.mouse.position.lock.api",0)( ^6 b( t6 X4 r4 O1 G9 r
等等.2 ]+ K) A* J+ P; w$ b
1 R4 {' F5 t, B3 [* M N
注意:0 S$ _0 Q J1 g8 @# `; {
, D! _5 Y5 l! C/ m
绑定之后,所有的坐标都相对于窗口的客户区坐标(不包含窗口边框)0 M; Q# e# _2 L" m2 |& j
另外,绑定窗口后,必须加以下代码,以保证所有资源正常释放
3 t! o6 d+ H6 U9 x这个函数的意思是在脚本结束时,会调用这个函数。需要注意的是,目前的按键版本对于这个函数的执行不是线程级别的,也就是说,这个函数只会在主线程执行,子线程绑定的大漠对象,不保证完全释放。高级语言中则需要自己控制在适当的时候解除绑定.' X$ N; s% _9 X8 ]
Sub OnScriptExit()
6 [2 b+ Y5 s; Q- u! q7 a. {; w6 ~! `) _ dm_ret = dm.UnBindWindow()
1 O) H; Z ^- l( u# M K9 ?# iEnd Sub+ H; E7 Q3 W6 O) O8 \
另外 绑定dx会比较耗时间,请不要频繁调用此函数.' |1 }% |0 t/ z( o- E* i
还有一点特别要注意的是,有些窗口绑定之后必须加一定的延时,否则后台也无效.一般1秒到2秒的延时就足够. E W$ g: L, @" y8 m8 X* Z
/ H! X% }# l3 _, b2 m
发现绑定失败的几种可能(一般是需要管理员权限的模式才有可能会失败)/ ?) l" }5 q' |4 Y% Z' Z, \
1. 系统登录的帐号必须有Administrators权限 2. 一些防火墙会防止插件注入窗口所在进程,比如360防火墙等,必须把dm.dll设置为信任. 3. 还有一个比较弱智的可能性,那就是插件没有注册到系统中,这时CreateObject压根就是失败的. 检测对象是否创建成功很简单,如下代码 set dm = createobject("dm.dmsoft")0 {3 S3 I+ j- L7 O0 }6 D
ver = dm.Ver()/ E& G: x5 f. _ w5 P' {
If len(ver) = 0 Then
L. |: c4 X0 {2 |$ \ MessageBox "创建对象失败,检查系统是否禁用了vbs脚本权限"3 w8 Z2 P3 n3 Z5 Y5 D5 U
EndScript! |, l; y( m7 e% L" H
End If 4. 在沙盘中开的窗口,绑定一些需要管理员权限的模式,会失败。* R( b2 }# }& @2 ?2 P- \
解决方法是要配置沙盘参数,参考如何配置沙盘参数.
5 ]* \! z8 Y/ w
& y! P0 Z# _+ q6 d! I) }4 G& b 5. 窗口所在进程有保护,这个我也无能为力. * k4 ]8 U( I- \( X
t; X+ w% P9 U5 ]- \; X* r |