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