易语言吧

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 20893|回复: 1

[大漠命令] 易语言大漠插件BindWindowEx绑定窗口的用法详解

[复制链接]

523

主题

832

帖子

4万

积分

易语言吧管理员

Rank: 9Rank: 9Rank: 9

积分
42096

幽默大师终生成就

威望
0
易币
40869
贡献
0
积分
42096
UID
1
在线时间
1503 小时
注册时间
2019-7-19
发表于 2019-12-21 07:02:15 | 显示全部楼层 |阅读模式
BindWindowEx函数简介:
绑定指定的窗口,并指定这个窗口的屏幕颜色获取方式,鼠标仿真模式,键盘仿真模式 高级用户使用.
5 Z) p/ X, L8 z  |; r函数原型:0 U% R" t* A. f# L
" s$ k. p/ l# K. p* N1 Q) }7 }- l! y
long BindWindowEx(hwnd,display,mouse,keypad,public,mode)
; w9 }3 L- `$ n" V- t
+ v9 E; F( O1 c1 @

8 j( e: A# [& r& s
" b* \1 @# X$ Z, c0 s/ k

% C" S3 S+ Z7 l; U易语言调用BindWindowEx命令见下图  a' V& z: p- w/ j

- [! `7 W0 D" u0 i* t* I 截图201912210702044855..png 1 d0 _% y( W9 T3 q; H
  n0 o# E8 p  }; @6 k) [

5 ?7 F* |, g# a0 R7 l# s  F6 f) N
& y/ h( u$ M' Q; e3 I! y
+ M- l$ z; e: G# J' D. j& K6 }

* Q5 u8 W! Q' z9 U
2 w8 [# R( Q. K, X
参数定义:
# y1 d4 `/ A. J5 q
+ E- E0 I6 P- \( m2 I1 f$ {$ rhwnd
整形数: 指定的窗口句柄
" v9 Q7 j8 l' @+ z
* e  V6 T8 r  x8 t/ j0 J' S- kdisplay 字符串: 屏幕颜色获取方式 取值有以下几种" f# G- c: G- D+ J: j% X
$ I1 q# @' B( g- \/ o  h0 V
"normal" : 正常模式,平常我们用的前台截屏模式9 N1 R" m  Y# K, x4 V

9 R9 H4 D3 m8 B3 a"gdi" : gdi模式,用于窗口采用GDI方式刷新时. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。  
6 V- V2 _  C$ }7 `  _3 e
"gdi2" : gdi2模式,此模式兼容性较强,但是速度比gdi模式要慢许多,如果gdi模式发现后台不刷新时,可以考虑用gdi2模式.0 j% d+ ?) P2 V) X

3 w! O4 [4 \4 I* {) B7 r+ ?! e"dx2" : dx2模式,用于窗口采用dx模式刷新,如果dx方式会出现窗口进程崩溃的状况,可以考虑采用这种.采用这种方式要保证窗口有一部分在屏幕外.win7 win8或者vista不需要移动也可后台. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。
/ \2 B3 Z2 v) s" o& {0 x. e
"dx3" : dx3模式,同dx2模式,但是如果发现有些窗口后台不刷新时,可以考虑用dx3模式,此模式比dx2模式慢许多. 此模式占用CPU较大. 参考SetAero. win10以上系统使用此模式,如果截图失败,尝试把目标程序重新开启再试试。1 N4 F+ u/ v& l( p# a8 ~: r) @' N
) d$ ^2 |5 R+ r4 ], u0 D* M# M
dx模式,用于窗口采用dx模式刷新,取值可以是以下任意组合,组合采用"|"符号进行连接. 支持BindWindow中的缩写模式. 比如dx代表" dx.graphic.2d| dx.graphic.3d". N- Y+ _/ B  N
1. "dx.graphic.2d"  2d窗口的dx图色模式  
* w6 U# E: r) W2. "dx.graphic.2d.2"  2d窗口的dx图色模式  是dx.graphic.2d的增强模式.兼容性更好.' _* ~7 E/ U7 c' J  M5 u- m& B
3. "dx.graphic.3d"  3d窗口的dx图色模式, 0 Z0 C5 K6 V; K4 {) y; }: l5 B8 E
4. "dx.graphic.3d.8"  3d窗口的dx8图色模式,  此模式对64位进程无效.
1 s5 y9 Q$ o( |5. "dx.graphic.opengl"  3d窗口的opengl图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢. ; E3 r$ R* c' H
6. "dx.graphic.opengl.esv2"  3d窗口的opengl_esv2图色模式,极少数窗口采用opengl引擎刷新. 此图色模式速度可能较慢.1 ]0 r. U  S4 d: u# N; }
7. "dx.graphic.3d.10plus"  3d窗口的dx10 dx11图色模式

* j% L& u; `9 c
! M- f3 |4 Q# ~! ?/ ~' y4 e( t& D" ymouse
字符串: 鼠标仿真模式 取值有以下几种
/ B: p: ]# n% y! s

) x+ Z2 c* Q6 B; J! R' y1 M$ _& ^"normal" :
正常模式,平常我们用的前台鼠标模式" X/ l0 b7 Q" A2 b% v. B. w/ [6 g

8 y4 j- L* A5 v# r- Q; D+ v"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.

- n7 V) g, {' B9 V3 O$ u/ ]" H"windows3": Windows3模式,采取模拟windows消息方式,可以支持有多个子窗口的窗口后台8 }: `% J3 M& E
dx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式,比如windows2代表"dx.mouse.position.lock.api|dx.mouse.position.lock.message|dx.mouse.state.message"3 [. j: d: A; S, _
1. "dx.mouse.position.lock.api"  此模式表示通过封锁系统API,来锁定鼠标位置.) G' x3 K9 R2 g
2. "dx.mouse.position.lock.message" 此模式表示通过封锁系统消息,来锁定鼠标位置.
6 V) x, v6 v' `, b* L7 N9 [; v  h" g3. "dx.mouse.focus.input.api" 此模式表示通过封锁系统API来锁定鼠标输入焦点.! S% q" {: v& A3 n
4. "dx.mouse.focus.input.message"此模式表示通过封锁系统消息来锁定鼠标输入焦点.
$ r) [1 _4 ~9 g% l; f5. "dx.mouse.clip.lock.api" 此模式表示通过封锁系统API来锁定刷新区域。注意,使用这个模式,在绑定前,必须要让窗口完全显示出来.$ p( p+ N% k, |* @
6. "dx.mouse.input.lock.api" 此模式表示通过封锁系统API来锁定鼠标输入接口.1 w, \! o) E, [
7. "dx.mouse.state.api" 此模式表示通过封锁系统API来锁定鼠标输入状态.( C/ V  y; K' `
8. "dx.mouse.state.message" 此模式表示通过封锁系统消息来锁定鼠标输入状态.
% b' Q; c& G& N9. "dx.mouse.api"  此模式表示通过封锁系统API来模拟dx鼠标输入.' \% U3 L; c6 f
10. "dx.mouse.cursor"  开启此模式,可以后台获取鼠标特征码. : B' a; E6 Q9 J  j% A6 Z9 m3 i
11. "dx.mouse.raw.input"  有些窗口需要这个才可以正常操作鼠标. 8 J4 d* b( T( S  j0 p, {4 L
12. "dx.mouse.input.lock.api2"  部分窗口在后台操作时,前台鼠标会移动,需要这个属性.
, q$ e4 s: r7 M6 [6 t, I! t" L13. "dx.mouse.input.lock.api3"  部分窗口在后台操作时,前台鼠标会移动,需要这个属性.
' _/ W! O2 R( x6 N8 C! I% V6 G
% Y+ e$ p/ f# [
keypad
字符串: 键盘仿真模式 取值有以下几种" D3 K* l6 h7 P8 L  _* J  N% P
, ~4 R, Q! W0 @& ?. L4 x4 n/ V' |
"normal" :
正常模式,平常我们用的前台键盘模式0 b, B3 {6 K9 r; u: n" `% h) j" |

. E6 {6 Y, G3 y5 ~4 l% y% F"windows": Windows模式,采取模拟windows消息方式 同按键的后台插件.' ], R! m2 M: I( j
+ I, O* w( Z, \
dx模式,取值可以是以下任意组合. 组合采用"|"符号进行连接. 支持BindWindow中的缩写模式.比如dx代表" dx.public.active.api|dx.public.active.message|
dx.keypad.state.api|dx.keypad.api|dx.keypad.input.lock.api"# [9 P2 W2 s# N1 S# ]
1. "dx.keypad.input.lock.api"
此模式表示通过封锁系统API来锁定键盘输入接口.
' N0 P) Y, `( v9 w8 |# d2. "dx.keypad.state.api" 此模式表示通过封锁系统API来锁定键盘输入状态.
  h( ~( K1 f+ O2 j# a3. "dx.keypad.api" 此模式表示通过封锁系统API来模拟dx键盘输入.
9 J0 Y6 Q. b2 L. m) k1 H2 R8 e. ^4. "dx.keypad.raw.input"  有些窗口需要这个才可以正常操作键盘.

( _6 s9 B3 i+ a; I7 h( j, I& [) B ) L* m0 l/ m! Z0 G4 O
public 字符串: 公共属性 dx模式共有 8 K- I* p' h+ S( t+ \
* _6 G5 ~8 V0 x1 H) H+ a$ q
取值可以是以下任意组合. 组合采用"|"符号进行连接 这个值可以为空
) a, Z" ^/ }7 q6 M- E1. "dx.public.active.api" 此模式表示通过封锁系统API来锁定窗口激活状态.  注意,部分窗口在此模式下会耗费大量资源慎用.
2 @6 f/ c0 g9 W/ j+ {2. "dx.public.active.message" 此模式表示通过封锁系统消息来锁定窗口激活状态.  注意,部分窗口在此模式下会耗费大量资源慎用. 另外如果要让此模式生效,必须在绑定前,让绑定窗口处于激活状态,否则此模式将失效. 比如dm.SetWindowState hwnd,1 然后再绑定./ i5 b. h* L4 ^& m, |' c' A! k
3.  "dx.public.disable.window.position" 此模式将锁定绑定窗口位置.不可与"dx.public.fake.window.min"共用." x% N! e2 x2 l0 k. x# P$ w
4.  "dx.public.disable.window.size" 此模式将锁定绑定窗口,禁止改变大小. 不可与"dx.public.fake.window.min"共用.
' l& ]6 L2 _- k# `5.  "dx.public.disable.window.minmax" 此模式将禁止窗口最大化和最小化,但是付出的代价是窗口同时也会被置顶. 不可与"dx.public.fake.window.min"共用.
! @  X$ s3 f: f/ m6.  "dx.public.fake.window.min" 此模式将允许目标窗口在最小化状态时,仍然能够像非最小化一样操作.. 另注意,此模式会导致任务栏顺序重排,所以如果是多开模式下,会看起来比较混乱,建议单开使用,多开不建议使用. 同时此模式不是万能的,有些情况下最小化以后图色会不刷新或者黑屏." z8 _! u1 x9 w5 C- S' ]* J5 Y
7.  "dx.public.hide.dll" 此模式将会隐藏目标进程的大漠插件,避免被检测..另外使用此模式前,请仔细做过测试,此模式可能会造成目标进程不稳定,出现崩溃。8 Y' a" N) e+ y" i* N
8.  "dx.public.active.api2" 此模式表示通过封锁系统API来锁定窗口激活状态. 部分窗口遮挡无法后台,需要这个属性. 5 d5 x6 C! ~# C; W/ D
9.  "dx.public.input.ime" 此模式是配合SendStringIme使用. 具体可以查看SendStringIme接口.  c. m" o% c4 c) i" H" f$ z! C9 O
10  "dx.public.graphic.protect" 此模式可以保护dx图色不被恶意检测.同时对dx.keypad.api和dx.mouse.api也有保护效果.1 J6 R! `7 X/ E$ G- O- G! ?
11  "dx.public.disable.window.show" 禁止目标窗口显示,这个一般用来配合dx.public.fake.window.min来使用. 8 t  X8 j7 X9 `! {0 _
12  "dx.public.anti.api" 此模式可以突破部分窗口对后台的保护.
5 e/ `# t2 s( s! f- G) j1 N1 L9 v6 e13  "dx.public.km.protect" 此模式可以保护dx键鼠不被恶意检测.最好配合dx.public.anti.api一起使用. 此属性可能会导致部分后台功能失效.3 B$ Y4 @/ }( M& o
14   "dx.public.prevent.block"  绑定模式1 3 5 7 101 103下,可能会导致部分窗口卡死. 这个属性可以避免卡死.
! g* F  R% U8 z. O2 I" K15   "dx.public.ori.proc"  此属性只能用在模式0 1 2 3和101下. 有些窗口在不同的界面下(比如登录界面和登录进以后的界面),键鼠的控制效果不相同. 那可以用这个属性来尝试让保持一致. 注意的是,这个属性不可以滥用,确保测试无问题才可以使用. 否则可能会导致后台失效.
8 T! J" G! L0 x7 h4 L+ E$ E% ]  H16  "dx.public.down.cpu" 此模式可以配合DownCpu来降低目标进程CPU占用.  当图色方式降低CPU无效时,可以尝试此种方式.& L0 Y4 R3 R: E/ B' ]" ~
17  "dx.public.focus.message" 当后台绑定后,后台无法正常在焦点窗口输入文字时,可以尝试加入此属性. 此属性会强制键盘消息发送到焦点窗口. 慎用此模式,此模式有可能会导致后台键盘在某些情况下失灵.
* n. z3 e9 r( W0 }2 s- e: v18  "dx.public.graphic.speed" 只针对图色中的dx模式有效.此模式会牺牲目标窗口的性能,来提高DX图色速度,尤其是目标窗口刷新很慢时,这个参数就很有用了.
5 z8 f3 W$ W* o5 x19  "dx.public.memory" 让本对象突破目标进程防护,可以正常使用内存接口. 当用此方式使用内存接口时,内存接口的速度会取决于目标窗口的刷新率.
: r$ p  t/ a# f+ ^20  "dx.public.inject.super" 突破某些难以绑定的窗口. 此属性仅对除了模式0和2的其他模式有效.' x7 ]0 k: m, R0 x  L* Y: f: z
21  "dx.public.hack.speed" 类似变速齿轮,配合接口HackSpeed使用

" e$ {' W# A. f1 Q# F8 Y ' E* `" z% B% S
mode 整形数: 模式。取值有以下几种
     0 : 推荐模式此模式比较通用,而且后台效果是最好的.+ b0 o; h# T% X% K2 ?
     2 : 同模式0,如果模式0有崩溃问题,可以尝试此模式.  注意0和2模式,当主绑定(第一个绑定同个窗口的对象)绑定成功后,那么调用主绑定的线程必须一直维持,否则线程一旦推出,对应的绑定也会消失.* H7 |7 P1 Z/ ?4 u# T! o8 t
     101 : 超级绑定模式. 可隐藏目标进程中的dm.dll.避免被恶意检测.效果要比dx.public.hide.dll好. 推荐使用.$ d1 Y' J# W* T. H' S! |
     103 : 同模式101,如果模式101有崩溃问题,可以尝试此模式.
  I6 d3 V6 B# A! g2 j  o
) W$ J  k* Z' ~# h! s, w  a" [4 Y     11 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统
; N+ F' ~/ X$ v4 B
+ u" P# T; p8 A) e+ x' l     13 : 需要加载驱动,适合一些特殊的窗口,如果前面的无法绑定,可以尝试此模式. 此模式不支持32位系统

% q' f6 N/ r- x需要注意的是: 模式101 103在大部分窗口下绑定都没问题。但也有少数特殊的窗口,比如有很多子窗口的窗口,对于这种窗口,在绑定时,一定要把鼠标指向一个可以输入文字的窗口,比如一个文本框,最好能激活这个文本框,这样可以保证绑定的成功.
; N4 l; h2 C/ r! m- K4 k4 J; a3 c返回值:
& O2 f' a4 k# R- A7 J  S6 k9 J整形数:# h' `3 W: O4 Y  @  J. t. m+ |
0:
失败3 V; g2 I: l# J
1: 成功; t& `4 \3 c7 u2 i# ~9 b

, f% P0 R  I( {! n' J如果返回0,可以调用GetLastError来查看具体失败错误码,帮助分析问题.
9 Q* p- a' P! v- v( N( A
示例:6 y0 r2 Z6 V5 {, L% W0 {

4 ^( [# K# E& R$ I3 l( h
比如
$ h; B7 e3 D: G) r4 i+ K4 G' Jdm_ret = dm.BindWindowEx(hwnd,"normal","dx.mouse.position.lock.api|dx.mouse.position.lock.message","windows","dx.public.active.api",0)

1 d+ w7 g% O7 p% L
% P4 {7 N  T0 }$ `  K0 E5 L5 zdm_ret = dm.BindWindowEx(hwnd,"dx2","windows","normal","dx.public.active.api",0)2 }& m# X5 c& ]% u1 E
6 D$ q+ l/ Y& t
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)
2 A" d: z* R  f  |6 Y
5 m* ^0 X/ F. J' Gdm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","",0)
* ]4 u: s. H, }( X/ U& _6 U2 h
! t/ y# @9 M" Rdm_ret = dm.BindWindowEx(hwnd,"dx2","windows","windows","dx.public.disable.window.size|dx.public.disable.window.minmax",0)

5 Q1 U. ^. D( F! X- z. x 9 V9 \; f' A& x+ L( `2 y
dm_ret = dm.BindWindowEx(hwnd,"dx2","windows3","windows","dx.mouse.position.lock.api",0)  R( ~4 ?2 U) {7 I1 Z  u5 T
等等.
* ?* X5 C  U1 Q8 M1 s; p! i; [5 O% U5 s- L  Q7 a8 J/ ^( d. q, C
注意:
. q( t' U# y1 y+ g+ I; S' p. o: R9 I
绑定之后,所有的坐标都相对于窗口的客户区坐标(不包含窗口边框)
" [8 G$ y3 w/ f' _另外,绑定窗口后,必须加以下代码,以保证所有资源正常释放

4 q. C( Q& g2 ?' ^9 `( ]& }6 O这个函数的意思是在脚本结束时,会调用这个函数。需要注意的是,目前的按键版本对于这个函数的执行不是线程级别的,也就是说,这个函数只会在主线程执行,子线程绑定的大漠对象,不保证完全释放。高级语言中则需要自己控制在适当的时候解除绑定./ O7 W3 i- L& V
Sub OnScriptExit()/ Z9 Q, B, M6 N/ d
    dm_ret = dm.UnBindWindow()
% t% M; ^' l! J  D4 `End Sub
- Q! v8 ?9 g& l' c9 |( v
另外 绑定dx会比较耗时间,请不要频繁调用此函数.! ~# H) r' P- Z9 k, D" C
还有一点特别要注意的是,有些窗口绑定之后必须加一定的延时,否则后台也无效.一般1秒到2秒的延时就足够.* n+ U2 y% E& ~% c3 ?

% m: h: w+ Q' D) x& l: P发现绑定失败的几种可能(一般是需要管理员权限的模式才有可能会失败)* D# b  T& u8 S& Z% e# G
1.     系统登录的帐号必须有Administrators权限
2.     一些防火墙会防止插件注入窗口所在进程,比如360防火墙等,必须把dm.dll设置为信任.
3.     还有一个比较弱智的可能性,那就是插件没有注册到系统中,这时CreateObject压根就是失败的. 检测对象是否创建成功很简单,如下代码
set dm = createobject("dm.dmsoft")3 X6 A" {5 B% w; `! V4 X$ O) e
ver = dm.Ver()
( [- D4 ~) O, K" k) }; \3 ]If len(ver) = 0 Then
. @0 N8 R! b( L5 }; g    MessageBox "创建对象失败,检查系统是否禁用了vbs脚本权限"
7 L6 M$ h  c% [' D    EndScript4 ?1 H$ ~- L: n* u( k
End If
4.     在沙盘中开的窗口,绑定一些需要管理员权限的模式,会失败。
& @$ d- R) Z# E解决方法是要配置沙盘参数,参考如何配置沙盘参数.
* k. F) N7 d' k- {- {7 h% ]  Q) {9 ~5 ~1 r4 {* O9 v! Z1 ~8 i
5.     窗口所在进程有保护,这个我也无能为力.
. H. Z; ^; m* W: o9 r& U% `3 Y; Z

. H9 Z7 _- P/ o2 v; s" ^0 O% D

0

主题

2336

帖子

9563

积分

VIP超级贵宾

Rank: 8Rank: 8

积分
9563
威望
198
易币
6831
贡献
0
积分
9563
UID
11903
在线时间
36 小时
注册时间
2021-1-23
发表于 2021-5-28 20:58:55 | 显示全部楼层
楼主发贴辛苦了,谢谢楼主分享!我觉得易语言吧是注册对了!
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【选择右侧内容,快速回复】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

大漠插件注册码无须等1-3号

QQ|本站为中文编程爱好者方便学习编程.公益免费,站内所有资源均来自互联网收集或用户上传分享,本站不拥有此类资源的版权。 作为网络服务提供者,对转载行为的发生不具备充分的监控能力。但是当版权拥有者提出侵权并出示充分的版权证明材料时,易语言吧负有移除转载作品以及停止继续传播的义务。在满足前款条件下采取移除等相应措施后不为此向原发布人承担违约责任,包括不承担因侵权不成立而给原发布人带来损害的赔偿责任。 用户免费分享产生,如果侵犯了你的权益,联系QQ:3066137757|Archiver|手机版|小黑屋|易语言吧

GMT+8, 2026-4-29 06:45 , Processed in 0.201521 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表