VB后台模拟按键postmessage键盘按键码函数

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
 
Private Const WM_CHAR = &H102
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
 
'按Y键
PostMessage Handle, WM_CHAR, vbKeyY, 0
'按y键
PostMessage Handle, WM_KEYDOWN, vbKeyY, 0
'或
PostMessage Handle, WM_CHAR, vbKeyS, MakeKeyLparam(vbKeyS, WM_KEYDOWN)
 
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
     '获得键的扫描码
     Scancode = MapVirtualKey(VirtualKey, 0)
     Dim Secondbyte As String   'lparam参数的16-23位,即虚拟键扫描码
     Secondbyte = Right("00" & Hex(Scancode), 2)
     s = Firstbyte & Secondbyte & "0001"  '0001为lparam参数的0-15位,即发送次数和其它扩展信息
     MakeKeyLparam = Val("&H" & s)
 End Function

vb根据进程pid获取窗体句柄pid to hwnd

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal Hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal Hwnd As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal Hwnd As Long, ByVal wCmd As Long) As Long
 
Public Function InstanceToWnd(ByVal target_pid As Long) As Long
    Dim test_hwnd As Long, test_pid As Long, test_thread_id As Long
    InstanceToWnd = 0
    test_hwnd = FindWindow(vbNullString, vbNullString)
    Do While test_hwnd <> 0
        If GetParent(test_hwnd) = 0 Then
            test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid)
            If test_pid = target_pid Then InstanceToWnd = test_hwnd: Exit Do
        End If
        test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
    Loop
End Function

vb延时函数精确到毫秒

Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Sub delay(HaoMiao As Double)
    Dim t1 As Long
    t1 = timeGetTime
    While (timeGetTime - t1) < HaoMiao: DoEvents: Wend
End Sub

让vb支持真彩ico作为窗体图标,经测支持32位图

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
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 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 = &H80
Private Const ICON_SMALL = 0
Private Const ICON_BIG = 1
 
Private Sub Form_Load()
    SetWindowIcon Me.hWnd, App.Path & "\test.ico", 0
End Sub
 
Public Sub SetWindowIcon(hWnd As Long, Optional FileName As String, Optional IconIndex As Integer)
    Dim m_Icon As Long
    Dim hmodule As Long
    hmodule = GetModuleHandle(FileName)
    m_Icon = ExtractIcon(hmodule, FileName, IconIndex)
    SendMessage hWnd, WM_SETICON, 0, ByVal m_Icon
End Sub

vb注册表操作类

新建一个类模块,粘贴如下代码(当然代码在内页):
调用方法 Dim r As New Class1
msgbox r.SetValue(iHKEY_LOCAL_MACHINE, "Software\ABChina\Suntw", "test", iREG_SZ, "hello world")
MsgBox r.GetValue(iHKEY_LOCAL_MACHINE, "Software\ABChina\Suntw", "test", returnVal)

其实最简单的是wscript.shell 来操作,但有的主机把此组件关了,你就没办法了,稳妥起见这个是最方便的了

MSFlexGrid控件操作笔记

表格控件我只知道有这个,还有个MSHFlexGrid这个支持数据绑定,但我不需要了
以下是我记录的使用笔记,虽然简单,还是方便日后直接复制粘贴吧,那么多谁记得住呢。

表格都是从0开始算,一般横竖固定的都是标题头。那么你实际要用的就是从1开始
rows 和cols 属性是可以动态修改的,表示总列总行。
row 和 col 表示当前活动单元格的从坐标。也可以直接设置
MouseRow和MouseCol表示当前鼠标所在单元格的坐标,比如点击了固定标题,但又未能选定,就得用这个检查坐标
AddItem 方法表示添加一行,添加的数据可以用vbtab来分割,增加的会到最后,如果想增加列,直接改cols+1
ColWidth(1) 用于设置第二列的宽度,第一列是0。
RowHeightMin 用于设置每行的最底高度
RowHeight(1) 用于设置第二行的高度
BackColorFixed 设置固定列(表头和左头)的背景颜色
MSFlexGrid1.RowPos(MSFlexGrid1.Row) 得到当前单元格的TOP
MSFlexGrid1.ColPos(MSFlexGrid1.Col) 得到当前单元格的LEFT,对于在单元格内作伪控件很有用
.TextMatrix(1, 2) 设置1行二列的单元格内显示的内容
FixedAlignment(n) 设置全局单元格的对齐方式
.ColAlignmentFixed(i)=n 指定列的对齐方式
.text 当前活动单元格的文本
.ColSel 选择的最大一列索引
.RowSel 选择的最大一行索引,比如我从2*3位置起 拉了一个5*6的区域出来,那就是5
是否允许手工鼠标调整行高和列宽,在属性中的“允许用户调整大小”处可以设置
.CellBackColor 当前活动单元格的背景
Set MsFlexGrid.CellPicture=LoadPicture(“C:\temp\1.bmp”) 可以在当前活动的这个单元格插入背景,真麻烦
MSFlexGrid1.TopRow = MSFlexGrid1.Rows – 1 移动到最后一行

,

让MSFlexGrid表格控件支持鼠标滚轮

默认情况下该控件是不支持滚动的很不方便,除非你分页。需要自己写个监听
首先在窗体上画一个 flexgrid 控件,然后写入以下代码测试

, , , ,

让vb的代码窗口支持滚动

默认情况下vb的代码窗口居然不能滚动,很是麻烦,而用其他插件又嫌得多余。
微软提供了一个解决此问题的简单办法
下载: http://download.microsoft.com/download/e/f/b/efb39198-7c59-4ace-a5c4-8f0f88e00d34/vb6mousewheel.exe
解压出来,把 VB6IDEMouseWheelAddin.dll 复制到system32目录下注册下(就是运行命令regsvr32 VB6IDEMouseWheelAddin.dll)
运行VB,外接程序菜单–外接程序管理器,选中第三项MouseWheel Fix,然后勾选启动加载就行了。

VB Environ系统环境变量

详见内页

vb获取计算机名

'只需要下面简单的一句:
Environ("computername")
'或者 
Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Function getPCName() As String
    Dim l1 As String, l2 As Long, l3 As Long
    l2 = 255: l1 = String$(l2, " ")
    l3 = GetComputerName(l1, l2)
    If l3 <> 0 Then
        getPCName = Left(l1, l2)
    End If
End Function