明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: wyj7485

VB做外挂编程入门(转)

  [复制链接]
 楼主| 发表于 2007-1-30 15:37:00 | 显示全部楼层
声明:
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
此函数用来获取指定窗口的某方面"结构数据"信息。 函数返回值由参数nIndex来决定要返回哪个方面的当前值。若出错则返回0。
调用如:Const GWL_STYLE = -16
Private Sub Command1_Click()
X = GetWindowLongA(Form1.hwnd, GWL_STYLE)
Print X
End Sub
参数:
hwnd: Long,欲获取信息的窗口的句柄 
nIndex: Long,欲取回此窗口哪方面的信息,可以是下述任何一个常数: 
GWL_EXSTYLE 扩展窗口样式 
(可能包含有:WS_EX_TOOLWINDOW=&H80标题栏缩小可变大小,相当于BorderStyle=5; WS_EX_TRANSPARENT=&H20&隐藏绘图区,但显示其上的子控件。有意思。等,别的我也不太清楚,好象要去查MSDN才可查到) 
GWL_STYLE 窗口样式 
(可能值有:WS_VSCROLL=?垂直滚动条,WS_HSCROLL=?水平滚动条,
WS_MAXIMIZEBOX=?标题栏右边最大化纽,WS_MINIMIZEBOX=?最小化纽等等)
GWL_WNDPROC 该窗口的窗口函数的地址 
GWL_HINSTANCE 拥有窗口的实例的句柄 
GWL_HWNDPARENT 该窗口之父的句柄。不要用SetWindowWord来改变这个值 
GWL_ID 对话框中一个子窗口的标识符 
GWL_USERDATA 含义由应用程序规定 
DWL_DLGPROC 这个窗口的对话框函数地址 
DWL_MSGRESULT 在对话框函数中处理的一条消息返回的值 
DWL_USER 含义由应用程序规定 
-----
SetWindowLongA函数:为窗口设置窗口结构信息
常用此函数来动态地设置窗口的风格(如样式,滚动条等等)。即不在属性窗口中设置。而在API中设置。 
声明:
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
调用如:
Public Const WS_EX_TOOLWINDOW = &H80
lStyle = WS_EX_TOOLWINDOW
lRet = SetWindowLongA(Me.hwnd, GWL_EXSTYLE, GetWindowLongA(Me.hwnd, GWL_EXSTYLE) Or lStyle) 注:这里有1个Or"或"操作。为何要用OR呢?这是因为一个窗口的GWL_EXSTYLE包含了多项设置值的和(如同时可能有滚动条,标题栏等值的组合,如为262400),用or就可只改动其部分值,而保留其他方面原设置不变。
参数:
hwnd Long,欲设置信息的窗口的句柄 
nIndex Long,请参考GetWindowLong函数的nIndex参数的说明 
dwNewLong Long,由nIndex指定的窗口信息的新值 
-------
GetWindowWord函数:获得指定窗口的结构信息(返回字值) 
该函数从附加窗口内存中返回字值。与GetWindowLong相似。 
声明: 
Declare Function GetWindowWord Lib "user32" Alias "GetWindowWord" (ByVal hwnd As Long, ByVal nIndex As Long) As Integer
调用如:
Const GWL_HWNDPARENT = -8
parent = GetWindowWord(Form1.hwnd, GWL_HWNDPARENT) 
这里调用后parent返回Form1的上一级父窗口的句柄。再例如command1在form1中, x=GetWindowWord(command1.hwnd,GWL_HWNDPARENT)返回的x就等于form1.hwnd.
参数见GetWindowLong.
======
获得指定窗口所属的窗口类名称:GetClassNameA函数
声明:
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
调用如--求Form1所属的窗口类的名称 :
pclass = Space(31) 
nlen = GetClassNameA(form1.hwnd, pclass, 32)
pclass = Left(pclass, nlen)
第1个参数为某窗口句柄。第2个参数为字符串缓冲区,第3个参数为缓冲区长度。
参数lpClassName返回值为窗口类名称字符串,如上例为ThunderFormDC类。
函数返回值为类名字符串长度。如上面nlen为13。
====
创建不规则窗口之"圆角矩形":SetWindowRgn结合CreateRoundRectRgn函数
 楼主| 发表于 2007-1-30 15:40:00 | 显示全部楼层
SetWindowRgn函数用于创建各种几何形状的窗口,声明前面已有,为:
Public Declare Function SetWindowRgn Lib "user32" Alias "SetWindowRgn" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
第1个参数为窗口句柄,第2个参数为几何形状区域句柄,第3个参数为是否立即重画。 
函数CreateRoundRectRgn为创建圆角矩形,函数返回创建的圆角区域句柄。声明:
Public Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
参数就是三个(X,Y)值,X1,Y1为左上角坐标,因为是用窗口自身坐标系统来度量,所以左上角坐标一般为0,0(注:FORM窗体为scaleleft,scaletop),X2,Y2为右下角坐标(注意不一定是直接的width或scalewidth,要用scaleleft+scalewidth才是"右下角"横坐标):如果是控件,就是其width,height的值,而如果是窗体,要加上其scaleleft,scaletop
得到右下角坐标值。X3,Y3表示圆角的大小。X3的取值范围是0(无圆角)到矩形宽(width或scalewidth,全圆),Y3的取值范围是0(无圆角)到矩形高(height或scaleheight,全圆),常乘以一个0至1的单精度数来表示。例如:
x = SetWindowRgn(form1.hwnd, CreateRoundRectRgn(form1.ScaleLeft, form1.ScaleTop, form1.ScaleWidth + form1.ScaleLeft, form1.ScaleHeight + form1.ScaleTop, form1.ScaleWidth * 0.6, form1.ScaleHeight * 0.6), True)
最后说明一下,还有一个API函数可直接画圆角矩形,就是RoundRect函数。声明:
Declare Function RoundRect Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
其中参数hDC是窗口的设备场景句柄。三个(X,Y)和CreateRoundRectRgn的是一样的,分别为左上角,右下角坐标和圆角大小。
======
获取本程序活动窗口的句柄:GetActiveWindow函数
声明:
Declare Function GetActiveWindow Lib "user32"() As Long
很简单,函数返回值为当前本程序活动窗口句柄。调用如:x=GetActiveWindow,这个函数不如GetForegroundWindow函数,建议用下面的:
----
获取屏幕上当前活动窗口的句柄:GetForegroundWindow函数
这个函数功能更强大,能获取前台应用程序的活动窗口句柄。声明:
Declare Function GetForegroundWindow Lib "user32" () As Long
函数返回值为当前屏幕上活动窗口的句柄,如:x=GetForegroundWindow。
-----
判断一个窗口是否是活动窗口:IsWindowEnabled函数
声明:
Declare Function IsWindowEnabled Lib "user32"(ByVal hwnd As Long) As Long 
参数hwnd是待检测窗口句柄。
调用如:x=IsWindowEnabled(Form1.hwnd),函数返回值若非0表示为活动窗口,返回0表示为失效窗口。
----
禁止任务条--任务条所属窗口类为"Shell_traywnd",用FindWindowA函数去查,如下: TaskBarhWnd = FindWindowA("Shell_traywnd", ""),然后用EnableWindow函数: lxn = EnableWindow(TaskBarhWnd,0)就可以了。
发表于 2007-1-30 23:32:00 | 显示全部楼层
收藏,谢谢!辛苦!
发表于 2007-1-31 12:02:00 | 显示全部楼层
好东西,版主辛苦了。谢谢!!
 楼主| 发表于 2007-2-2 08:34:00 | 显示全部楼层

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Private Const WS_EX_LAYERED = &H80000
Private Const GWL_EXSTYLE = (-20)
Private Const LWA_ALPHA = &H2
Private Const LWA_COLORKEY = &H1

Private Sub Form_Load()

    Dim rtn As Long
    rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
    rtn = rtn Or WS_EX_LAYERED
    SetWindowLong hwnd, GWL_EXSTYLE, rtn
    SetLayeredWindowAttributes hwnd, 0, 200, LWA_ALPHA
   
End Sub

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 18:27 , Processed in 0.241805 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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