|
BindWindowEx函数简介: 绑定指定的窗口,并指定这个窗口的屏幕颜色获取方式,鼠标仿真模式,键盘仿真模式 高级用户使用.
/ d7 `" t9 a# F, u: c! Z% @. f0 Z5 O函数原型:
) S7 k1 z: p$ Z! E/ O. U# |- P, E; C- P U: j x- N8 w+ K
long BindWindowEx(hwnd,display,mouse,keypad,public,mode)
/ d* I' J9 O; Y/ O& ]" \) Q( O `
. {/ t0 _! S3 j1 i6 z2 u
6 S9 Y" a6 T* u7 G1 R, p( Z) D
8 z1 Z' F. W- s3 n/ U- I4 b6 [$ B' @- D* G
易语言调用BindWindowEx命令见下图; p& t/ A7 R, g: d- \/ W6 L
6 B: J3 u- k+ g9 [; z K
) p5 S# Y1 h; r- c
8 o6 p, j5 M, v, o' S/ f: I' e1 L$ e3 p
2 k9 c# _0 O' n4 O5 e
/ x+ b6 @( {/ |+ O5 r
a/ O. K0 j u% ]9 u8 @
/ R9 u7 f( F$ s
参数定义:
7 b! \8 T$ O5 s/ o) S: M& q& @( [0 I
! M! D' G0 J- }7 s9 N1 a2 Hhwnd 整形数: 指定的窗口句柄! S' A, U0 G! @+ o: i3 q, H& O
: D0 }6 {0 l5 p
display 字符串: 屏幕颜色获取方式 取值有以下几种
5 z) @( L6 d* }+ D3 Q% \5 N
( x w& A7 F2 m/ r* ]0 h' z# v0 q"normal" : 正常模式,平常我们用的前台截屏模式" z- M) t' a7 [9 k8 Z; c
! p6 p) L% F2 j5 g"gdi" : gdi模式,用于窗口采用GDI方式刷新时. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
7 c1 a1 W2 C- g% k! O+ u"gdi2" : gdi2模式,此模式兼容性较强,但是速度比gdi模式要慢许多,如果gdi模式发现后台不刷新时,可以考虑用gdi2模式.
4 f K/ \) j8 S4 u; D X: d1 y
, v2 G4 ]- y7 h. y" e"dx2" : dx2模式,用于窗口采用dx模式刷新,如果dx方式会出现窗口进程崩溃的状况,可以考虑采用这种.采用这种方式要保证窗口有一部分在屏幕外.win7 win8或者vista不需要移动也可后台. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。 % c' b+ D4 F- \ F' y6 v. ^1 `
"dx3" : dx3模式,同dx2模式,但是如果发现有些窗口后台不刷新时,可以考虑用dx3模式,此模式比dx2模式慢许多. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。( z9 o/ x! T9 U
8 {( m$ R+ n, O7 X5 E8 m6 P( E1 ]dx模式,用于窗口采用dx模式刷新,取值可以是以下任意组合,组合采用"|"符号进行连接. 支持BindWindow中的缩写模式. 比如dx代表" dx.graphic.2d| dx.graphic.3d"
7 O" s9 ]2 Y! C* \6 ^6 U7 l- c1. "dx.graphic.2d" 2d窗口的dx图色模式
) s8 h2 _+ V$ J3 p+ D8 T9 @2. "dx.graphic.2d.2" 2d窗口的dx图色模式 是dx.graphic.2d的增强模式.兼容性更好.. t& O/ j$ G/ i
3. "dx.graphic.3d" 3d窗口的dx图色模式,
8 v& m. f r$ a8 t- Y4. "dx.graphic.3d.8" 3d窗口的dx8图色模式, 此模式对64位进程无效.8 J8 I. M# \0 }0 K4 f1 g2 [5 i2 o* C
5. "dx.graphic.opengl" 3d窗口的opengl图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.
L+ H! X' Z$ b) q1 _3 M6. "dx.graphic.opengl.esv2" 3d窗口的opengl_esv2图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.
9 K8 ~: F9 M/ a1 H& v7. "dx.graphic.3d.10plus" 3d窗口的dx10 dx11图色模式% H# ?6 \) U* C- Y( {! \. C
- p* h; [. t( ~; j# Xmouse 字符串: 鼠标仿真模式 取值有以下几种
) j; g0 }+ y2 m( j3 Q) |
' i5 y0 J: }- C8 X2 O% ]"normal" : 正常模式,平常我们用的前台鼠标模式8 R1 s4 p t0 G" ~" G( E
# f q9 l' U' E8 Y0 L4 K
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.; U# p- L) z* k2 p- E
"windows3": Windows3模式,采取模拟windows消息方式,可以支持有多个子窗口的窗口后台: Q! s* g2 x$ y1 H- B
dx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式,比如windows2代表"dx.mouse.position.lock.api|dx.mouse.position.lock.message|dx.mouse.state.message"
# q* M t# Z- K) Y6 ^7 ?8 x1. "dx.mouse.position.lock.api" 此模式表示通过封锁系统API,来锁定鼠标位置.2 e2 y- b( n( Q1 _# a
2. "dx.mouse.position.lock.message" 此模式表示通过封锁系统消息,来锁定鼠标位置.2 p3 y' @' u. f* n5 U7 e+ X; ?0 f
3. "dx.mouse.focus.input.api" 此模式表示通过封锁系统API来锁定鼠标输入焦点.3 d4 a! X Z( Z7 ]* ?1 s2 f
4. "dx.mouse.focus.input.message"此模式表示通过封锁系统消息来锁定鼠标输入焦点.
9 `4 T4 b: r+ t, i2 P3 O5. "dx.mouse.clip.lock.api" 此模式表示通过封锁系统API来锁定刷新区域。注意,使用这个模式,在绑定前,必须要让窗口完全显示出来.
5 d: b# {+ w1 Q3 c) P- A: U$ p6. "dx.mouse.input.lock.api" 此模式表示通过封锁系统API来锁定鼠标输入接口.4 C$ |4 t. o( L, d' d# H
7. "dx.mouse.state.api" 此模式表示通过封锁系统API来锁定鼠标输入状态.
) [9 y' e; a8 Z& E8. "dx.mouse.state.message" 此模式表示通过封锁系统消息来锁定鼠标输入状态.- i+ Z M" S) S0 q# i
9. "dx.mouse.api" 此模式表示通过封锁系统API来模拟dx鼠标输入.
5 K# \' Z& y1 L6 X6 R% z) @* A10. "dx.mouse.cursor" 开启此模式,可以后台获取鼠标特征码.
7 n6 j3 G: y0 j11. "dx.mouse.raw.input" 有些窗口需要这个才可以正常操作鼠标.
$ y, @- A4 g$ a# \! O6 ^12. "dx.mouse.input.lock.api2" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.2 B% [# Z# x' R' v4 e
13. "dx.mouse.input.lock.api3" 部分窗口在后台操作时,前台鼠标会移动,需要这个属性.
* \: k7 }$ J$ ~' Y* G+ P2 C0 Q- A* D% N+ d+ q4 z9 I1 p! m: d7 ?
keypad 字符串: 键盘仿真模式 取值有以下几种
% V" K* v& F6 [
/ a7 J _" P% t"normal" : 正常模式,平常我们用的前台键盘模式" Q. X: D- c4 _! G! [
+ t. f' t; z% C" M6 E; L: R% {
"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.- i! |1 i" u6 |- R2 O/ i1 X
$ g$ `: g5 X1 |2 Adx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式.比如dx代表" dx.public.active.api|dx.public.active.message| dx.keypad.state.api|dx.keypad.api|dx.keypad.input.lock.api"- R6 b! N9 I# `1 h
1. "dx.keypad.input.lock.api" 此模式表示通过封锁系统API来锁定键盘输入接口.
( X+ q: ?! k! v& i; i7 i+ |2. "dx.keypad.state.api" 此模式表示通过封锁系统API来锁定键盘输入状态.+ p. k5 L" H% t, C7 e3 E
3. "dx.keypad.api" 此模式表示通过封锁系统API来模拟dx键盘输入. & n2 H3 Q7 q, H9 w
4. "dx.keypad.raw.input" 有些窗口需要这个才可以正常操作键盘.$ Y# n$ J* b% l$ w# {$ L! i
0 U- }. k4 \, H, Dpublic 字符串: 公共属性 dx模式共有
) v' ?5 q6 R. p. X- Q8 k& |% j: B
; r- p" x4 ]" T% p5 R E$ d取值可以是以下任意组合. 组合采用"|"符号进行连接 这个值可以为空
; A# A5 w" C/ Q1. "dx.public.active.api" 此模式表示通过封锁系统API来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. 4 s$ S. r) I9 G; `# l
2. "dx.public.active.message" 此模式表示通过封锁系统消息来锁定窗口激活状态. 注意,部分窗口在此模式下会耗费大量资源慎用. 另外如果要让此模式生效,必须在绑定前,让绑定窗口处于激活状态,否则此模式将失效. 比如dm.SetWindowState hwnd,1 然后再绑定." y# G+ k7 Q) D4 t
3. "dx.public.disable.window.position" 此模式将锁定绑定窗口位置.不可与"dx.public.fake.window.min"共用.
2 P( `5 [( X0 f8 r4. "dx.public.disable.window.size" 此模式将锁定绑定窗口,禁止改变大小. 不可与"dx.public.fake.window.min"共用.; s2 u# A) K d8 M* B. U6 m1 v1 k
5. "dx.public.disable.window.minmax" 此模式将禁止窗口最大化和最小化,但是付出的代价是窗口同时也会被置顶. 不可与"dx.public.fake.window.min"共用.; e# {1 C4 D" E% }
6. "dx.public.fake.window.min" 此模式将允许目标窗口在最小化状态时,仍然能够像非最小化一样操作.. 另注意,此模式会导致任务栏顺序重排,所以如果是多开模式下,会看起来比较混乱,建议单开使用,多开不建议使用. 同时此模式不是万能的,有些情况下最小化以后图色会不刷新或者黑屏.- y7 j% s& W. z9 ^+ D* d
7. "dx.public.hide.dll" 此模式将会隐藏目标进程的大漠插件,避免被检测..另外使用此模式前,请仔细做过测试,此模式可能会造成目标进程不稳定,出现崩溃。
: m) r, t* W& R8. "dx.public.active.api2" 此模式表示通过封锁系统API来锁定窗口激活状态. 部分窗口遮挡无法后台,需要这个属性. # u3 x' Y7 ]" H+ s- R
9. "dx.public.input.ime" 此模式是配合SendStringIme使用. 具体可以查看SendStringIme接口. \' d% z% E! X/ P1 O, K- o% U
10 "dx.public.graphic.protect" 此模式可以保护dx图色不被恶意检测.同时对dx.keypad.api和dx.mouse.api也有保护效果.
6 f* x7 [3 M y1 N' J5 I11 "dx.public.disable.window.show" 禁止目标窗口显示,这个一般用来配合dx.public.fake.window.min来使用. ( l+ ]* q4 m- L, Q
12 "dx.public.anti.api" 此模式可以突破部分窗口对后台的保护.
( U; d# J; E4 h6 n1 z+ N9 I( S13 "dx.public.km.protect" 此模式可以保护dx键鼠不被恶意检测.最好配合dx.public.anti.api一起使用. 此属性可能会导致部分后台功能失效.
* a; u' J( p: D0 s- J) K' D14 "dx.public.prevent.block" 绑定模式1 3 5 7 101 103下,可能会导致部分窗口卡死. 这个属性可以避免卡死.
0 [1 v) r) B, r0 e2 H- P15 "dx.public.ori.proc" 此属性只能用在模式0 1 2 3和101下. 有些窗口在不同的界面下(比如登录界面和登录进以后的界面),键鼠的控制效果不相同. 那可以用这个属性来尝试让保持一致. 注意的是,这个属性不可以滥用,确保测试无问题才可以使用. 否则可能会导致后台失效. U, K" o3 @! u/ U! n
16 "dx.public.down.cpu" 此模式可以配合DownCpu来降低目标进程CPU占用. 当图色方式降低CPU无效时,可以尝试此种方式.7 @) x j! K* ^+ k# D- E+ B3 V
17 "dx.public.focus.message" 当后台绑定后,后台无法正常在焦点窗口输入文字时,可以尝试加入此属性. 此属性会强制键盘消息发送到焦点窗口. 慎用此模式,此模式有可能会导致后台键盘在某些情况下失灵.
; A) X# Z! |5 Q- H18 "dx.public.graphic.speed" 只针对图色中的dx模式有效.此模式会牺牲目标窗口的性能,来提高DX图色速度,尤其是目标窗口刷新很慢时,这个参数就很有用了.
6 Q+ e d( q9 {1 w w4 e6 k19 "dx.public.memory" 让本对象突破目标进程防护,可以正常使用内存接口. 当用此方式使用内存接口时,内存接口的速度会取决于目标窗口的刷新率.7 b8 M9 m% W2 u8 |% n
20 "dx.public.inject.super" 突破某些难以绑定的窗口. 此属性仅对除了模式0和2的其他模式有效.
# r$ @6 J9 V5 s2 C: |21 "dx.public.hack.speed" 类似变速齿轮,配合接口HackSpeed使用* A) V7 U1 U& i$ x
9 p6 b! l. k# X$ e- Gmode 整形数: 模式。取值有以下几种 0 : 推荐模式此模式比较通用,而且后台效果是最好的.: L) O$ [2 p7 g* Q, {7 Q$ @) b Z1 ?1 k
2 : 同模式0,如果模式0有崩溃问题,可以尝试此模式. 注意0和2模式,当主绑定(第一个绑定同个窗口的对象)绑定成功后,那么调用主绑定的线程必须一直维持,否则线程一旦推出,对应的绑定也会消失.6 ~4 b0 Y. ~3 U' f
101 : 超级绑定模式. 可隐藏目标进程中的dm.dll.避免被恶意检测.效果要比dx.public.hide.dll好. 推荐使用.
$ H! X+ b7 x/ k# V; [. X 103 : 同模式101,如果模式101有崩溃问题,可以尝试此模式. ( R# C( X2 r8 p% a- E- o
0 @( Z5 t( C6 H: Y, R 11 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统2 F3 l' |" a5 I% R# S- R
4 K: b0 @- w+ H; g$ o& k 13 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统
" d) {" y% A' f( S7 l1 S1 m6 J8 \需要注意的是: 模式101 103在大部分窗口下绑定都没问题。但也有少数特殊的窗口,比如有很多子窗口的窗口,对于这种窗口,在绑定时,一定要把鼠标指向一个可以输入文字的窗口,比如一个文本框,最好能激活这个文本框,这样可以保证绑定的成功.. A" |# l. G0 M& Z
返回值:; E; Q# P$ p/ V y) ?) ~( s0 j
整形数:
+ Q" L. f0 { r( g; u0: 失败. ?1 K. `. X7 R! Y5 Q: _' j
1: 成功% ?" z6 x: R. F j2 U$ `. h* r
. Y+ r' m, O! _$ v1 p* G! F7 ]
如果返回0,可以调用GetLastError来查看具体失败错误码,帮助分析问题.
# d( ^$ ?& s7 m4 m2 n& ` }示例:! v* L; I2 N2 F
1 \( _' _5 Y* A/ j# g& z" V8 O比如
4 i9 E$ W# l) Y) b5 |dm_ret = dm.BindWindowEx(hwnd,"normal","dx.mouse.position.lock.api|dx.mouse.position.lock.message","windows","dx.public.active.api",0)8 t4 u+ o# a& {- t
9 W5 V4 J/ {+ X& Z3 C4 Hdm_ret = dm.BindWindowEx(hwnd,"dx2","windows","normal","dx.public.active.api",0)
5 |- \ \, V0 z
% Q$ f. M- s h, y) [& C: xdm_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)
8 q( u, I9 r3 Z: e 1 w, O! g2 h( Y$ [
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","",0)
9 d3 h: v" c2 g8 ~5 ]# N; I0 r# T$ e8 O; K
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","dx.public.disable.window.size|dx.public.disable.window.minmax",0)
/ e# \) L) w8 G5 Z; [, i
4 Z* j2 W, n& f! tdm_ret = dm.BindWindowEx(hwnd,"dx2","windows3","windows","dx.mouse.position.lock.api",0)- K9 T8 t- ?5 m8 [8 q) [
等等.
- t" E6 u' h" Q- L+ b( @; Q5 O7 j; ?9 i' ]9 Y& P2 a- h4 Y' y
注意:
0 M$ ^4 m2 q! G' r* U
, s8 C: F2 E8 o/ U: C2 Z" Q绑定之后,所有的坐标都相对于窗口的客户区坐标(不包含窗口边框)7 h) o h" ] {3 g1 u$ N: I1 v
另外,绑定窗口后,必须加以下代码,以保证所有资源正常释放
' ~% y$ ]/ W/ e这个函数的意思是在脚本结束时,会调用这个函数。需要注意的是,目前的按键版本对于这个函数的执行不是线程级别的,也就是说,这个函数只会在主线程执行,子线程绑定的大漠对象,不保证完全释放。高级语言中则需要自己控制在适当的时候解除绑定.
1 U' p7 [/ \2 j! b: \( CSub OnScriptExit(); U' k; X+ E+ \( K9 ^
dm_ret = dm.UnBindWindow()
1 G+ Z" Y+ E$ S; {% aEnd Sub
6 ^$ U& y- ]2 c7 j$ Q* d. m另外 绑定dx会比较耗时间,请不要频繁调用此函数. ]% `: G8 H/ [
还有一点特别要注意的是,有些窗口绑定之后必须加一定的延时,否则后台也无效.一般1秒到2秒的延时就足够.1 h5 X3 f- q& O& \
( A6 t) _4 y6 {* ]8 T1 g# {发现绑定失败的几种可能(一般是需要管理员权限的模式才有可能会失败)
- X/ @; U. W1 k" ?) l" \1. 系统登录的帐号必须有Administrators权限 2. 一些防火墙会防止插件注入窗口所在进程,比如360防火墙等,必须把dm.dll设置为信任. 3. 还有一个比较弱智的可能性,那就是插件没有注册到系统中,这时CreateObject压根就是失败的. 检测对象是否创建成功很简单,如下代码 set dm = createobject("dm.dmsoft")% u5 ?! B- q' x+ b/ d
ver = dm.Ver()
( l, V5 H& u: ]( EIf len(ver) = 0 Then
' C" o5 [8 ]6 N) a4 p3 s MessageBox "创建对象失败,检查系统是否禁用了vbs脚本权限"
5 ~' o. |" C3 _: s5 e8 x EndScript
* a. i; _. s7 q: m8 r2 U3 bEnd If 4. 在沙盘中开的窗口,绑定一些需要管理员权限的模式,会失败。( j) W, O" E6 _9 \; A/ b
解决方法是要配置沙盘参数,参考如何配置沙盘参数.
( E& l" [. i) f( O
+ k. G: o! w3 }2 o: J: ?& @ ~ 5. 窗口所在进程有保护,这个我也无能为力. , R' l8 u! G! j: N3 }8 t
+ Q, _0 P t! U. W* U/ n& ^
|