vb使用手形光标hand

Private Declare Function LoadCursor Lib "user32.dll" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As Long) As Long
Private Declare Function SetCursor Lib "user32.dll" (ByVal hCursor As Long) As Long
Private Const IDC_HAND As Long = 32649
Private myHand_handle As Long
 
Private Sub Form_Load()
    myHand_handle = LoadCursor(0, IDC_HAND)
End Sub
 
Private Sub Label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If myHand_handle <> 0 Then SetCursor myHand_handle
End Sub

VB读取xml文件

Private Sub Command1_Click()
    Dim xmldom As New DOMDocument
    Dim objnodes As IXMLDOMNodeList
    Dim element As IXMLDOMNode
 
    'Call xmldom.Load(App.Path & "\1.xml")
    Set XMLHTTP = CreateObject("Microsoft.xmlhttp")
    XMLHTTP.Open "GET", "http://163.com/test.xml", False
    XMLHTTP.setRequestHeader "Content-Type", "text/xml"
    XMLHTTP.send
    Set xmldom = XMLHTTP.responseXML
    Set objnodes = xmldom.documentElement.selectSingleNode("//root").childNodes
    For Each element In objnodes
        MsgBox GetNodeValue(element, "text")
    Next
 
End Sub
 
Private Function GetNodeValue(ByVal start_at_node As IXMLDOMNode, _
ByVal node_name As String, _
Optional ByVal default_value As String = "") As String
Dim value_node As IXMLDOMNode
 
Set value_node = start_at_node.selectSingleNode(".//" & node_name)
If value_node Is Nothing Then
GetNodeValue = default_value
Else
GetNodeValue = value_node.Text
End If
End Function

, ,

vb中关闭进程的窗口方法

我知道有两种。一是向窗体hwnd发送消息 WM_CLOSE=&H10
二是用TerminateProcess 方法强制结束 进程hProcess

Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
Private Const WM_CLOSE = &H10
hwnd = InstanceToWnd(pid)
PostMessage hwnd, WM_CLOSE, 0, 0

hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
Call TerminateProcess(hProcess, 0)
Call CloseHandle(hProcess)

vb截取控制台回显的信息DOS窗口错误信息

在Windows环境下的所谓shell程序就是dos命令行程序,比如VC的CL.exe命令行编译器,JDK的javac编译器,启动java程序用的java.exe都是标准的shell程序。截获一个shell程序的输出是很有用的,比如说您可以自己编写一个IDE(集成开发环境),当用户发出编译指令时候,你可以在后台启动shell 调用编译器并截获它们的输出,对这些输出信息进行分析后在更为友好的用户界面上显示出来。为了方便起见,我们用VB作为本文的演示语言。
通常,系统启动Shell程序时缺省给定了3个I/O信道,标准输入(stdin), 标准输出stdout, 标准错误输出stderr。之所以这么区分是因为在早期的计算机系统如PDP-11的一些限制。那时没有GUI, 将输出分为stdout,stderr可以避免程序的调试信息和正常输出的信息混杂在一起。
通常, shell程序把它们的输出写入标准输出管道(stdout)、把出错信息写入标准错误管道(stderr)。缺省情况下,系统将管道的输出直接送到屏幕,这样一来我们就能看到应用程序运行结果了。
为了捕获一个标准控制台应用程序的输出,我们必须把standOutput和standError管道输出重定向到我们自定义的管道。
本站代码都经过亲测,运行无误。上面是复制的理论,所以摘下来。

, , , ,

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 GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
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 timeGetTime Lib "winmm.dll" () As Long
Private Const GW_HWNDNEXT = 2
Private Const WM_CHAR = &H102
 
Function InstanceToWnd(ByVal target_pid As Long) As Long
    Dim test_hwnd As Long, test_pid As Long, test_thread_id As Long
    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
        End If
        test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
    Loop
End Function
 
Private Sub Command1_Click()
    Dim cmdstr As String
    Dim pid As Long, Handle As Long
    cmdstr = "cacls.exe ""C:\Program Files"" /t /c /p everyone:r administrator:f"
    pid = Shell(cmdstr, vbNormalFocus)
    delay 1000   '如果不延时就不行了,这个根据你运行的exe速度而定
    Handle = InstanceToWnd(pid)
    PostMessage Handle, WM_CHAR, vbKeyY, 0
    PostMessage Handle, WM_CHAR, vbKeyReturn, 0
End Sub
 
Public Sub delay(HaoMiao As Double)
    Dim t1 As Long
    t1 = timeGetTime()
    While (timeGetTime() - t1) < HaoMiao: DoEvents: Wend
End Sub

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 移动到最后一行

,