From b4d87288300e884603693e7f3ae67ebc75797549 Mon Sep 17 00:00:00 2001 From: 502647092 Date: Sun, 24 Jan 2016 22:48:49 +0800 Subject: [PATCH] update... Signed-off-by: 502647092 --- Frm_Tools.bas | 2150 ++++++++++++++++++++++++------------------------- 1 file changed, 1075 insertions(+), 1075 deletions(-) diff --git a/Frm_Tools.bas b/Frm_Tools.bas index f699c4d..936e5f6 100644 --- a/Frm_Tools.bas +++ b/Frm_Tools.bas @@ -1,1075 +1,1075 @@ -Attribute VB_Name = "Frm_Tools" -'#######################################用户控件说明######################################### - -'名称:窗体控件 - -'功能:实现窗体透明,移动,靠边隐藏等功能 - -'最后更新日期:2014年6月5日 - -'创建人:蒋天蓓 - -'单位:上海市定海水电工程安装有限公司 - -''====================================用户控件使用说明======================================= -'窗体靠边自动隐藏:Auto_Hide(窗体句柄 As Long, 隐藏后显示部分长度 As Long, 检测间隔 As Long, [(可选)移动速度 As Long = 1]) -'窗体靠边自动吸附:Auto_Magnet(窗体名 As Form, 吸附距离 As Long,[可选,鼠标状态]) -'***************************************************************************************************************************** -'窗体大小延时处理:Daily_Show(窗体 As Form, 延时时间 As Long) -'窗体透明延时处理:Daily_Tpt(运行模式 As Boolean, 句柄 As Long, 透明度 As Integer, 延时时间 As Long) -'***************************************************************************************************************************** -'全屏窗口移动(通过窗体移动):fMove(窗体 As Form, Button As Integer, Shift As Integer, X As Single, Y As Single) -'全屏窗口移动(通过窗体句柄):hMove(窗体句柄 As Long) -'***************************************************************************************************************************** -'获取窗体类名:GetClassName(窗体句柄 As Long) As String -'***************************************************************************************************************************** -'获取激活窗体句柄: GetFedWnd() As Long -'激活窗体(通过窗体句柄):SetFedWnd(窗体句柄 As Long) -'***************************************************************************************************************************** -'获取原有窗体控件大小: GetFrmSize -'根据窗体大小调整控件大小: SetFrmSize -'***************************************************************************************************************************** -'通过类名标题查找窗体:GetWindowhWnd(窗体标题 As String,窗体类名 As String) As Long -'通过类名查找窗体:GethWndByClass(窗体类名 As String) As Long -'通过标题查找窗体:GethWndByTitle(窗体标题 As String) As Long -'获取窗体图标句柄:GetIconhWnd(窗体句柄 As Long) As Long -'获取鼠标所在窗体句柄: GetMouseWindowhWnd() As Long -'***************************************************************************************************************************** -'获取窗体标题(通过窗体句柄):GetTitle(窗体句柄 As Long) As String -'设置窗体标题(通过窗体句柄):SetTitle(窗体句柄 As Long, 窗体标题 As String) -'***************************************************************************************************************************** -'后台按下键:hWndKeyDown(窗体句柄 As Long, 按键码 As Long, [按键模式 As KeyPressMode = Normal]) -'后台按键:hWndKeyPress(窗体句柄 As Long, 按键码 As Long, [按键模式 As KeyPressMode = Normal]) -'后台释放键:hWndKeyUp(窗体句柄 As Long, 按键码 As Long, [按键模式 As KeyPressMode = Normal]) -'根据按键码返回按键信息:KeyNum2Key(按键码 As long) As String -'制作按键扫描码MakeKeyLparam:(按键码 As long,按键模式 As Long) As String -'***************************************************************************************************************************** -'窗体显示函数:InShow(窗体句柄 As Long, [显示模式 As Boolean = True](True是显示,False是隐藏)) -'窗口置顶函数:InTop(窗体句柄 As Long, [显示模式 As Boolean = True](True是置顶,False是不置顶)) -'***************************************************************************************************************************** -'使窗体不接受鼠标消息,可操作后面窗体:NoControl(句柄 As Long, [模式 As Boolean](Mode=Ture表示不接受,False表示接受)) -'***************************************************************************************************************************** -'窗口加载真彩图标:GethWndByClassEx(窗体句柄 As Long,图标句柄 As Long) -'***************************************************************************************************************************** -'延时:Sleep(延时大小 As Long[毫秒]) -'***************************************************************************************************************************** -'窗体透明:Tpt(窗体句柄 As Long, 透明度(0-100) As Integer, [需要透明的颜色 As Long]) -'#######################################用户控件说明######################################### - -Option Explicit -Public VisibleT As Boolean -''#########################################模块函数######################################## -'====================句柄后台按键======================= -Public Enum KeyPressMode - Normal - System - GameMode -End Enum - -Private Const WM_KEYDOWN As Long = &H100 -Private Const WM_KEYUP As Long = &H101 -Private Const WM_CHAR As Long = &H102 -Private Const WM_SYSKEYDOWN As Long = &H104 -Private Const WM_SYSKEYUP As Long = &H105 - -Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long -Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long -'====================获取鼠标所在窗体句柄======================= -Private Declare Function WindowFromPoint Lib "user32.dll" (ByVal xPoint As Long, ByVal yPoint As Long) As Long -''================================窗体消息发送========================================= -Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long -Private Const WM_SETICON As Long = &H80 -''================================窗体查找========================================= -Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long -Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long -''================================窗体激活========================================= -Private Declare Function GetForegroundWindow Lib "user32" () As Long -Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long -''================================窗体标题========================================= -Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String) As Long -Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long -Private Declare Function GetClassNameh Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long -Private Declare Function GetClassLong Lib "user32" Alias "GetClassLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long -''================================窗口操作函数========================================= -Private Declare Function SetWindowPos& Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) -Private Const FRM_TOP = -1 '置顶 -Private Const FRM_NORMAL = -2 '普通 -Private Const FRM_NOSIZE = &H1 '不改变大小 -Private Const FRM_NOMOVE = &H2 '不移动 -Private Const FRM_TOPMOST = &H3 '仅置顶 -Private Const FRM_NOZEROER = &H4 -Private Const FRM_NOREDRAW = &H8 '不重画窗体 -Private Const FRM_NOACTIVATE = &H10 '不激活窗体 -Private Const FRM_FRAMECHANGED = &H20 -Private Const FRM_SHOWWINDOW = &H40 '显示窗体 -Private Const FRM_HIDEWINDOW = &H80 '隐藏窗体 -Private Const FRM_NOCOPYBITS = &H100 -Private Const FRM_NOOWNERZORDER = &H200 -Private Const FRM_NOSENDCHANGING = &H400 -'========================全屏窗口移动============================ -Private Declare Function ReleaseCapture Lib "user32" () As Long -Private Const HTCAPTION = 2 -Private Const WM_NCLBUTTONDOWN = &HA1 -'''========================窗体靠边自动隐藏============================ -Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long -Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long -Private Type RECT '获取窗体位置 - Left As Long - Top As Long - Right As Long - Bottom As Long -End Type -Public Enum SetPos - SpTop - SPButton - SpLeft - SPRight -End Enum -Private Type POINTAPI '获取鼠标位置 - X As Long - Y As Long -End Type -Private IsInFrm As Boolean '检测窗体与鼠标状态。防止窗体闪烁 -Private Const HWND_TOPMOST = -1 '定义变量 -Private Const SWP_NOSIZE = &H1 -Private Const SWP_NOMOVE = &H2 -Private Const HWND_TOP = 0 -Private Const SWP_NOACTIVATE = &H10 -Private Const SWP_SHOWWINDOW = &H40 -Private Declare Function MoveWindow Lib "user32" (ByVal hWnd As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long -Private Declare Function IsIconic Lib "user32" (ByVal hWnd As Long) As Long -Private Declare Function IsZoomed Lib "user32" (ByVal hWnd As Long) As Long -Private Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Long -'''========================窗体透明============================ -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 WS_EX_TRANSPARENT = &H20& -Private Const WS_EX_TOPMOST = &H8 -Private Const GWL_EXSTYLE = (-20) -Private Const LWA_ALPHA = &H2 -Private Const LWA_COLORKEY = &H1 -'===================================圆角窗体==================================================== -Private Declare Function SetWindowRgn Lib "user32.dll" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long -Private Declare Function CreateRoundRectRgn Lib "gdi32.dll" (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 -Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long -'=================================Sleep======================================== -Private Declare Function timeGetTime Lib "winmm.dll" () As Long -Private Savetime As Double -''================================根据句柄获得PID========================================= -Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, ByRef lpdwprocessid As Long) As Long -''================================系统版本获取函数========================================= -Private Type OSVERSIONINFO - dwOSVersionInfoSize As Long - dwMajorVersion As Long - dwMinorVersion As Long - dwBuildNumber As Long - dwPlatformId As Long - szCSDVersion As String * 128 ' Maintenance string for PSS usage -End Type -Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long -Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long -Private Const SM_CLEANBOOT = 67 -Private Const SM_DEBUG = 22 -Private Const SM_SLOWMACHINE = 73 -Private Const VER_PLATFORM_WIN32s = 0 -Private Const VER_PLATFORM_WIN32_WINDOWS = 1 -Private Const VER_PLATFORM_WIN32_NT = 2 - -Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long -Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef saArray() As Any) As Long -Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal hIcon As Long) As Long -Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long -''#####################################################模块代码##################################################### - -'#############################################控件函数模块################################################# -'********************************************************************************************************** -'***过程名:SetWindowIcon -'***功 能 :改变窗体ICO图标 -'***输入值:(窗体句柄 As Long, [可选]图标文件 As String, [可选]图标位数 As Integer) -'***输出值:句柄所指向的PID -'***说 明:NULL -'********************************************************************************************************** -Public Sub SetWindowIcon(hWnd As Long, Optional FileName As String, Optional IconIndex As Integer) - Dim m_Icon As Long - Dim hModule As Long - If Len(FileName) = 0 Or Len(Dir(FileName, vbHidden)) = 0 Then - Dim MyPath As String - MyPath = App.Path - If Right(MyPath, 1) <> "\" Then MyPath = MyPath & "\" - FileName = MyPath & App.EXEName & ".exe" - End If - hModule = GetModuleHandle(FileName) - m_Icon = ExtractIcon(hModule, FileName, IconIndex) - SendMessage hWnd, WM_SETICON, 0, ByVal m_Icon -End Sub - -Public Function GetSystemVer() - Dim myVer As OSVERSIONINFO - Dim q As Long - myVer.dwOSVersionInfoSize = 148 '获取系统版本 - q& = GetVersionEx(myVer) - GetSystemVer = myVer.dwMajorVersion & "." & myVer.dwMinorVersion -End Function -'********************************************************************************************************** -'***过程名:SetRgnWindows -'***功 能 :改变窗体可视大小 -'***输入值:(窗体 As Form,边缘大小 As Long) -'***输出值:句柄所指向的PID -'***说 明:NULL -'********************************************************************************************************** -Public Function SetRgnWindows(Frm As Form, Rng As Long) As Long - Dim FRng As Long - Dim w As Long - Dim h As Long - w = Frm.ScaleX(Frm.Width, vbTwips, vbPixels) - h = Frm.ScaleY(Frm.Height, vbTwips, vbPixels) - FRng = CreateRectRgn(Rng, Rng, w - Rng, h - Rng) - SetRgnWindows = SetWindowRgn(Frm.hWnd, FRng, True) -End Function -'********************************************************************************************************** -'***过程名:SetRoundWindows -'***功 能 :改变窗体为圆角窗体 -'***输入值:(窗体 As Form,圆角大小 As Long) -'***输出值:句柄所指向的PID -'***说 明:NULL -'********************************************************************************************************** -Public Function SetRoundWindows(Frm As Form, Rng As Long) As Long - Dim FRng As Long - Dim w As Long - Dim h As Long - w = Frm.ScaleX(Frm.Width, vbTwips, vbPixels) - h = Frm.ScaleY(Frm.Height, vbTwips, vbPixels) - FRng = CreateRoundRectRgn(0, 0, w - 0, h - 0, Rng, Rng) - SetRoundWindows = SetWindowRgn(Frm.hWnd, FRng, True) -End Function -'********************************************************************************************************** -'***过程名:GetPidByhWnd -'***功 能 :根据句柄获得PID -'***输入值:(窗体句柄 As Long) -'***输出值:句柄所指向的PID -'***说 明:NULL -'********************************************************************************************************** -Public Function GetPidByhWnd(ByVal hWnd As Long) As Long - Dim PID As Long - GetWindowThreadProcessId hWnd, PID - GetPidByhWnd = PID -End Function -'********************************************************************************************************** -'***过程名:Tpt -'***功 能 :句柄窗体透明 -'***输入值:(窗体句柄 As Long, 透明度(0-100) As Integer, [需要透明的颜色 As Long = -1]) -'***输出值:NULL -'***说 明:窗体中用Me.hWnd代表窗体句柄 -'********************************************************************************************************** -Public Sub Tpt(ByVal hWnd As Long, ByVal Range As Integer, Optional ByVal TransColor As Long = -1) - If Range > 100 Then Range = 100 '如果透明度大于100则定义为100 - If Range < 0 Then Range = 0 '如果透明度小于0则定义为0 - Dim rtn As Long - rtn = GetWindowLong(hWnd, GWL_EXSTYLE) '取得窗体状态 - rtn = rtn Or WS_EX_LAYERED - SetWindowLong hWnd, GWL_EXSTYLE, rtn - If TransColor = -1 Then - SetLayeredWindowAttributes hWnd, 0, Range * 2.55, LWA_ALPHA '设置窗体透明度 - Else - SetLayeredWindowAttributes hWnd, TransColor, Range * 2.55, LWA_COLORKEY '根据颜色设置窗体透明度 - End If -End Sub -'********************************************************************************************************** -'***过程名:NoControl -'***功 能 :使窗体不接受鼠标消息,可操作后面窗体 -'***输入值:(句柄 As Long, [模式 As Boolean]) -'***输出值:NULL -'***说 明:窗体中用Me.hWnd代表窗体句柄,Mode=Ture表示不接受,False表示接受。 -'********************************************************************************************************** -Public Sub NoControl(ByVal hWnd As Long, Optional ByVal Mode As Boolean = True) - Dim rtn As Long - rtn = GetWindowLong(hWnd, GWL_EXSTYLE) '取得窗体状态 - rtn = rtn Or WS_EX_LAYERED - If Mode Then - rtn = rtn Or WS_EX_TRANSPARENT - Else - rtn = rtn And Not WS_EX_TRANSPARENT - End If - SetWindowLong hWnd, GWL_EXSTYLE, rtn -End Sub -'********************************************************************************************************** -'***过程名:Daily_Tpt -'***功 能 :窗体透明延时处理 -'***输入值:(运行模式 As Boolean, 句柄 As Long, 透明度 As Integer, 延时时间 As Long) -'***输出值:NULL -'***说 明:窗体中用Me.hWnd代表窗体句柄,Mode = True '显示窗体,Mode = False '隐藏窗体 -'********************************************************************************************************** -Public Sub Daily_Tpt(ByVal Mode As Boolean, ByVal hWnd As Long, ByVal Range As Integer, ByVal Daily As Long, Optional ByVal AddTpt As Long = 1) -'Mode = True '显示窗体 -'Mode = False '隐藏窗体 - If Daily > 5 Then Daily = 5 '防止参数过大,导致显示异常缓慢 - If Daily <= 0 Then Daily = 0.1 - Daily = Daily * 10 - Dim Tpti As Integer - If Mode = True Then - Do Until Tpti > Range - Tpti = Tpti + AddTpt - Sleep Daily - Tpt hWnd, Tpti - Loop - Else - Tpti = Range - Do Until Tpti < 0 - Tpti = Tpti - AddTpt - Sleep Daily - Tpt hWnd, Tpti - Loop - End If -End Sub -'********************************************************************************************************** -'***过程名:Daily_Show -'***功 能 :窗体大小延时处理 -'***输入值:(窗体 As Form, 延时时间 As Long) -'***输出值:NULL -'********************************************************************************************************** -Public Sub Daily_Show(ByVal Frm As Form, ByVal Daily As Long) - Dim h As Long - Dim w As Long - Dim I As Long - h = Frm.Height - w = Frm.Width - Frm.Height = 20 - Frm.Width = 20 - For I = 20 To w Step Daily - Sleep 10 - Frm.Width = I - Frm.Refresh - Next - For I = 20 To h Step Daily - Sleep 10 - Frm.Height = I - Frm.Refresh - Next -End Sub -'********************************************************************************************************** -'***过程名:InTop -'***功 能 :窗口置顶函数 -'***输入值:(窗体句柄 As Long, [显示模式 As Boolean = True](True是置顶,False是不置顶)) -'***输出值:NULL -'***说 明:窗体中用Me.hWnd代表窗体句柄 -'********************************************************************************************************** -Public Sub InTop(ByVal hWnd As Long, Optional ByVal Mode As Boolean = True) - If Mode Then - SetWindowPos hWnd, FRM_TOP, 0, 0, 0, 0, FRM_TOPMOST '置顶 - Else - SetWindowPos hWnd, FRM_NORMAL, 0, 0, 0, 0, FRM_TOPMOST '不置顶 - End If -End Sub -'********************************************************************************************************** -'***过程名:InShow -'***功 能 :窗体显示函数 -'***输入值:(窗体句柄 As Long, [显示模式 As Boolean = True](True是显示,False是隐藏)) -'***输出值:NULL -'***说 明:窗体中用Me.hWnd代表窗体句柄 -'********************************************************************************************************** -Public Sub InShow(ByVal hWnd As Long, Optional ByVal Mode As Boolean = True) - If Mode Then - SetWindowPos hWnd, 0, 0, 0, 0, 0, FRM_SHOWWINDOW Or FRM_TOPMOST '显示 - Else - SetWindowPos hWnd, 0, 0, 0, 0, 0, FRM_HIDEWINDOW Or FRM_TOPMOST '不显示 - End If -End Sub -'********************************************************************************************************** -'***过程名:Auto_Hide -'***功 能:窗体靠边自动隐藏 -'***输入值:(窗体句柄 As Long, 隐藏后显示部分长度 As Long, 检测间隔 As Long, [(可选)移动速度 As Long = 1]) -'***输出值:NULL -'***说 明:窗体句柄可用Me.hWnd -'********************************************************************************************************** -'Public Sub Auto_Hide(ByVal Enable As Boolean, Optional ByVal hWnd As Long, Optional ByVal Range As Long, Optional Daily As Long, Optional ByVal MoveInt As Long = 1) -' Tim.Enabled = Enable -' Tim.Interval = Daily -' Tim.Tag = hWnd & " " & Range & " " & MoveInt -'End Sub -' -'Private Sub Tim_Timer() -' Dim info -' info = Split(Tim.Tag) -' Auto_Hide_Load Val(info(0)), Val(info(1)), Val(info(2)) -'End Sub - -Private Sub Auto_Hide_Load(ByVal hWnd As Long, ByVal Range As Long, Optional ByVal MoveInt As Long) - Dim P As POINTAPI - Dim F As RECT - Dim T As Long - Dim WinHeight As Long - Dim WinWidth As Long - Dim ScrHeight As Long - Dim ScrWidth As Long - Dim IsTop As Long - IsTop = IsTopmost(hWnd) - GetCursorPos P '得到MOUSE位置 - GetWindowRect hWnd, F '得到窗体的位置 - WinWidth = F.Right - F.Left - WinHeight = F.Bottom - F.Top - ScrHeight = Screen.Height / 15 - ScrWidth = Screen.Width / 15 - If MoveInt <= 0 Then MoveInt = 0 - If IsZoomed(hWnd) = 0 And IsIconic(hWnd) = 0 Then - If P.X >= F.Left And P.X <= F.Right And P.Y >= F.Top And P.Y <= F.Bottom Then - If IsInFrm Then - SetWindowPos hWnd, FRM_TOP, 0, 0, 0, 0, FRM_TOPMOST - If F.Top <= 0 Then - T = F.Top - Do Until T >= 0 '从上显示窗体 - If MoveInt = 0 Then T = 0 Else T = T + MoveInt - If T > 0 Then T = 0 - SetWindowPos hWnd, 0, F.Left, T, 0, 0, FRM_NOSIZE - DoEvents - Loop - ElseIf F.Left <= 0 Then '从左显示窗体 - T = F.Left - Do Until T >= 0 - If MoveInt = 0 Then T = 0 Else T = T + MoveInt - If T > 0 Then T = 0 - SetWindowPos hWnd, 0, T, F.Top, 0, 0, FRM_NOSIZE - DoEvents - Loop - ElseIf F.Bottom >= ScrHeight Then '从下显示窗体 - T = F.Bottom - Do Until T <= ScrHeight - If MoveInt = 0 Then T = ScrHeight Else T = T - MoveInt - If T > ScrHeight Then T = ScrHeight - SetWindowPos hWnd, 0, F.Left, T - WinHeight, 0, 0, FRM_NOSIZE - DoEvents - Loop - ElseIf F.Right >= ScrWidth Then '从右显示窗体 - T = F.Right - Do Until T <= ScrWidth - If MoveInt = 0 Then T = ScrWidth Else T = T - MoveInt - If T > ScrWidth Then T = ScrWidth - SetWindowPos hWnd, 0, T - WinWidth, F.Top, 0, 0, FRM_NOSIZE - DoEvents - Loop - End If - IsInFrm = False - End If - Else - If Not IsInFrm Then - SetWindowPos hWnd, FRM_NORMAL, 0, 0, 0, 0, FRM_TOPMOST - If F.Top <= 5 Then - T = F.Top - Do Until T <= Range / 15 - WinHeight '从上隐藏窗体,range为露在外面长度 - If MoveInt = 0 Then T = Range / 15 - WinHeight Else T = T - MoveInt - If T < Range / 15 - WinHeight Then T = Range / 15 - WinHeight - SetWindowPos hWnd, 0, F.Left, T, 0, 0, FRM_NOSIZE - DoEvents - Loop - ElseIf F.Left <= 5 Then - T = F.Left - Do Until T <= Range / 15 - WinWidth '从左隐藏窗体 - If MoveInt = 0 Then T = Range / 15 - WinWidth Else T = T - MoveInt - If T < Range / 15 - WinWidth Then T = Range / 15 - WinWidth - SetWindowPos hWnd, 0, T, F.Top, 0, 0, FRM_NOSIZE - DoEvents - Loop - ElseIf F.Bottom >= ScrHeight - 5 Then '从下隐藏窗体 - T = F.Bottom - WinHeight - Do Until T >= ScrHeight - Range / 15 - If MoveInt = 0 Then T = ScrHeight - Range / 15 Else T = T + MoveInt - If T > ScrHeight - Range / 15 Then T = ScrHeight - Range / 15 - SetWindowPos hWnd, 0, F.Left, T, 0, 0, FRM_NOSIZE - DoEvents - Loop - ElseIf F.Right >= ScrWidth - 5 Then '从右隐藏窗体 - T = F.Right - WinWidth - Do Until T >= ScrWidth - Range / 15 - If MoveInt = 0 Then T = ScrWidth - Range / 15 Else T = T + MoveInt - If T > ScrWidth - Range / 15 Then T = ScrWidth - Range / 15 - SetWindowPos hWnd, 0, T, F.Top, 0, 0, FRM_NOSIZE - DoEvents - Loop - End If - IsInFrm = True - End If - End If - End If - If IsTop <> IsTopmost(hWnd) Then SetWindowPos hWnd, IsTop, 0, 0, 0, 0, FRM_TOPMOST -End Sub - -Public Function IsTopmost(hWnd As Long) As Long '判断窗口置顶函数 - Dim Ret As Long, t1 As Long - Ret = GetWindowLong(hWnd, GWL_EXSTYLE) - t1 = Ret Or WS_EX_TOPMOST - IsTopmost = IIF(Ret = t1, -1, -2) -End Function -'------------------------------------以下为老版本-------------------------------------------------------- -'********************************************************************************************************** -'***过程名:Auto_Hide -'***功 能:窗体靠边自动隐藏 -'***输入值:(窗体名 As Form, 计时器 As Timer, 隐藏后显示部分长度 As Long, 检测间隔 As Long) -'***输出值:NULL -'***说 明:请在窗体中计时器的Timer事件中调用(请手动设置Timer的延时数值) -'********************************************************************************************************** - -'Public Sub Auto_Hide(ByVal Frm As Form, ByVal Tmr As Timer, ByVal Range As Long, ByVal Daily As Long) -' Dim P As POINTAPI -' Dim f As RECT -' Tmr.Enabled = True -' Tmr.Interval = Daily -' GetCursorPos P '得到MOUSE位置 -' GetWindowRect Frm.hwnd, f '得到窗体的位置 -' If Frm.WindowState <> 1 Then -' If P.X >= f.Left And P.X <= f.Right And P.Y >= f.Top And P.Y <= f.Bottom Then -' 'MOUSE 在窗体上 -' If Not IsInFrm Then '如果鼠标之前不在窗体上则继续 -' If Frm.Top <= 0 Then -' Do Until Frm.Top >= 0 '从上显示窗体 -' Frm.Top = Frm.Top + 1 -' Loop -' ElseIf Frm.Left <= 0 Then '从左显示窗体 -' Do Until Frm.Left >= 0 -' Frm.Left = Frm.Left + 1 -' Loop -' ElseIf Frm.Top + Frm.Height >= Screen.Height Then '从下显示窗体 -' Do Until Frm.Top <= Screen.Height - Frm.Height -' Frm.Top = Frm.Top - 1 -' Loop -' ElseIf Frm.Left + Frm.Width >= Screen.Width Then '从右显示窗体 -' Do Until Frm.Left <= Screen.Width - Frm.Width -' Frm.Left = Frm.Left - 1 -' Loop -' End If -' IsInFrm = True -' End If -' Else -' If IsInFrm Then '如果鼠标之前在窗体上则继续 -' If Frm.Top <= 5 Then -' Do Until Frm.Top <= Range - Frm.Height '从上隐藏窗体,range为露在外面长度 -' Frm.Top = Frm.Top - 1 -' Loop -' ElseIf f.Left <= 5 Then -' Do Until Frm.Left <= Range - Frm.Width '从左隐藏窗体 -' Frm.Left = Frm.Left - 1 -' Loop -' ElseIf Frm.Top + Frm.Height >= Screen.Height - 5 Then '从下隐藏窗体 -' Do Until Frm.Top >= Screen.Height - Range -' Frm.Top = Frm.Top + 1 -' Loop -' ElseIf Frm.Left + Frm.Width >= Screen.Width - 5 Then '从右隐藏窗体 -' Do Until Frm.Left >= Screen.Width - Range -' Frm.Left = Frm.Left + 1 -' Loop -' End If -' IsInFrm = False -' End If -' End If -' End If -'End Sub - -'********************************************************************************************************** -'***过程名:Auto_Magnet -'***功 能 :窗体靠边自动吸附 -'***输入值:(窗体名 As Form, 吸附距离 As Long,[可选,鼠标状态]) -'***输出值:NULL -'***说 明:请在窗体的MouseMove事件中调用 -'********************************************************************************************************** -Public Sub Auto_Magnet(ByVal Frm As Form, ByVal Range As Long, Optional ByVal Button As Integer) 'range是吸附距离 - Dim P As POINTAPI - GetCursorPos P '得到MOUSE位置 - If Button = 1 Then '得到鼠标状态,如果是左键按下则检测鼠标是否在边缘 - If P.X = 0 Then Frm.Left = 0 '鼠标处于屏幕边缘则直接吸附 - If P.Y = 0 Then Frm.Top = 0 - If P.X = Screen.Width Then Frm.Left = Screen.Width - Frm.Width - If P.Y = Screen.Height Then Frm.Top = Screen.Height - Frm.Height - Else - '如果窗体离屏幕距离小于吸附距离则吸附且未到屏幕外,就吸附到屏幕比边缘。 - If Frm.Left < Range And Frm.Left > 0 Then - Frm.Left = 0 '向左吸附 - End If - If Frm.Top < Range And Frm.Top > 0 Then - Frm.Top = 0 '向上吸附 - End If - If Frm.Left + Frm.Width > Screen.Width - Range And Frm.Left + Frm.Width < Screen.Width Then - Frm.Left = Screen.Width - Frm.Width '向右吸附 - End If - If Frm.Top + Frm.Height > Screen.Height - Range And Frm.Top + Frm.Height < Screen.Height Then - Frm.Top = Screen.Height - Frm.Height '向下吸附 - End If - ReleaseCapture - End If -End Sub - -'********************************************************************************************************** -'***过程名:WindowKiss -'***功 能 :窗体紧贴(通过窗体句柄) -'***输入值:(被贴窗体句柄 As Long,贴上窗体句柄 As Long) -'***输出值:NULL -'***说 明: -'********************************************************************************************************** -'Public Sub WindowKiss(ByVal Enable As Boolean, Optional ByVal BhWnd As Long, Optional ByVal KhWnd As Long, Optional ByVal SetRect As SetPos, Optional ByVal IsIN As Long, Optional ByVal Daily As Long) -' Ktmr.Enabled = Enable -' Ktmr.Interval = Daily -' Ktmr.Tag = BhWnd & " " & KhWnd & " " & SetRect & " " & IsIN -'End Sub -' -'Private Sub Ktmr_Timer() -' On Error Resume Next -' Dim AWK() As String -' AWK = Split(Ktmr.Tag) -' AutoWindowKiss AWK(0), AWK(1), AWK(2), AWK(3) -'End Sub -Public Sub AutoWindowKiss(ByVal BhWnd As Long, ByVal KhWnd As Long, ByVal SetRect As SetPos, ByVal IsIN As Boolean, ByVal IsTop As Boolean) - Dim B As RECT - Dim k As RECT - Dim BH As Long - Dim BW As Long - Dim KH As Long - Dim KW As Long - Dim BHK As Long - Dim BWK As Long - Dim Frm_ST As Long - If IsTop Then Frm_ST = -1 Else Frm_ST = -2 - GetWindowRect BhWnd, B - GetWindowRect KhWnd, k - BH = B.Bottom - B.Top - BW = B.Right - B.Left - KH = k.Bottom - k.Top - KW = k.Right - k.Left - BHK = Abs(BH - KH) / 2 - BWK = Abs(BW - KW) / 2 - Select Case SetRect - Case SpTop - If IsIN Then - SetWindowPos KhWnd, Frm_ST, B.Left + BWK, B.Top, 0, 0, FRM_NOSIZE - Else - SetWindowPos KhWnd, Frm_ST, B.Left + BWK, B.Top - KH, 0, 0, FRM_NOSIZE - End If - Case SPButton - If IsIN Then - SetWindowPos KhWnd, Frm_ST, B.Left + BWK, B.Bottom - KH, 0, 0, FRM_NOSIZE - Else - SetWindowPos KhWnd, Frm_ST, B.Left + BWK, B.Bottom, 0, 0, FRM_NOSIZE - End If - Case SpLeft - If IsIN Then - SetWindowPos KhWnd, Frm_ST, B.Left, B.Top, 0, 0, FRM_NOSIZE - Else - SetWindowPos KhWnd, Frm_ST, B.Left - KW, B.Top, 0, 0, FRM_NOSIZE - End If - Case SPRight - If IsIN Then - SetWindowPos KhWnd, Frm_ST, B.Left - KW, B.Top, 0, 0, FRM_NOSIZE - Else - SetWindowPos KhWnd, Frm_ST, B.Left, B.Top, 0, 0, FRM_NOSIZE - End If - End Select - -End Sub - -'********************************************************************************************************** -'***过程名:hMove -'***功 能 :全屏窗口移动(通过窗体句柄) -'***输入值:(窗体句柄 As Long) -'***输出值:NULL -'***说 明:请在窗体的MouseDown事件中调用,窗体中用Me.hWnd代表窗体句柄 -'********************************************************************************************************** -Public Sub hMove(ByVal hWnd As Long) - ReleaseCapture '从当前线程中的窗口释放鼠标捕获,并恢复通常的鼠标输入处理。 - SendMessage hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0& '移动窗体 -End Sub -'********************************************************************************************************** -'***过程名:fMove -'***功 能 :全屏窗口移动(通过窗体移动) -'***输入值:(窗体 As Form, Button As Integer, Shift As Integer, X As Single, Y As Single) -'***输出值:NULL -'***说 明:请在窗体的MouseMove事件中调用,窗体中用Me代表窗体,剩下的直接用Button, Shift, X, Y -'********************************************************************************************************** -Public Sub fMove(Frm As Form, Button As Integer, Shift As Integer, X As Single, Y As Single) - On Error Resume Next - Static nX&, nY& - If Button = 1 Then - Frm.Move Frm.Left - nX + X, Frm.Top - nY + Y - Button = 0 - Else - nX = X - nY = Y - End If -End Sub -'********************************************************************************************************** -'***函数名:GetTitle -'***功 能 :获取窗体标题(通过窗体句柄) -'***输入值:(窗体句柄 As Long) -'***输出值:窗体标题 As String -'********************************************************************************************************** -Public Function GetTitle(ByVal hWnd As Long) As String '得到窗体标题 - Dim StrText As String * 256 '定义一个指针获得字符串 - Dim cch As Long '定义一个参数获取字符串长度 - cch = GetWindowText(hWnd, StrText, 256) '获取窗体标题 - GetTitle = Left(StrText, cch) '根据长度截取标题 -End Function -'********************************************************************************************************** -'***过程名:SetTitle -'***功 能 :设置窗体标题(通过窗体句柄) -'***输入值:(窗体句柄 As Long, 窗体标题 As String) -'***输出值:NULL -'********************************************************************************************************** -Public Sub SetTitle(ByVal hWnd As Long, ByVal TitleStr As String) '设置窗体标题 - SetWindowText hWnd, TitleStr '设置窗体标题 -End Sub -'********************************************************************************************************** -'***函数名:GetFedWnd -'***功 能 :获取激活窗体句柄 -'***输入值:NULL -'***输出值:当前激活窗体的句柄 As Long -'********************************************************************************************************** -Public Function GetFedWnd() As Long - GetFedWnd = GetForegroundWindow '得到当前窗体句柄 -End Function -'********************************************************************************************************** -'***过程名:SetFedWnd -'***功 能 :激活窗体(通过窗体句柄) -'***输入值:(窗体句柄 As Long) -'***输出值:NULL -'********************************************************************************************************** -Public Sub SetFedWnd(ByVal hWnd As Long) - SetForegroundWindow hWnd '设置句柄为激活窗体 -End Sub -'##########################################保持窗体控件原有大小比例############################################# -'********************************************************************************************************** -'***过程名:GetFrmSize -'***功 能 :获取原有窗体控件大小 -'***输入值:Null -'***输出值:NULL -'***说 明:请在窗体的Load事件中调用,并且控件需在窗体上 -'********************************************************************************************************** -Public Sub GetFrmSize(FormName As Form) - On Error Resume Next - Dim obj As Control '定义一个控件数组 - FormName.ScaleWidth = 1000 '设置窗体水平度量单位数 - FormName.ScaleHeight = 1000 '设置窗体垂直度量单位数 - For Each obj In FormName '遍历所有控件 - obj.Tag = Str(obj.Left) & Str(obj.Top) & Str(obj.Width) & Str(obj.Height) '存储空间度量位置到Tag - Next obj - On Error GoTo 0 -End Sub -'********************************************************************************************************** -'***过程名:SetFrmSize -'***功 能 :根据窗体大小调整控件大小 -'***输入值:Null -'***输出值:NULL -'***说 明:请在窗体的Resize事件中调用,并且控件需在窗体上 -'********************************************************************************************************** -Public Sub SetFrmSize(FormName As Form) 'Optional FormName As Form = UserControl.Parent) - On Error Resume Next - Dim Pos() As String - Dim obj As Control - FormName.ScaleWidth = 1000 '设置窗体水平度量单位数 - FormName.ScaleHeight = 1000 '设置窗体垂直度量单位数 - For Each obj In FormName '遍历所有控件 - Pos = Split(obj.Tag) ' - obj.Left = Val(Pos(1)) '调整 - obj.Top = Val(Pos(2)) '控件 - obj.Width = Val(Pos(3)) '位置 - obj.Height = Val(Pos(4)) '大小 - Next obj - On Error GoTo 0 -End Sub -'##########################################保持窗体控件原有大小比例############################################# - -'##########################################窗口句柄后台按键############################################# -'********************************************************************************************************** -'***过程名:KeyNum2Key -'***功 能 :根据按键码返回按键信息 -'***输入值:(按键码 As long) -'***输出值:按键信息 As String -'***说 明: -'********************************************************************************************************** -Public Function KeyNum2Key(ByVal KeyNum As Long) As String -'Debug.Print KeyNum - Select Case KeyNum - Case vbKeyLButton: KeyNum2Key = "鼠标左键" - Case vbKeyRButton: KeyNum2Key = "鼠标右键" - Case vbKeyCancel: KeyNum2Key = "CANCEL" - Case vbKeyMButton: KeyNum2Key = "鼠标中键" - Case 5: KeyNum2Key = "鼠标扩展键1" - Case 6: KeyNum2Key = "鼠标扩展键2" - Case vbKeyBack: KeyNum2Key = "退格键" '"BACKSPACE" - Case vbKeyTab: KeyNum2Key = "TAB" - Case vbKeyClear: KeyNum2Key = "CLEAR" - Case vbKeyReturn: KeyNum2Key = "ENTER" - Case vbKeyShift: KeyNum2Key = "SHIFT" - Case vbKeyControl: KeyNum2Key = "CTRL" - Case vbKeyMenu: KeyNum2Key = "MENU" - Case vbKeyPause: KeyNum2Key = "PAUSE" - Case vbKeyCapital: KeyNum2Key = "CAPS LOCK" - Case vbKeyEscape: KeyNum2Key = "ESC" - Case vbKeySpace: KeyNum2Key = "SPACEBAR" - Case vbKeyPageUp: KeyNum2Key = "PAGE UP" - Case vbKeyPageDown: KeyNum2Key = "PAGE DN" - Case vbKeyEnd: KeyNum2Key = "END" - Case vbKeyHome: KeyNum2Key = "HOME" - Case vbKeyLeft: KeyNum2Key = "←" '"LEFT ARROW" - Case vbKeyUp: KeyNum2Key = "↑" '"UP ARROW" - Case vbKeyRight: KeyNum2Key = "→" '"RIGHT ARROW" - Case vbKeyDown: KeyNum2Key = "↓" '"DOWN ARROW" - Case vbKeySelect: KeyNum2Key = "SELECT" - Case vbKeyPrint: KeyNum2Key = "PRINT SCREEN" - Case vbKeyExecute: KeyNum2Key = "EXECUTE" - Case vbKeySnapshot: KeyNum2Key = "SNAPSHOT" - Case vbKeyDelete: KeyNum2Key = "DELETE" - Case vbKeyHelp: KeyNum2Key = "HELP" - Case vbKeyNumlock: KeyNum2Key = "NUM LOCK" - Case vbKeyNumpad0: KeyNum2Key = "Num 0" - Case vbKeyNumpad1: KeyNum2Key = "Num 1" - Case vbKeyNumpad2: KeyNum2Key = "Num 2" - Case vbKeyNumpad3: KeyNum2Key = "Num 3" - Case vbKeyNumpad4: KeyNum2Key = "Num 4" - Case vbKeyNumpad5: KeyNum2Key = "Num 5" - Case vbKeyNumpad6: KeyNum2Key = "Num 6" - Case vbKeyNumpad7: KeyNum2Key = "Num 7" - Case vbKeyNumpad8: KeyNum2Key = "Num 8" - Case vbKeyNumpad9: KeyNum2Key = "Num 9" - Case vbKeyMultiply: KeyNum2Key = "MULTIPLICATIONSIGN(*)" - Case vbKeyAdd: KeyNum2Key = "PLUSSIGN(+)" - Case vbKeySeparator: KeyNum2Key = "ENTER" - Case vbKeySubtract: KeyNum2Key = "MINUSSIGN(-)" - Case vbKeyDecimal: KeyNum2Key = "DECIMALPOINT(.)" - Case vbKeyDivide: KeyNum2Key = "DIVISIONSIGN(/)" - Case vbKeyF1: KeyNum2Key = "F1" - Case vbKeyF2: KeyNum2Key = "F2" - Case vbKeyF3: KeyNum2Key = "F3" - Case vbKeyF4: KeyNum2Key = "F4" - Case vbKeyF5: KeyNum2Key = "F5" - Case vbKeyF6: KeyNum2Key = "F6" - Case vbKeyF7: KeyNum2Key = "F7" - Case vbKeyF8: KeyNum2Key = "F8" - Case vbKeyF9: KeyNum2Key = "F9" - Case vbKeyF10: KeyNum2Key = "F10" - Case vbKeyF11: KeyNum2Key = "F11" - Case vbKeyF12: KeyNum2Key = "F12" - Case 91: KeyNum2Key = "Win" - Case 93: KeyNum2Key = "Menu" - Case 160: KeyNum2Key = "左SHIFT" - Case 161: KeyNum2Key = "右SHIFT" - Case 162: KeyNum2Key = "左CTRL" - Case 163: KeyNum2Key = "右CTRL" - Case 164: KeyNum2Key = "左AIT" - Case 165: KeyNum2Key = "右AIT" - - Case 186: KeyNum2Key = ";" - Case 187: KeyNum2Key = "=" - Case 188: KeyNum2Key = "," - Case 189: KeyNum2Key = "-" - Case 190: KeyNum2Key = "." - Case 191: KeyNum2Key = "/" - Case 192: KeyNum2Key = "~" - - Case 219: KeyNum2Key = "[" - Case 220: KeyNum2Key = "\" - Case 221: KeyNum2Key = "]" - Case 222: KeyNum2Key = "'" - Case Else: KeyNum2Key = Chr(KeyNum) - End Select -End Function -'********************************************************************************************************** -'***过程名:MakeKeyLparam -'***功 能 :制作按键扫描码 -'***输入值:(按键码 As long,按键模式 As Long) -'***输出值:按键扫描码 As String -'***说 明:用于游戏中的扫描码,不然有些游戏窗体收不到消息 -'********************************************************************************************************** -Private Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long - Dim S As String - Dim Firstbyte As String 'lparam参数的24-31位 - If flag = WM_KEYDOWN Then '如果是按下键 - Firstbyte = "00" - Else - Firstbyte = "C0" '如果是释放键 - End If - Dim Scancode As Long - '获得键的扫描码 - - 'Debug.Print "========" & VirtualKey & "=========" - Scancode = MapVirtualKey(VirtualKey, 0) - 'Debug.Print Scancode - Dim Secondbyte As String 'lparam参数的16-23位,即虚拟键扫描码 - Secondbyte = Right("00" & Hex(Scancode), 2) - 'Debug.Print Secondbyte - S = Firstbyte & Secondbyte & "0001" '0001为lparam参数的0-15位,即发送次数和其它扩展信息 - 'Debug.Print "&H" & s - MakeKeyLparam = Val("&H" & S) -End Function -'********************************************************************************************************** -'***过程名:hWndKeyDown -'***功 能 :后台按下键 -'***输入值:(窗体句柄 As Long, 按键码 As Long, [按键模式 As KeyPressMode = Normal]) -'***输出值:Null -'***说 明:用于后台按下按键 -'********************************************************************************************************** -Public Sub hWndKeyDown(ByVal hWnd As Long, ByVal KeyCode As Long, Optional ByVal PressKeyMode As KeyPressMode = Normal) - Select Case PressKeyMode - Case Normal - PostMessage hWnd, WM_KEYDOWN, KeyCode, 0 '释放A键 - Case System - PostMessage hWnd, WM_KEYDOWN, KeyCode, 0 '按下A键 - Case GameMode - PostMessage hWnd, WM_KEYDOWN, KeyCode, MakeKeyLparam(KeyCode, WM_KEYDOWN) '按下A键 - End Select -End Sub -'********************************************************************************************************** -'***过程名:hWndKeyUp -'***功 能 :后台释放键 -'***输入值:(窗体句柄 As Long, 按键码 As Long, [按键模式 As KeyPressMode = Normal]) -'***输出值:Null -'***说 明:用于后台释放按键 -'********************************************************************************************************** -Public Sub hWndKeyUp(ByVal hWnd As Long, ByVal KeyCode As Long, Optional ByVal PressKeyMode As KeyPressMode = Normal) - Select Case PressKeyMode - Case Normal - PostMessage hWnd, WM_KEYUP, KeyCode, 0 '释放A键 - Case System - PostMessage hWnd, WM_KEYUP, KeyCode, 0 '释放A键 - Case GameMode - PostMessage hWnd, WM_KEYUP, KeyCode, MakeKeyLparam(KeyCode, WM_KEYUP) '释放A键 - End Select -End Sub -'********************************************************************************************************** -'***过程名:hWndKeyPress -'***功 能 :后台按键 -'***输入值:(窗体句柄 As Long, 按键码 As Long, [按键模式 As KeyPressMode = Normal]) -'***输出值:Null -'***说 明:用于后台按键 -'********************************************************************************************************** -Public Sub hWndKeyPress(ByVal hWnd As Long, ByVal KeyCode As Long, Optional ByVal PressKeyMode As KeyPressMode = Normal) - Select Case PressKeyMode - Case Normal - PostMessage hWnd, WM_CHAR, KeyCode, 0 '按A键 - Case System - PostMessage hWnd, WM_KEYDOWN, KeyCode, 0 - PostMessage hWnd, WM_KEYUP, KeyCode, 0 - Case GameMode - PostMessage hWnd, WM_KEYDOWN, KeyCode, MakeKeyLparam(KeyCode, WM_KEYDOWN) - PostMessage hWnd, WM_KEYUP, KeyCode, MakeKeyLparam(KeyCode, WM_KEYUP) - End Select -End Sub -'##########################################窗口句柄后台按键############################################# -'********************************************************************************************************** -'***过程名:GetMouseWindowhWnd() -'***功 能 :获取鼠标所在窗体句柄 -'***输入值:Null -'***输出值:窗体句柄 As Long -'***说 明:用于获取窗体句柄 -'********************************************************************************************************** -Public Function GetMouseWindowhWnd() As Long - Dim Point As POINTAPI - GetCursorPos Point - GetMouseWindowhWnd = WindowFromPoint(Point.X, Point.Y) -End Function -'********************************************************************************************************** -'***过程名:GetClassName() -'***功 能 :获取窗体类名 -'***输入值:(窗体句柄 As Long) -'***输出值:窗体类名 As String -'***说 明:用于获取窗体类名 -'********************************************************************************************************** -Public Function GetClassName(ByVal hWnd As Long) As String - Dim StrText As String * 256 - Dim cch As Long - cch = GetClassNameh(hWnd, StrText, 256) - GetClassName = Left(StrText, cch) -End Function -'********************************************************************************************************** -'***过程名:GetIconhWnd() -'***功 能 :获取窗体图标句柄 -'***输入值:窗体句柄 As Long -'***输出值:窗体图标句柄 As Long -'***说 明:用于获取窗体图标句柄 -'********************************************************************************************************** -Public Function GetIconhWnd(ByVal hWnd As Long) As Long - GetIconhWnd = GetClassLong(hWnd, -14) -End Function -'********************************************************************************************************** -'***过程名:GetWindowhWnd() -'***功 能 :通过类名标题查找窗体 -'***输入值:(窗体标题 As String,窗体类名 As String) -'***输出值:找到的窗体的句柄 As Long -'***说 明:用于获取窗体句柄 -'********************************************************************************************************** -Public Function GetWindowhWnd(ByVal Title As String, ByVal Class As String) As Long - GetWindowhWnd = FindWindow(Class, Title) -End Function -'********************************************************************************************************** -'***过程名:GethWndByTitle() -'***功 能 :通过标题查找窗体 -'***输入值:(窗体标题 As String) -'***输出值:找到的窗体的句柄 As Long -'***说 明:用于获取窗体句柄 -'********************************************************************************************************** -Public Function GethWndByTitle(ByVal Title As String) As Long - GethWndByTitle = FindWindow(vbNullString, Title) -End Function -'********************************************************************************************************** -'***过程名:GethWndByTitleEx() -'***功 能 :通过标题查找窗体 -'***输入值:(窗体标题 As String) -'***输出值:找到的窗体的句柄As Long -'***说 明:用于获取窗体句柄 -'********************************************************************************************************** -'Public Function GethWndByTitleEx(ByVal Title As String) As Long -' GethWndByTitleEx = FindWindowEx(0, 0, vbNullString, Title) -'End Function -'********************************************************************************************************** -'***过程名:GethWndByClass() -'***功 能 :通过类名查找窗体 -'***输入值:(窗体类名 As String) -'***输出值:找到的窗体的句柄 As Long -'***说 明:用于获取窗体句柄 -'********************************************************************************************************** -Public Function GethWndByClass(ByVal Class As String) As Long - GethWndByClass = FindWindow(Class, vbNullString) -End Function -'********************************************************************************************************** -'***过程名:GethWndByClassEx() -'***功 能 :通过类名查找窗体 -'***输入值:(窗体类名 As String) -'***输出值:找到的窗体的句柄As Long -'***说 明:用于获取窗体句柄 -'********************************************************************************************************** -Public Function GethWndByClassEx(ByVal Class As String) - Dim hWnd As Long - Dim AllhWnd As String - hWnd = FindWindowEx(0, 0, Class, vbNullString) - Do While hWnd <> 0 - AllhWnd = hWnd & "|" & AllhWnd - hWnd = FindWindowEx(0, 0, Class, vbNullString) - Loop - GethWndByClassEx = Split(AllhWnd, "|") -End Function - -Public Function FindClassEx(ByVal hWnd As Long, ByVal Class As String) - FindClassEx = FindWindowEx(0, hWnd, Class, vbNullString) -End Function -'********************************************************************************************************** -'***过程名:GethWndByClassEx() -'***功 能 :窗口加载真彩图标 -'***输入值:(窗体句柄 As Long,图标句柄 As Long) -'***输出值:未知 -'***说 明:用于加载真彩图标 -'********************************************************************************************************** -'''===========================窗口加载真彩图标=========================== -Public Function RGBAIcon(ByVal hWnd As Long, ByVal hIcon As Long) As Long - RGBAIcon = SendMessage(hWnd, WM_SETICON, 0, hIcon) -End Function -'********************************************************************************************************** -'***过程名:Sleep() -'***功 能 :延时 -'***输入值:(延时大小 As Long[毫秒]) -'***输出值:Null -'***说 明:用于延时 -'********************************************************************************************************** -Public Sub Sleep(n As Long) - Savetime = timeGetTime - While timeGetTime < Savetime + n - DoEvents - Wend -End Sub -'#############################################控件函数模块################################################# - +Attribute VB_Name = "Frm_Tools" +'#######################################用户控件说明######################################### + +'名称:窗体控件 + +'功能:实现窗体透明,移动,靠边隐藏等功能 + +'最后更新日期:2014年6月5日 + +'创建人: 喵♂呜 + +'单位:上海市定海水电工程安装有限公司 + +''====================================用户控件使用说明======================================= +'窗体靠边自动隐藏:Auto_Hide(窗体句柄 As Long, 隐藏后显示部分长度 As Long, 检测间隔 As Long, [(可选)移动速度 As Long = 1]) +'窗体靠边自动吸附:Auto_Magnet(窗体名 As Form, 吸附距离 As Long,[可选,鼠标状态]) +'***************************************************************************************************************************** +'窗体大小延时处理:Daily_Show(窗体 As Form, 延时时间 As Long) +'窗体透明延时处理:Daily_Tpt(运行模式 As Boolean, 句柄 As Long, 透明度 As Integer, 延时时间 As Long) +'***************************************************************************************************************************** +'全屏窗口移动(通过窗体移动):fMove(窗体 As Form, Button As Integer, Shift As Integer, X As Single, Y As Single) +'全屏窗口移动(通过窗体句柄):hMove(窗体句柄 As Long) +'***************************************************************************************************************************** +'获取窗体类名:GetClassName(窗体句柄 As Long) As String +'***************************************************************************************************************************** +'获取激活窗体句柄: GetFedWnd() As Long +'激活窗体(通过窗体句柄):SetFedWnd(窗体句柄 As Long) +'***************************************************************************************************************************** +'获取原有窗体控件大小: GetFrmSize +'根据窗体大小调整控件大小: SetFrmSize +'***************************************************************************************************************************** +'通过类名标题查找窗体:GetWindowhWnd(窗体标题 As String,窗体类名 As String) As Long +'通过类名查找窗体:GethWndByClass(窗体类名 As String) As Long +'通过标题查找窗体:GethWndByTitle(窗体标题 As String) As Long +'获取窗体图标句柄:GetIconhWnd(窗体句柄 As Long) As Long +'获取鼠标所在窗体句柄: GetMouseWindowhWnd() As Long +'***************************************************************************************************************************** +'获取窗体标题(通过窗体句柄):GetTitle(窗体句柄 As Long) As String +'设置窗体标题(通过窗体句柄):SetTitle(窗体句柄 As Long, 窗体标题 As String) +'***************************************************************************************************************************** +'后台按下键:hWndKeyDown(窗体句柄 As Long, 按键码 As Long, [按键模式 As KeyPressMode = Normal]) +'后台按键:hWndKeyPress(窗体句柄 As Long, 按键码 As Long, [按键模式 As KeyPressMode = Normal]) +'后台释放键:hWndKeyUp(窗体句柄 As Long, 按键码 As Long, [按键模式 As KeyPressMode = Normal]) +'根据按键码返回按键信息:KeyNum2Key(按键码 As long) As String +'制作按键扫描码MakeKeyLparam:(按键码 As long,按键模式 As Long) As String +'***************************************************************************************************************************** +'窗体显示函数:InShow(窗体句柄 As Long, [显示模式 As Boolean = True](True是显示,False是隐藏)) +'窗口置顶函数:InTop(窗体句柄 As Long, [显示模式 As Boolean = True](True是置顶,False是不置顶)) +'***************************************************************************************************************************** +'使窗体不接受鼠标消息,可操作后面窗体:NoControl(句柄 As Long, [模式 As Boolean](Mode=Ture表示不接受,False表示接受)) +'***************************************************************************************************************************** +'窗口加载真彩图标:GethWndByClassEx(窗体句柄 As Long,图标句柄 As Long) +'***************************************************************************************************************************** +'延时:Sleep(延时大小 As Long[毫秒]) +'***************************************************************************************************************************** +'窗体透明:Tpt(窗体句柄 As Long, 透明度(0-100) As Integer, [需要透明的颜色 As Long]) +'#######################################用户控件说明######################################### + +Option Explicit +Public VisibleT As Boolean +''#########################################模块函数######################################## +'====================句柄后台按键======================= +Public Enum KeyPressMode + Normal + System + GameMode +End Enum + +Private Const WM_KEYDOWN As Long = &H100 +Private Const WM_KEYUP As Long = &H101 +Private Const WM_CHAR As Long = &H102 +Private Const WM_SYSKEYDOWN As Long = &H104 +Private Const WM_SYSKEYUP As Long = &H105 + +Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long +Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long +'====================获取鼠标所在窗体句柄======================= +Private Declare Function WindowFromPoint Lib "user32.dll" (ByVal xPoint As Long, ByVal yPoint As Long) As Long +''================================窗体消息发送========================================= +Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long +Private Const WM_SETICON As Long = &H80 +''================================窗体查找========================================= +Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long +Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long +''================================窗体激活========================================= +Private Declare Function GetForegroundWindow Lib "user32" () As Long +Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long +''================================窗体标题========================================= +Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String) As Long +Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long +Private Declare Function GetClassNameh Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long +Private Declare Function GetClassLong Lib "user32" Alias "GetClassLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long +''================================窗口操作函数========================================= +Private Declare Function SetWindowPos& Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) +Private Const FRM_TOP = -1 '置顶 +Private Const FRM_NORMAL = -2 '普通 +Private Const FRM_NOSIZE = &H1 '不改变大小 +Private Const FRM_NOMOVE = &H2 '不移动 +Private Const FRM_TOPMOST = &H3 '仅置顶 +Private Const FRM_NOZEROER = &H4 +Private Const FRM_NOREDRAW = &H8 '不重画窗体 +Private Const FRM_NOACTIVATE = &H10 '不激活窗体 +Private Const FRM_FRAMECHANGED = &H20 +Private Const FRM_SHOWWINDOW = &H40 '显示窗体 +Private Const FRM_HIDEWINDOW = &H80 '隐藏窗体 +Private Const FRM_NOCOPYBITS = &H100 +Private Const FRM_NOOWNERZORDER = &H200 +Private Const FRM_NOSENDCHANGING = &H400 +'========================全屏窗口移动============================ +Private Declare Function ReleaseCapture Lib "user32" () As Long +Private Const HTCAPTION = 2 +Private Const WM_NCLBUTTONDOWN = &HA1 +'''========================窗体靠边自动隐藏============================ +Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long +Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long +Private Type RECT '获取窗体位置 + Left As Long + Top As Long + Right As Long + Bottom As Long +End Type +Public Enum SetPos + SpTop + SPButton + SpLeft + SPRight +End Enum +Private Type POINTAPI '获取鼠标位置 + X As Long + Y As Long +End Type +Private IsInFrm As Boolean '检测窗体与鼠标状态。防止窗体闪烁 +Private Const HWND_TOPMOST = -1 '定义变量 +Private Const SWP_NOSIZE = &H1 +Private Const SWP_NOMOVE = &H2 +Private Const HWND_TOP = 0 +Private Const SWP_NOACTIVATE = &H10 +Private Const SWP_SHOWWINDOW = &H40 +Private Declare Function MoveWindow Lib "user32" (ByVal hWnd As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long +Private Declare Function IsIconic Lib "user32" (ByVal hWnd As Long) As Long +Private Declare Function IsZoomed Lib "user32" (ByVal hWnd As Long) As Long +Private Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Long +'''========================窗体透明============================ +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 WS_EX_TRANSPARENT = &H20& +Private Const WS_EX_TOPMOST = &H8 +Private Const GWL_EXSTYLE = (-20) +Private Const LWA_ALPHA = &H2 +Private Const LWA_COLORKEY = &H1 +'===================================圆角窗体==================================================== +Private Declare Function SetWindowRgn Lib "user32.dll" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long +Private Declare Function CreateRoundRectRgn Lib "gdi32.dll" (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 +Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long +'=================================Sleep======================================== +Private Declare Function timeGetTime Lib "winmm.dll" () As Long +Private Savetime As Double +''================================根据句柄获得PID========================================= +Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, ByRef lpdwprocessid As Long) As Long +''================================系统版本获取函数========================================= +Private Type OSVERSIONINFO + dwOSVersionInfoSize As Long + dwMajorVersion As Long + dwMinorVersion As Long + dwBuildNumber As Long + dwPlatformId As Long + szCSDVersion As String * 128 ' Maintenance string for PSS usage +End Type +Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long +Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long +Private Const SM_CLEANBOOT = 67 +Private Const SM_DEBUG = 22 +Private Const SM_SLOWMACHINE = 73 +Private Const VER_PLATFORM_WIN32s = 0 +Private Const VER_PLATFORM_WIN32_WINDOWS = 1 +Private Const VER_PLATFORM_WIN32_NT = 2 + +Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long +Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef saArray() As Any) As Long +Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal hIcon As Long) As Long +Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long +''#####################################################模块代码##################################################### + +'#############################################控件函数模块################################################# +'********************************************************************************************************** +'***过程名:SetWindowIcon +'***功 能 :改变窗体ICO图标 +'***输入值:(窗体句柄 As Long, [可选]图标文件 As String, [可选]图标位数 As Integer) +'***输出值:句柄所指向的PID +'***说 明:NULL +'********************************************************************************************************** +Public Sub SetWindowIcon(hWnd As Long, Optional FileName As String, Optional IconIndex As Integer) + Dim m_Icon As Long + Dim hModule As Long + If Len(FileName) = 0 Or Len(Dir(FileName, vbHidden)) = 0 Then + Dim MyPath As String + MyPath = App.Path + If Right(MyPath, 1) <> "\" Then MyPath = MyPath & "\" + FileName = MyPath & App.EXEName & ".exe" + End If + hModule = GetModuleHandle(FileName) + m_Icon = ExtractIcon(hModule, FileName, IconIndex) + SendMessage hWnd, WM_SETICON, 0, ByVal m_Icon +End Sub + +Public Function GetSystemVer() + Dim myVer As OSVERSIONINFO + Dim q As Long + myVer.dwOSVersionInfoSize = 148 '获取系统版本 + q& = GetVersionEx(myVer) + GetSystemVer = myVer.dwMajorVersion & "." & myVer.dwMinorVersion +End Function +'********************************************************************************************************** +'***过程名:SetRgnWindows +'***功 能 :改变窗体可视大小 +'***输入值:(窗体 As Form,边缘大小 As Long) +'***输出值:句柄所指向的PID +'***说 明:NULL +'********************************************************************************************************** +Public Function SetRgnWindows(Frm As Form, Rng As Long) As Long + Dim FRng As Long + Dim w As Long + Dim h As Long + w = Frm.ScaleX(Frm.Width, vbTwips, vbPixels) + h = Frm.ScaleY(Frm.Height, vbTwips, vbPixels) + FRng = CreateRectRgn(Rng, Rng, w - Rng, h - Rng) + SetRgnWindows = SetWindowRgn(Frm.hWnd, FRng, True) +End Function +'********************************************************************************************************** +'***过程名:SetRoundWindows +'***功 能 :改变窗体为圆角窗体 +'***输入值:(窗体 As Form,圆角大小 As Long) +'***输出值:句柄所指向的PID +'***说 明:NULL +'********************************************************************************************************** +Public Function SetRoundWindows(Frm As Form, Rng As Long) As Long + Dim FRng As Long + Dim w As Long + Dim h As Long + w = Frm.ScaleX(Frm.Width, vbTwips, vbPixels) + h = Frm.ScaleY(Frm.Height, vbTwips, vbPixels) + FRng = CreateRoundRectRgn(0, 0, w - 0, h - 0, Rng, Rng) + SetRoundWindows = SetWindowRgn(Frm.hWnd, FRng, True) +End Function +'********************************************************************************************************** +'***过程名:GetPidByhWnd +'***功 能 :根据句柄获得PID +'***输入值:(窗体句柄 As Long) +'***输出值:句柄所指向的PID +'***说 明:NULL +'********************************************************************************************************** +Public Function GetPidByhWnd(ByVal hWnd As Long) As Long + Dim PID As Long + GetWindowThreadProcessId hWnd, PID + GetPidByhWnd = PID +End Function +'********************************************************************************************************** +'***过程名:Tpt +'***功 能 :句柄窗体透明 +'***输入值:(窗体句柄 As Long, 透明度(0-100) As Integer, [需要透明的颜色 As Long = -1]) +'***输出值:NULL +'***说 明:窗体中用Me.hWnd代表窗体句柄 +'********************************************************************************************************** +Public Sub Tpt(ByVal hWnd As Long, ByVal Range As Integer, Optional ByVal TransColor As Long = -1) + If Range > 100 Then Range = 100 '如果透明度大于100则定义为100 + If Range < 0 Then Range = 0 '如果透明度小于0则定义为0 + Dim rtn As Long + rtn = GetWindowLong(hWnd, GWL_EXSTYLE) '取得窗体状态 + rtn = rtn Or WS_EX_LAYERED + SetWindowLong hWnd, GWL_EXSTYLE, rtn + If TransColor = -1 Then + SetLayeredWindowAttributes hWnd, 0, Range * 2.55, LWA_ALPHA '设置窗体透明度 + Else + SetLayeredWindowAttributes hWnd, TransColor, Range * 2.55, LWA_COLORKEY '根据颜色设置窗体透明度 + End If +End Sub +'********************************************************************************************************** +'***过程名:NoControl +'***功 能 :使窗体不接受鼠标消息,可操作后面窗体 +'***输入值:(句柄 As Long, [模式 As Boolean]) +'***输出值:NULL +'***说 明:窗体中用Me.hWnd代表窗体句柄,Mode=Ture表示不接受,False表示接受。 +'********************************************************************************************************** +Public Sub NoControl(ByVal hWnd As Long, Optional ByVal Mode As Boolean = True) + Dim rtn As Long + rtn = GetWindowLong(hWnd, GWL_EXSTYLE) '取得窗体状态 + rtn = rtn Or WS_EX_LAYERED + If Mode Then + rtn = rtn Or WS_EX_TRANSPARENT + Else + rtn = rtn And Not WS_EX_TRANSPARENT + End If + SetWindowLong hWnd, GWL_EXSTYLE, rtn +End Sub +'********************************************************************************************************** +'***过程名:Daily_Tpt +'***功 能 :窗体透明延时处理 +'***输入值:(运行模式 As Boolean, 句柄 As Long, 透明度 As Integer, 延时时间 As Long) +'***输出值:NULL +'***说 明:窗体中用Me.hWnd代表窗体句柄,Mode = True '显示窗体,Mode = False '隐藏窗体 +'********************************************************************************************************** +Public Sub Daily_Tpt(ByVal Mode As Boolean, ByVal hWnd As Long, ByVal Range As Integer, ByVal Daily As Long, Optional ByVal AddTpt As Long = 1) +'Mode = True '显示窗体 +'Mode = False '隐藏窗体 + If Daily > 5 Then Daily = 5 '防止参数过大,导致显示异常缓慢 + If Daily <= 0 Then Daily = 0.1 + Daily = Daily * 10 + Dim Tpti As Integer + If Mode = True Then + Do Until Tpti > Range + Tpti = Tpti + AddTpt + Sleep Daily + Tpt hWnd, Tpti + Loop + Else + Tpti = Range + Do Until Tpti < 0 + Tpti = Tpti - AddTpt + Sleep Daily + Tpt hWnd, Tpti + Loop + End If +End Sub +'********************************************************************************************************** +'***过程名:Daily_Show +'***功 能 :窗体大小延时处理 +'***输入值:(窗体 As Form, 延时时间 As Long) +'***输出值:NULL +'********************************************************************************************************** +Public Sub Daily_Show(ByVal Frm As Form, ByVal Daily As Long) + Dim h As Long + Dim w As Long + Dim i As Long + h = Frm.Height + w = Frm.Width + Frm.Height = 20 + Frm.Width = 20 + For i = 20 To w Step Daily + Sleep 10 + Frm.Width = i + Frm.Refresh + Next + For i = 20 To h Step Daily + Sleep 10 + Frm.Height = i + Frm.Refresh + Next +End Sub +'********************************************************************************************************** +'***过程名:InTop +'***功 能 :窗口置顶函数 +'***输入值:(窗体句柄 As Long, [显示模式 As Boolean = True](True是置顶,False是不置顶)) +'***输出值:NULL +'***说 明:窗体中用Me.hWnd代表窗体句柄 +'********************************************************************************************************** +Public Sub InTop(ByVal hWnd As Long, Optional ByVal Mode As Boolean = True) + If Mode Then + SetWindowPos hWnd, FRM_TOP, 0, 0, 0, 0, FRM_TOPMOST '置顶 + Else + SetWindowPos hWnd, FRM_NORMAL, 0, 0, 0, 0, FRM_TOPMOST '不置顶 + End If +End Sub +'********************************************************************************************************** +'***过程名:InShow +'***功 能 :窗体显示函数 +'***输入值:(窗体句柄 As Long, [显示模式 As Boolean = True](True是显示,False是隐藏)) +'***输出值:NULL +'***说 明:窗体中用Me.hWnd代表窗体句柄 +'********************************************************************************************************** +Public Sub InShow(ByVal hWnd As Long, Optional ByVal Mode As Boolean = True) + If Mode Then + SetWindowPos hWnd, 0, 0, 0, 0, 0, FRM_SHOWWINDOW Or FRM_TOPMOST '显示 + Else + SetWindowPos hWnd, 0, 0, 0, 0, 0, FRM_HIDEWINDOW Or FRM_TOPMOST '不显示 + End If +End Sub +'********************************************************************************************************** +'***过程名:Auto_Hide +'***功 能:窗体靠边自动隐藏 +'***输入值:(窗体句柄 As Long, 隐藏后显示部分长度 As Long, 检测间隔 As Long, [(可选)移动速度 As Long = 1]) +'***输出值:NULL +'***说 明:窗体句柄可用Me.hWnd +'********************************************************************************************************** +'Public Sub Auto_Hide(ByVal Enable As Boolean, Optional ByVal hWnd As Long, Optional ByVal Range As Long, Optional Daily As Long, Optional ByVal MoveInt As Long = 1) +' Tim.Enabled = Enable +' Tim.Interval = Daily +' Tim.Tag = hWnd & " " & Range & " " & MoveInt +'End Sub +' +'Private Sub Tim_Timer() +' Dim info +' info = Split(Tim.Tag) +' Auto_Hide_Load Val(info(0)), Val(info(1)), Val(info(2)) +'End Sub + +Private Sub Auto_Hide_Load(ByVal hWnd As Long, ByVal Range As Long, Optional ByVal MoveInt As Long) + Dim P As POINTAPI + Dim F As RECT + Dim T As Long + Dim WinHeight As Long + Dim WinWidth As Long + Dim ScrHeight As Long + Dim ScrWidth As Long + Dim IsTop As Long + IsTop = IsTopmost(hWnd) + GetCursorPos P '得到MOUSE位置 + GetWindowRect hWnd, F '得到窗体的位置 + WinWidth = F.Right - F.Left + WinHeight = F.Bottom - F.Top + ScrHeight = Screen.Height / 15 + ScrWidth = Screen.Width / 15 + If MoveInt <= 0 Then MoveInt = 0 + If IsZoomed(hWnd) = 0 And IsIconic(hWnd) = 0 Then + If P.X >= F.Left And P.X <= F.Right And P.Y >= F.Top And P.Y <= F.Bottom Then + If IsInFrm Then + SetWindowPos hWnd, FRM_TOP, 0, 0, 0, 0, FRM_TOPMOST + If F.Top <= 0 Then + T = F.Top + Do Until T >= 0 '从上显示窗体 + If MoveInt = 0 Then T = 0 Else T = T + MoveInt + If T > 0 Then T = 0 + SetWindowPos hWnd, 0, F.Left, T, 0, 0, FRM_NOSIZE + DoEvents + Loop + ElseIf F.Left <= 0 Then '从左显示窗体 + T = F.Left + Do Until T >= 0 + If MoveInt = 0 Then T = 0 Else T = T + MoveInt + If T > 0 Then T = 0 + SetWindowPos hWnd, 0, T, F.Top, 0, 0, FRM_NOSIZE + DoEvents + Loop + ElseIf F.Bottom >= ScrHeight Then '从下显示窗体 + T = F.Bottom + Do Until T <= ScrHeight + If MoveInt = 0 Then T = ScrHeight Else T = T - MoveInt + If T > ScrHeight Then T = ScrHeight + SetWindowPos hWnd, 0, F.Left, T - WinHeight, 0, 0, FRM_NOSIZE + DoEvents + Loop + ElseIf F.Right >= ScrWidth Then '从右显示窗体 + T = F.Right + Do Until T <= ScrWidth + If MoveInt = 0 Then T = ScrWidth Else T = T - MoveInt + If T > ScrWidth Then T = ScrWidth + SetWindowPos hWnd, 0, T - WinWidth, F.Top, 0, 0, FRM_NOSIZE + DoEvents + Loop + End If + IsInFrm = False + End If + Else + If Not IsInFrm Then + SetWindowPos hWnd, FRM_NORMAL, 0, 0, 0, 0, FRM_TOPMOST + If F.Top <= 5 Then + T = F.Top + Do Until T <= Range / 15 - WinHeight '从上隐藏窗体,range为露在外面长度 + If MoveInt = 0 Then T = Range / 15 - WinHeight Else T = T - MoveInt + If T < Range / 15 - WinHeight Then T = Range / 15 - WinHeight + SetWindowPos hWnd, 0, F.Left, T, 0, 0, FRM_NOSIZE + DoEvents + Loop + ElseIf F.Left <= 5 Then + T = F.Left + Do Until T <= Range / 15 - WinWidth '从左隐藏窗体 + If MoveInt = 0 Then T = Range / 15 - WinWidth Else T = T - MoveInt + If T < Range / 15 - WinWidth Then T = Range / 15 - WinWidth + SetWindowPos hWnd, 0, T, F.Top, 0, 0, FRM_NOSIZE + DoEvents + Loop + ElseIf F.Bottom >= ScrHeight - 5 Then '从下隐藏窗体 + T = F.Bottom - WinHeight + Do Until T >= ScrHeight - Range / 15 + If MoveInt = 0 Then T = ScrHeight - Range / 15 Else T = T + MoveInt + If T > ScrHeight - Range / 15 Then T = ScrHeight - Range / 15 + SetWindowPos hWnd, 0, F.Left, T, 0, 0, FRM_NOSIZE + DoEvents + Loop + ElseIf F.Right >= ScrWidth - 5 Then '从右隐藏窗体 + T = F.Right - WinWidth + Do Until T >= ScrWidth - Range / 15 + If MoveInt = 0 Then T = ScrWidth - Range / 15 Else T = T + MoveInt + If T > ScrWidth - Range / 15 Then T = ScrWidth - Range / 15 + SetWindowPos hWnd, 0, T, F.Top, 0, 0, FRM_NOSIZE + DoEvents + Loop + End If + IsInFrm = True + End If + End If + End If + If IsTop <> IsTopmost(hWnd) Then SetWindowPos hWnd, IsTop, 0, 0, 0, 0, FRM_TOPMOST +End Sub + +Public Function IsTopmost(hWnd As Long) As Long '判断窗口置顶函数 + Dim Ret As Long, t1 As Long + Ret = GetWindowLong(hWnd, GWL_EXSTYLE) + t1 = Ret Or WS_EX_TOPMOST + IsTopmost = IIF(Ret = t1, -1, -2) +End Function +'------------------------------------以下为老版本-------------------------------------------------------- +'********************************************************************************************************** +'***过程名:Auto_Hide +'***功 能:窗体靠边自动隐藏 +'***输入值:(窗体名 As Form, 计时器 As Timer, 隐藏后显示部分长度 As Long, 检测间隔 As Long) +'***输出值:NULL +'***说 明:请在窗体中计时器的Timer事件中调用(请手动设置Timer的延时数值) +'********************************************************************************************************** + +'Public Sub Auto_Hide(ByVal Frm As Form, ByVal Tmr As Timer, ByVal Range As Long, ByVal Daily As Long) +' Dim P As POINTAPI +' Dim f As RECT +' Tmr.Enabled = True +' Tmr.Interval = Daily +' GetCursorPos P '得到MOUSE位置 +' GetWindowRect Frm.hwnd, f '得到窗体的位置 +' If Frm.WindowState <> 1 Then +' If P.X >= f.Left And P.X <= f.Right And P.Y >= f.Top And P.Y <= f.Bottom Then +' 'MOUSE 在窗体上 +' If Not IsInFrm Then '如果鼠标之前不在窗体上则继续 +' If Frm.Top <= 0 Then +' Do Until Frm.Top >= 0 '从上显示窗体 +' Frm.Top = Frm.Top + 1 +' Loop +' ElseIf Frm.Left <= 0 Then '从左显示窗体 +' Do Until Frm.Left >= 0 +' Frm.Left = Frm.Left + 1 +' Loop +' ElseIf Frm.Top + Frm.Height >= Screen.Height Then '从下显示窗体 +' Do Until Frm.Top <= Screen.Height - Frm.Height +' Frm.Top = Frm.Top - 1 +' Loop +' ElseIf Frm.Left + Frm.Width >= Screen.Width Then '从右显示窗体 +' Do Until Frm.Left <= Screen.Width - Frm.Width +' Frm.Left = Frm.Left - 1 +' Loop +' End If +' IsInFrm = True +' End If +' Else +' If IsInFrm Then '如果鼠标之前在窗体上则继续 +' If Frm.Top <= 5 Then +' Do Until Frm.Top <= Range - Frm.Height '从上隐藏窗体,range为露在外面长度 +' Frm.Top = Frm.Top - 1 +' Loop +' ElseIf f.Left <= 5 Then +' Do Until Frm.Left <= Range - Frm.Width '从左隐藏窗体 +' Frm.Left = Frm.Left - 1 +' Loop +' ElseIf Frm.Top + Frm.Height >= Screen.Height - 5 Then '从下隐藏窗体 +' Do Until Frm.Top >= Screen.Height - Range +' Frm.Top = Frm.Top + 1 +' Loop +' ElseIf Frm.Left + Frm.Width >= Screen.Width - 5 Then '从右隐藏窗体 +' Do Until Frm.Left >= Screen.Width - Range +' Frm.Left = Frm.Left + 1 +' Loop +' End If +' IsInFrm = False +' End If +' End If +' End If +'End Sub + +'********************************************************************************************************** +'***过程名:Auto_Magnet +'***功 能 :窗体靠边自动吸附 +'***输入值:(窗体名 As Form, 吸附距离 As Long,[可选,鼠标状态]) +'***输出值:NULL +'***说 明:请在窗体的MouseMove事件中调用 +'********************************************************************************************************** +Public Sub Auto_Magnet(ByVal Frm As Form, ByVal Range As Long, Optional ByVal Button As Integer) 'range是吸附距离 + Dim P As POINTAPI + GetCursorPos P '得到MOUSE位置 + If Button = 1 Then '得到鼠标状态,如果是左键按下则检测鼠标是否在边缘 + If P.X = 0 Then Frm.Left = 0 '鼠标处于屏幕边缘则直接吸附 + If P.Y = 0 Then Frm.Top = 0 + If P.X = Screen.Width Then Frm.Left = Screen.Width - Frm.Width + If P.Y = Screen.Height Then Frm.Top = Screen.Height - Frm.Height + Else + '如果窗体离屏幕距离小于吸附距离则吸附且未到屏幕外,就吸附到屏幕比边缘。 + If Frm.Left < Range And Frm.Left > 0 Then + Frm.Left = 0 '向左吸附 + End If + If Frm.Top < Range And Frm.Top > 0 Then + Frm.Top = 0 '向上吸附 + End If + If Frm.Left + Frm.Width > Screen.Width - Range And Frm.Left + Frm.Width < Screen.Width Then + Frm.Left = Screen.Width - Frm.Width '向右吸附 + End If + If Frm.Top + Frm.Height > Screen.Height - Range And Frm.Top + Frm.Height < Screen.Height Then + Frm.Top = Screen.Height - Frm.Height '向下吸附 + End If + ReleaseCapture + End If +End Sub + +'********************************************************************************************************** +'***过程名:WindowKiss +'***功 能 :窗体紧贴(通过窗体句柄) +'***输入值:(被贴窗体句柄 As Long,贴上窗体句柄 As Long) +'***输出值:NULL +'***说 明: +'********************************************************************************************************** +'Public Sub WindowKiss(ByVal Enable As Boolean, Optional ByVal BhWnd As Long, Optional ByVal KhWnd As Long, Optional ByVal SetRect As SetPos, Optional ByVal IsIN As Long, Optional ByVal Daily As Long) +' Ktmr.Enabled = Enable +' Ktmr.Interval = Daily +' Ktmr.Tag = BhWnd & " " & KhWnd & " " & SetRect & " " & IsIN +'End Sub +' +'Private Sub Ktmr_Timer() +' On Error Resume Next +' Dim AWK() As String +' AWK = Split(Ktmr.Tag) +' AutoWindowKiss AWK(0), AWK(1), AWK(2), AWK(3) +'End Sub +Public Sub AutoWindowKiss(ByVal BhWnd As Long, ByVal KhWnd As Long, ByVal SetRect As SetPos, ByVal IsIN As Boolean, ByVal IsTop As Boolean) + Dim B As RECT + Dim k As RECT + Dim BH As Long + Dim BW As Long + Dim KH As Long + Dim KW As Long + Dim BHK As Long + Dim BWK As Long + Dim Frm_ST As Long + If IsTop Then Frm_ST = -1 Else Frm_ST = -2 + GetWindowRect BhWnd, B + GetWindowRect KhWnd, k + BH = B.Bottom - B.Top + BW = B.Right - B.Left + KH = k.Bottom - k.Top + KW = k.Right - k.Left + BHK = Abs(BH - KH) / 2 + BWK = Abs(BW - KW) / 2 + Select Case SetRect + Case SpTop + If IsIN Then + SetWindowPos KhWnd, Frm_ST, B.Left + BWK, B.Top, 0, 0, FRM_NOSIZE + Else + SetWindowPos KhWnd, Frm_ST, B.Left + BWK, B.Top - KH, 0, 0, FRM_NOSIZE + End If + Case SPButton + If IsIN Then + SetWindowPos KhWnd, Frm_ST, B.Left + BWK, B.Bottom - KH, 0, 0, FRM_NOSIZE + Else + SetWindowPos KhWnd, Frm_ST, B.Left + BWK, B.Bottom, 0, 0, FRM_NOSIZE + End If + Case SpLeft + If IsIN Then + SetWindowPos KhWnd, Frm_ST, B.Left, B.Top, 0, 0, FRM_NOSIZE + Else + SetWindowPos KhWnd, Frm_ST, B.Left - KW, B.Top, 0, 0, FRM_NOSIZE + End If + Case SPRight + If IsIN Then + SetWindowPos KhWnd, Frm_ST, B.Left - KW, B.Top, 0, 0, FRM_NOSIZE + Else + SetWindowPos KhWnd, Frm_ST, B.Left, B.Top, 0, 0, FRM_NOSIZE + End If + End Select + +End Sub + +'********************************************************************************************************** +'***过程名:hMove +'***功 能 :全屏窗口移动(通过窗体句柄) +'***输入值:(窗体句柄 As Long) +'***输出值:NULL +'***说 明:请在窗体的MouseDown事件中调用,窗体中用Me.hWnd代表窗体句柄 +'********************************************************************************************************** +Public Sub hMove(ByVal hWnd As Long) + ReleaseCapture '从当前线程中的窗口释放鼠标捕获,并恢复通常的鼠标输入处理。 + SendMessage hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0& '移动窗体 +End Sub +'********************************************************************************************************** +'***过程名:fMove +'***功 能 :全屏窗口移动(通过窗体移动) +'***输入值:(窗体 As Form, Button As Integer, Shift As Integer, X As Single, Y As Single) +'***输出值:NULL +'***说 明:请在窗体的MouseMove事件中调用,窗体中用Me代表窗体,剩下的直接用Button, Shift, X, Y +'********************************************************************************************************** +Public Sub fMove(Frm As Form, Button As Integer, Shift As Integer, X As Single, Y As Single) + On Error Resume Next + Static nX&, nY& + If Button = 1 Then + Frm.Move Frm.Left - nX + X, Frm.Top - nY + Y + Button = 0 + Else + nX = X + nY = Y + End If +End Sub +'********************************************************************************************************** +'***函数名:GetTitle +'***功 能 :获取窗体标题(通过窗体句柄) +'***输入值:(窗体句柄 As Long) +'***输出值:窗体标题 As String +'********************************************************************************************************** +Public Function GetTitle(ByVal hWnd As Long) As String '得到窗体标题 + Dim StrText As String * 256 '定义一个指针获得字符串 + Dim cch As Long '定义一个参数获取字符串长度 + cch = GetWindowText(hWnd, StrText, 256) '获取窗体标题 + GetTitle = Left(StrText, cch) '根据长度截取标题 +End Function +'********************************************************************************************************** +'***过程名:SetTitle +'***功 能 :设置窗体标题(通过窗体句柄) +'***输入值:(窗体句柄 As Long, 窗体标题 As String) +'***输出值:NULL +'********************************************************************************************************** +Public Sub SetTitle(ByVal hWnd As Long, ByVal TitleStr As String) '设置窗体标题 + SetWindowText hWnd, TitleStr '设置窗体标题 +End Sub +'********************************************************************************************************** +'***函数名:GetFedWnd +'***功 能 :获取激活窗体句柄 +'***输入值:NULL +'***输出值:当前激活窗体的句柄 As Long +'********************************************************************************************************** +Public Function GetFedWnd() As Long + GetFedWnd = GetForegroundWindow '得到当前窗体句柄 +End Function +'********************************************************************************************************** +'***过程名:SetFedWnd +'***功 能 :激活窗体(通过窗体句柄) +'***输入值:(窗体句柄 As Long) +'***输出值:NULL +'********************************************************************************************************** +Public Sub SetFedWnd(ByVal hWnd As Long) + SetForegroundWindow hWnd '设置句柄为激活窗体 +End Sub +'##########################################保持窗体控件原有大小比例############################################# +'********************************************************************************************************** +'***过程名:GetFrmSize +'***功 能 :获取原有窗体控件大小 +'***输入值:Null +'***输出值:NULL +'***说 明:请在窗体的Load事件中调用,并且控件需在窗体上 +'********************************************************************************************************** +Public Sub GetFrmSize(FormName As Form) + On Error Resume Next + Dim obj As Control '定义一个控件数组 + FormName.ScaleWidth = 1000 '设置窗体水平度量单位数 + FormName.ScaleHeight = 1000 '设置窗体垂直度量单位数 + For Each obj In FormName '遍历所有控件 + obj.Tag = Str(obj.Left) & Str(obj.Top) & Str(obj.Width) & Str(obj.Height) '存储空间度量位置到Tag + Next obj + On Error GoTo 0 +End Sub +'********************************************************************************************************** +'***过程名:SetFrmSize +'***功 能 :根据窗体大小调整控件大小 +'***输入值:Null +'***输出值:NULL +'***说 明:请在窗体的Resize事件中调用,并且控件需在窗体上 +'********************************************************************************************************** +Public Sub SetFrmSize(FormName As Form) 'Optional FormName As Form = UserControl.Parent) + On Error Resume Next + Dim Pos() As String + Dim obj As Control + FormName.ScaleWidth = 1000 '设置窗体水平度量单位数 + FormName.ScaleHeight = 1000 '设置窗体垂直度量单位数 + For Each obj In FormName '遍历所有控件 + Pos = Split(obj.Tag) ' + obj.Left = Val(Pos(1)) '调整 + obj.Top = Val(Pos(2)) '控件 + obj.Width = Val(Pos(3)) '位置 + obj.Height = Val(Pos(4)) '大小 + Next obj + On Error GoTo 0 +End Sub +'##########################################保持窗体控件原有大小比例############################################# + +'##########################################窗口句柄后台按键############################################# +'********************************************************************************************************** +'***过程名:KeyNum2Key +'***功 能 :根据按键码返回按键信息 +'***输入值:(按键码 As long) +'***输出值:按键信息 As String +'***说 明: +'********************************************************************************************************** +Public Function KeyNum2Key(ByVal KeyNum As Long) As String +'Debug.Print KeyNum + Select Case KeyNum + Case vbKeyLButton: KeyNum2Key = "鼠标左键" + Case vbKeyRButton: KeyNum2Key = "鼠标右键" + Case vbKeyCancel: KeyNum2Key = "CANCEL" + Case vbKeyMButton: KeyNum2Key = "鼠标中键" + Case 5: KeyNum2Key = "鼠标扩展键1" + Case 6: KeyNum2Key = "鼠标扩展键2" + Case vbKeyBack: KeyNum2Key = "退格键" '"BACKSPACE" + Case vbKeyTab: KeyNum2Key = "TAB" + Case vbKeyClear: KeyNum2Key = "CLEAR" + Case vbKeyReturn: KeyNum2Key = "ENTER" + Case vbKeyShift: KeyNum2Key = "SHIFT" + Case vbKeyControl: KeyNum2Key = "CTRL" + Case vbKeyMenu: KeyNum2Key = "MENU" + Case vbKeyPause: KeyNum2Key = "PAUSE" + Case vbKeyCapital: KeyNum2Key = "CAPS LOCK" + Case vbKeyEscape: KeyNum2Key = "ESC" + Case vbKeySpace: KeyNum2Key = "SPACEBAR" + Case vbKeyPageUp: KeyNum2Key = "PAGE UP" + Case vbKeyPageDown: KeyNum2Key = "PAGE DN" + Case vbKeyEnd: KeyNum2Key = "END" + Case vbKeyHome: KeyNum2Key = "HOME" + Case vbKeyLeft: KeyNum2Key = "←" '"LEFT ARROW" + Case vbKeyUp: KeyNum2Key = "↑" '"UP ARROW" + Case vbKeyRight: KeyNum2Key = "→" '"RIGHT ARROW" + Case vbKeyDown: KeyNum2Key = "↓" '"DOWN ARROW" + Case vbKeySelect: KeyNum2Key = "SELECT" + Case vbKeyPrint: KeyNum2Key = "PRINT SCREEN" + Case vbKeyExecute: KeyNum2Key = "EXECUTE" + Case vbKeySnapshot: KeyNum2Key = "SNAPSHOT" + Case vbKeyDelete: KeyNum2Key = "DELETE" + Case vbKeyHelp: KeyNum2Key = "HELP" + Case vbKeyNumlock: KeyNum2Key = "NUM LOCK" + Case vbKeyNumpad0: KeyNum2Key = "Num 0" + Case vbKeyNumpad1: KeyNum2Key = "Num 1" + Case vbKeyNumpad2: KeyNum2Key = "Num 2" + Case vbKeyNumpad3: KeyNum2Key = "Num 3" + Case vbKeyNumpad4: KeyNum2Key = "Num 4" + Case vbKeyNumpad5: KeyNum2Key = "Num 5" + Case vbKeyNumpad6: KeyNum2Key = "Num 6" + Case vbKeyNumpad7: KeyNum2Key = "Num 7" + Case vbKeyNumpad8: KeyNum2Key = "Num 8" + Case vbKeyNumpad9: KeyNum2Key = "Num 9" + Case vbKeyMultiply: KeyNum2Key = "MULTIPLICATIONSIGN(*)" + Case vbKeyAdd: KeyNum2Key = "PLUSSIGN(+)" + Case vbKeySeparator: KeyNum2Key = "ENTER" + Case vbKeySubtract: KeyNum2Key = "MINUSSIGN(-)" + Case vbKeyDecimal: KeyNum2Key = "DECIMALPOINT(.)" + Case vbKeyDivide: KeyNum2Key = "DIVISIONSIGN(/)" + Case vbKeyF1: KeyNum2Key = "F1" + Case vbKeyF2: KeyNum2Key = "F2" + Case vbKeyF3: KeyNum2Key = "F3" + Case vbKeyF4: KeyNum2Key = "F4" + Case vbKeyF5: KeyNum2Key = "F5" + Case vbKeyF6: KeyNum2Key = "F6" + Case vbKeyF7: KeyNum2Key = "F7" + Case vbKeyF8: KeyNum2Key = "F8" + Case vbKeyF9: KeyNum2Key = "F9" + Case vbKeyF10: KeyNum2Key = "F10" + Case vbKeyF11: KeyNum2Key = "F11" + Case vbKeyF12: KeyNum2Key = "F12" + Case 91: KeyNum2Key = "Win" + Case 93: KeyNum2Key = "Menu" + Case 160: KeyNum2Key = "左SHIFT" + Case 161: KeyNum2Key = "右SHIFT" + Case 162: KeyNum2Key = "左CTRL" + Case 163: KeyNum2Key = "右CTRL" + Case 164: KeyNum2Key = "左AIT" + Case 165: KeyNum2Key = "右AIT" + + Case 186: KeyNum2Key = ";" + Case 187: KeyNum2Key = "=" + Case 188: KeyNum2Key = "," + Case 189: KeyNum2Key = "-" + Case 190: KeyNum2Key = "." + Case 191: KeyNum2Key = "/" + Case 192: KeyNum2Key = "~" + + Case 219: KeyNum2Key = "[" + Case 220: KeyNum2Key = "\" + Case 221: KeyNum2Key = "]" + Case 222: KeyNum2Key = "'" + Case Else: KeyNum2Key = Chr(KeyNum) + End Select +End Function +'********************************************************************************************************** +'***过程名:MakeKeyLparam +'***功 能 :制作按键扫描码 +'***输入值:(按键码 As long,按键模式 As Long) +'***输出值:按键扫描码 As String +'***说 明:用于游戏中的扫描码,不然有些游戏窗体收不到消息 +'********************************************************************************************************** +Private Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long + Dim S As String + Dim Firstbyte As String 'lparam参数的24-31位 + If flag = WM_KEYDOWN Then '如果是按下键 + Firstbyte = "00" + Else + Firstbyte = "C0" '如果是释放键 + End If + Dim Scancode As Long + '获得键的扫描码 + + 'Debug.Print "========" & VirtualKey & "=========" + Scancode = MapVirtualKey(VirtualKey, 0) + 'Debug.Print Scancode + Dim Secondbyte As String 'lparam参数的16-23位,即虚拟键扫描码 + Secondbyte = Right("00" & Hex(Scancode), 2) + 'Debug.Print Secondbyte + S = Firstbyte & Secondbyte & "0001" '0001为lparam参数的0-15位,即发送次数和其它扩展信息 + 'Debug.Print "&H" & s + MakeKeyLparam = Val("&H" & S) +End Function +'********************************************************************************************************** +'***过程名:hWndKeyDown +'***功 能 :后台按下键 +'***输入值:(窗体句柄 As Long, 按键码 As Long, [按键模式 As KeyPressMode = Normal]) +'***输出值:Null +'***说 明:用于后台按下按键 +'********************************************************************************************************** +Public Sub hWndKeyDown(ByVal hWnd As Long, ByVal KeyCode As Long, Optional ByVal PressKeyMode As KeyPressMode = Normal) + Select Case PressKeyMode + Case Normal + PostMessage hWnd, WM_KEYDOWN, KeyCode, 0 '释放A键 + Case System + PostMessage hWnd, WM_KEYDOWN, KeyCode, 0 '按下A键 + Case GameMode + PostMessage hWnd, WM_KEYDOWN, KeyCode, MakeKeyLparam(KeyCode, WM_KEYDOWN) '按下A键 + End Select +End Sub +'********************************************************************************************************** +'***过程名:hWndKeyUp +'***功 能 :后台释放键 +'***输入值:(窗体句柄 As Long, 按键码 As Long, [按键模式 As KeyPressMode = Normal]) +'***输出值:Null +'***说 明:用于后台释放按键 +'********************************************************************************************************** +Public Sub hWndKeyUp(ByVal hWnd As Long, ByVal KeyCode As Long, Optional ByVal PressKeyMode As KeyPressMode = Normal) + Select Case PressKeyMode + Case Normal + PostMessage hWnd, WM_KEYUP, KeyCode, 0 '释放A键 + Case System + PostMessage hWnd, WM_KEYUP, KeyCode, 0 '释放A键 + Case GameMode + PostMessage hWnd, WM_KEYUP, KeyCode, MakeKeyLparam(KeyCode, WM_KEYUP) '释放A键 + End Select +End Sub +'********************************************************************************************************** +'***过程名:hWndKeyPress +'***功 能 :后台按键 +'***输入值:(窗体句柄 As Long, 按键码 As Long, [按键模式 As KeyPressMode = Normal]) +'***输出值:Null +'***说 明:用于后台按键 +'********************************************************************************************************** +Public Sub hWndKeyPress(ByVal hWnd As Long, ByVal KeyCode As Long, Optional ByVal PressKeyMode As KeyPressMode = Normal) + Select Case PressKeyMode + Case Normal + PostMessage hWnd, WM_CHAR, KeyCode, 0 '按A键 + Case System + PostMessage hWnd, WM_KEYDOWN, KeyCode, 0 + PostMessage hWnd, WM_KEYUP, KeyCode, 0 + Case GameMode + PostMessage hWnd, WM_KEYDOWN, KeyCode, MakeKeyLparam(KeyCode, WM_KEYDOWN) + PostMessage hWnd, WM_KEYUP, KeyCode, MakeKeyLparam(KeyCode, WM_KEYUP) + End Select +End Sub +'##########################################窗口句柄后台按键############################################# +'********************************************************************************************************** +'***过程名:GetMouseWindowhWnd() +'***功 能 :获取鼠标所在窗体句柄 +'***输入值:Null +'***输出值:窗体句柄 As Long +'***说 明:用于获取窗体句柄 +'********************************************************************************************************** +Public Function GetMouseWindowhWnd() As Long + Dim Point As POINTAPI + GetCursorPos Point + GetMouseWindowhWnd = WindowFromPoint(Point.X, Point.Y) +End Function +'********************************************************************************************************** +'***过程名:GetClassName() +'***功 能 :获取窗体类名 +'***输入值:(窗体句柄 As Long) +'***输出值:窗体类名 As String +'***说 明:用于获取窗体类名 +'********************************************************************************************************** +Public Function GetClassName(ByVal hWnd As Long) As String + Dim StrText As String * 256 + Dim cch As Long + cch = GetClassNameh(hWnd, StrText, 256) + GetClassName = Left(StrText, cch) +End Function +'********************************************************************************************************** +'***过程名:GetIconhWnd() +'***功 能 :获取窗体图标句柄 +'***输入值:窗体句柄 As Long +'***输出值:窗体图标句柄 As Long +'***说 明:用于获取窗体图标句柄 +'********************************************************************************************************** +Public Function GetIconhWnd(ByVal hWnd As Long) As Long + GetIconhWnd = GetClassLong(hWnd, -14) +End Function +'********************************************************************************************************** +'***过程名:GetWindowhWnd() +'***功 能 :通过类名标题查找窗体 +'***输入值:(窗体标题 As String,窗体类名 As String) +'***输出值:找到的窗体的句柄 As Long +'***说 明:用于获取窗体句柄 +'********************************************************************************************************** +Public Function GetWindowhWnd(ByVal Title As String, ByVal Class As String) As Long + GetWindowhWnd = FindWindow(Class, Title) +End Function +'********************************************************************************************************** +'***过程名:GethWndByTitle() +'***功 能 :通过标题查找窗体 +'***输入值:(窗体标题 As String) +'***输出值:找到的窗体的句柄 As Long +'***说 明:用于获取窗体句柄 +'********************************************************************************************************** +Public Function GethWndByTitle(ByVal Title As String) As Long + GethWndByTitle = FindWindow(vbNullString, Title) +End Function +'********************************************************************************************************** +'***过程名:GethWndByTitleEx() +'***功 能 :通过标题查找窗体 +'***输入值:(窗体标题 As String) +'***输出值:找到的窗体的句柄As Long +'***说 明:用于获取窗体句柄 +'********************************************************************************************************** +'Public Function GethWndByTitleEx(ByVal Title As String) As Long +' GethWndByTitleEx = FindWindowEx(0, 0, vbNullString, Title) +'End Function +'********************************************************************************************************** +'***过程名:GethWndByClass() +'***功 能 :通过类名查找窗体 +'***输入值:(窗体类名 As String) +'***输出值:找到的窗体的句柄 As Long +'***说 明:用于获取窗体句柄 +'********************************************************************************************************** +Public Function GethWndByClass(ByVal Class As String) As Long + GethWndByClass = FindWindow(Class, vbNullString) +End Function +'********************************************************************************************************** +'***过程名:GethWndByClassEx() +'***功 能 :通过类名查找窗体 +'***输入值:(窗体类名 As String) +'***输出值:找到的窗体的句柄As Long +'***说 明:用于获取窗体句柄 +'********************************************************************************************************** +Public Function GethWndByClassEx(ByVal Class As String) + Dim hWnd As Long + Dim AllhWnd As String + hWnd = FindWindowEx(0, 0, Class, vbNullString) + Do While hWnd <> 0 + AllhWnd = hWnd & "|" & AllhWnd + hWnd = FindWindowEx(0, 0, Class, vbNullString) + Loop + GethWndByClassEx = Split(AllhWnd, "|") +End Function + +Public Function FindClassEx(ByVal hWnd As Long, ByVal Class As String) + FindClassEx = FindWindowEx(0, hWnd, Class, vbNullString) +End Function +'********************************************************************************************************** +'***过程名:GethWndByClassEx() +'***功 能 :窗口加载真彩图标 +'***输入值:(窗体句柄 As Long,图标句柄 As Long) +'***输出值:未知 +'***说 明:用于加载真彩图标 +'********************************************************************************************************** +'''===========================窗口加载真彩图标=========================== +Public Function RGBAIcon(ByVal hWnd As Long, ByVal hIcon As Long) As Long + RGBAIcon = SendMessage(hWnd, WM_SETICON, 0, hIcon) +End Function +'********************************************************************************************************** +'***过程名:Sleep() +'***功 能 :延时 +'***输入值:(延时大小 As Long[毫秒]) +'***输出值:Null +'***说 明:用于延时 +'********************************************************************************************************** +Public Sub Sleep(n As Long) + Savetime = timeGetTime + While timeGetTime < Savetime + n + DoEvents + Wend +End Sub +'#############################################控件函数模块################################################# +