301、如何使用 VB 撰写自动解除安装的程序? 302、如何叫用系统的【查找】、【替换】的问话框? 303、如何隐藏及显示桌面上的图标? 304、如何让数字正确的在 ListBox 及 ComboBox 中排序? 305、如何从 Internet 上抓回某一个网页的内容?
301、如何使用 VB
撰写自动解除安装的程序?
一般软件在安装后,都会在【开始】菜单的【程序】中建立一个群组(Group),并且在群组中建立一些执行程序的快捷方式,而在这些快捷方式中通常都会含有一个自动解除安装的快捷方式。
所以,如果您安装了某一个软件之后,想要解除安装,您有二个方法: 1、开启【控制面板】中的【添加/删除程序】,选择该项软件来解除安装。 2、选择【开始】【程序】中该系统所产生的群组中的解除安装的快捷方式来解除安装。
上面的第一种方法,您不需要作任何处理,一般软件在安装完后,都会在【控制面板】中的【添加/删除程序】多一个该软件的选项。而第二种方法,就必须要我们写程序来解决了!
假设,今天我们写了一支程序叫
Test,当您完成 Test.exe 之后,您必须再多写一支自动解除安装的程序,我们将文件名称设为
unTest.exe(先不要管如何写,后面会说明)。二支程序都完成后,您使用 VB 提供的应用程序安装精灵 (Application Setup
Wizard) 来制作安装程序时,必须额外再加入 unTest.exe!
加入 unTest.exe
之后,使用者安装后,安装程序并不会在【开始】【程序集】中该系统所产生的群组【Test】中加入这个自动解除安装程序 unTest.exe
的快捷方式,安装程序只会将 unTest.exe 连同 Test.exe 一起复制到应用程序的目录中而已!所以如果您想产生 unTest.exe
的快捷方式,您可能需要稍微修改一下 VB 提供的应用程序安装精灵程序!
以下我们就实际来看看 unTest.exe
程序如何写:
在 VB 中建立一个新工程,取名为 unTest.vbp,表单为
unTest.frm,不需要任何控制项,在表单中加入以下程序码:
Private Declare Function
GetWindowsDirectory Lib "kernel32" _ Alias "GetWindowsDirectoryA"
_ (ByVal lpBuffer As String, ByVal nSize As Long) As
Long
Private Sub Form_Load() On Error Goto BaddUn Dim
X& Dim buffer As String * 128 Dim UnStr As String Dim size As
Integer Dim retval As Integer buffer = Space$(128) size =
128 retval = GetWindowsDirectory(ByVal buffer, ByVal
size) Me.Caption = buffer '以下的程序码必须写在同一行中
(如果在浏览器中有换行的话) '''''''''''''''''''''''''''''''''''''''' UnStr =
Me.Caption & "\ST5UNST.EXE -n " & Chr(34) & App.Path &
"\ST5UNST.LOG" &
Chr(34) '''''''''''''''''''''''''''''''''''''''' 'MsgBox UnStr
'可显示可不显示, 只是测试用 'X& = Shell("C:\WINDOWS\ST5UNST.EXE -n " '
"C:\Program Files\App Name\ST5UNST.LOG"" ' ", vbNormalFocus) X&
= Shell(UnStr, vbNormalFocus) Unload Me Exit
Sub BaddUn: MsgBox "for some reason UnInstall can not run." Exit
Sub End Sub
由以上的程序码中,您是否发现, unTest.exe 必须和 St5unst.log
放在同一个目录中,不过这只要和上面的程序一样使用 App.Path 就可以解决了!
注:这个范例是使用 VB5
来做测试的,如果是其他版本的 VB,ST5UNST.LOG 文件名可能必须改变!
302、如何叫用系统的【查找】、【替换】的问话框?
在一般的文书编辑软件中,例如 Windows
本身提供的记事本及小作家中,我们都可以在【编辑】下拉选单中,找到【查找】、【替换】二项功能,我想很多人自己在撰写编辑程序时,也都会自己写程序去模拟这二个相当基本的功能。其实根本不用您自己花时间去写这样的程序码!
还记得
Microsoft Common Dialog Control (16 位元文件是 Comdlg16.ocx,32 位元文件是
Comdlg32.ocx)
吗?我们都知道,这个控制项可以帮助我们做到以下几件事情:
1、ShowOpen:打开文件 2、ShowSave:存文件 3、ShowPrinter:设定打印机 4、ShowFont:设定字型 5、ShowColor:设定颜色 6、ShowHelp:开启说明文件
当然,您若还想要
Microsoft Common Dialog Control 多做一些别的事也没办法的!但是,Microsoft 在提供 .ocx
文件的同时,还提供了另外一个文件,也就是
comdlg32.dll,它的功能就多了,除了上面提到的几种问话框之外,还有好几个不同功能的问话框,其中就包含【查找】、【替换】二项功能!这二个
API 分别是 FindText 及 ReplaceText 二个。
在程序中,要声明这二个 API 之前,由於它们都会引用到一个名为
FINDREPLACE 的 Type,所以我们在声明 Function 之前,必须先声明 Type
FINDREPLACE,程序码如下:
在表单的声明区中加入以下声明:
'Find/Replace Type
Structure Private Type FINDREPLACE lStructSize As Long ' size of
this struct 0x20 hwndOwner As Long ' handle to owner's
window hInstance As Long ' instance handle of.EXE that contains cust.
dlg. template flags As Long ' one or more of the FR_?? lpstrFindWhat
As String ' ptr. to search string lpstrReplaceWith As String ' ptr. to
replace string wFindWhatLen As Integer ' size of find
buffer wReplaceWithLen As Integer ' size of replace buffer lCustData
As Long ' data passed to hook fn. lpfnHook As Long ' ptr. to hook fn.
or NULL lpTemplateName As String ' custom template name End
Type
'Common Dialog DLL Calls Private Declare Function FindText
Lib "comdlg32.dll" Alias "FindTextA" (pFindreplace As FINDREPLACE) As
Long Private Declare Function ReplaceText Lib "comdlg32.dll" Alias
"ReplaceTextA" (pFindreplace As FINDREPLACE) As Long
'Delcaration
of the type structure Dim frText As FINDREPLACE
在表单中加入二个
Command Button,并命名为 cmdFind, cmdReplace,加入以下程序码:
Private Sub
cmdFind_Click() 'Call the find text function FindText frText End
Sub
Private Sub cmdReplace_Click() 'Call the replace text
function ReplaceText frText End Sub
Private Sub
Form_Load() 'Set the Find/Replace Type properties With
frText .lpstrReplaceWith = "Replace Text" .lpstrFindWhat = "Find
Text" .wFindWhatLen = 9 .wReplaceWithLen = 12 .hInstance =
App.hInstance .hwndOwner = Me.hWnd .lStructSize =
LenB(frText) End With End Sub
好了,您现在可以按 F5 试试了!
注:在
Type FINDREPLACE 中有一个 flag,您可以代入的 flag 是 FR_??,您可以在 API 检视员中找找!
303、如何隐藏及显示桌面上的图标?
当桌面上的图标太多时,看起来就会有一点点乱,而且,当您的桌面底图很漂亮时,这些图标还会遮住您漂亮的底图,有些软件有提供隐藏及显示桌面上的图标的功能,这个我们也可以做到!
在模组中加入以下声明:
Declare
Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd As
Long, ByVal hWndChild As Long, ByVal lpszClassName As String, ByVal
lpszWindow As String) As Long Declare Function ShowWindow Lib "user32"
(ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
'-- Constants
for ShowWindow() Public Const SW_HIDE = 0 Public Const SW_NORMAL =
1 Public Const SW_SHOWMINIMIZED = 2 Public Const SW_SHOWMAXIMIZED =
3 Public Const SW_SHOWNOACTIVATE = 4 Public Const SW_SHOW =
5 Public Const SW_MINIMIZE = 6 Public Const SW_SHOWMINNOACTIVE =
7 Public Const SW_SHOWNA = 8 Public Const SW_RESTORE = 9 Public
Const SW_SHOWDEFAULT = 10
'-- Names of the shell window we'll be
looking for Public Const g_cstrShellViewWnd As String =
"Progman"
在表单中加入二个 Command Button,并命名为 cmdHideDesktop,
cmdShowDesktop,加入以下程式码:
Private Function FindShellWindow() As
Long Dim hWnd As Long On Error Resume Next
hWnd =
FindWindowEx(0&, 0&, g_cstrShellViewWnd, vbNullString) If hWnd
<> 0 Then FindShellWindow = hWnd End If End
Function
Private Sub HideShowWindow(ByVal hWnd As Long, Optional
ByVal Hide As Boolean = False) Dim lngShowCmd As Long On Error
Resume Next
If Hide = True Then lngShowCmd =
SW_HIDE Else lngShowCmd = SW_SHOW End If Call ShowWindow(hWnd,
lngShowCmd) End Sub
Private Sub cmdShowDesktop_Click() Dim
hWnd As Long On Error Resume Next
'-- Find the window we're
looking for and then hide it hWnd = FindShellWindow() If hWnd
<> 0 Then Call HideShowWindow(hWnd) End If End
Sub
Private Sub cmdHideDesktop_Click() Dim hWnd As Long On
Error Resume Next
hWnd = FindShellWindow() If hWnd <> 0
Then Call HideShowWindow(hWnd, True) End If End
Sub
好了,您现在可以按 F5 试试了!
304、如何让数字正确的在 ListBox 及 ComboBox 中排序?
不知道各位有没有发现,ListBox 及 ComboBox 的 Sorted
属性在遇到数字后有点怪怪的,是有排序没错,但是它似乎将数字当作文字排序了!所以排出来的效果和我们真正想要的并不完全相同。其实这情形不只发生在
ListBox 及 ComboBox 而已,文件总管的文件排也有同样的情形,让我们来看看:
[FrontPage 保存结果 组件]
ListBox 及 ComboBox 的 Sorted 属性设为 True 我们真正想要的结果 1 11 123 2 32 1 2
11 32 123
'以下这个模组就是用来排序数字用的,得到的结果,就如同上方右边的结果!
Sub ReSort(L
As Control) Dim P%, PP%, C%, Pre$, S$, V&, NewPos%, CheckIt% Dim
TempL$, TempItemData&, S1$ For P = 0 To L.ListCount - 1 S =
L.List(P) For C = 1 To Len(S) V = Val(Mid$(S, C)) If V > 0
Then Exit For Next If V > 0 Then If C > 1 Then Pre =
Left$(S, C - 1) NewPos = -1 For PP = P + 1 To L.ListCount -
1 CheckIt = False S1 = L.List(PP) If Pre <> "" Then If
InStr(S1, Pre) = 1 Then CheckIt = True Else If Val(S1) > 0 Then
CheckIt = True End If If CheckIt Then If Val(Mid$(S1, C)) < V
Then NewPos = PP Else Exit For End If Next If NewPos >
-1 Then TempL = L.List(P) TempItemData =
L.ItemData(P) L.RemoveItem (P) L.AddItem TempL,
NewPos L.ItemData(L.NewIndex) = TempItemData P = P - 1 End
If End If Next End Sub
'实际使用时,需导入控制项的名称,例如:
Private
Sub Command1_Click() Call ReSort(List1) End Sub
305、如何从 Internet 上抓回某一个网页的内容?
常在讨论区中发现有人问这个问题,我搞不懂,这有什么特别的目的或意义?直接使用浏览器不就好了吗?
不过,要用 VB
来做也不难,只要使用 Internet Transfer Control 就可以了!
开启一个新工程,加入一个 Internet
Transfer Control、一个 CommandButton 及二个 TextBox!
Text1
用来输入要抓取的网页位址,例如:http://www.microsoft.com/taiwan/support/products/vb.htm Text2
用来输入要存文件的完整文件名,例如:c:\temp\temp.htm
Private Sub
Command1_Click() Dim b() As Byte '取消所有动作 Inet1.Cancel '设定通讯协定为
HTTP Inet1.Protocol = icHTTP '设定 URL 属性 Inet1.URL =
Text1.Text '将读取的 HTML 资料放进一个 byte array. b() = Inet1.OpenURL(,
icByteArray) '建立一个暂存文件来存放抓回来的 html 文件 Open Text2.text For Binary
Access Write As #1 Put #1, , b() Close #1 End
Sub
好了,就是这么简单,试看看吧! |