返回列表 发布新帖
楼主: 张硕御月

电脑基础知识大全

 楼主| 发表于 2011-10-31 14:55:08 | 查看全部
65,Q:如何结束 Shell 所启动的程序?
A:如果被 Shell 所启动的程序还没有结束,我们就想主动结束它,该怎么做呢? 此时应调用的 Windows API 是
TerminateProcess, 细节如下:
1. API 的声明:
Const SYNCHRONIZE = &H100000
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess
As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)
As Long
Private Declare Function TerminateProcess Lib "kernel32" Alias
"TerminateProcess" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
(注1:如果以上的声明放在「一般模块」底下,应将 Declare 之前的 Private 保留字去掉,并且在 Const 之前加上 Public
保留字。)
2. Shell 的程序范例:(以执行 MS-DOS 为例)
Dim pId As Long, pHnd As Long ' 分别声明 Process Id 及 Process Handle 变数
pId = Shell("Command.com", vbNormalFocus) ' Shell 传回 Process Id
pHnd = OpenProcess(SYNCHRONIZE, 0, pId) ' 取得 Process Handle
Call TerminateProcess( pHnd, 0 ) ' TerminateProcess 所传入的是 Process Handle
Call CloseHandle( pHnd )
(注2:以上的方案只适用于 Shell 所启动的程序,ShellExecute 则不适用,原因是 ShellExecute
函数是通过资源管理器来启动程序,而资源管理器启动程序之后,并没有将 Process ID 或 Process Handle 传回来。
注3:以上程序在 Windos98、VB6.0 下调试通过。)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-10-31 14:55:19 | 查看全部
66,Q:用 VB5.0 创建 Windows 程序组中的快捷方式:
A:
'API 函数声明:要在 VB5.0 中创建 Windows 的快捷方式,需要用到一个动态链接库
Vb5stkit.dll。在该动态链接库中提供了三个函数
OSfCreateShellGroup、OSfCreateShellLink、OSfRemoveShellLink,分别用于创建快捷方式程序组、快捷方式、删除快捷方式。这三个函数的声明形式分别如下:
Private Declare Function OSfCreateShellGroup Lib "Vb5stkit.dll" Alias
"fCreateShellFolder" (ByVal lpstrDirName As String) As Long
Private Declare Function OSfCreateShellLink Lib "Vb5stkit.dll" Alias
"fCreateShellLink" (ByVal lpstrFolderName As String, ByVal lpstrLinkName As
String,ByVal lpstrLinkPath As String, ByVal lpstrLinkArguments As String) As
Long
Private Declare Function OSfRemoveShellLink Lib "Vb5stkit.dll" Alias
"fRemoveShellLink" (ByVal lpstrFolderName  As String, ByVal lpstrLinkName As
String) As Long
'实现的语句:
Dim lresult As Long
lresult = OSfCreateShellGroup("Test") '在程序菜单中添加一个名为 Test 的程序组
lresult = OSfCreateShellLink("test", "记事本", "c:\\Windows\\notepad.exe", "")
'在程序菜单的Test程序组下创建记事本的快捷方式
lresult = OSfRemoveShellLink("Test", "记事本") '删除 Test 程序组下的快捷方式
(注:在 Windows98/NT4.0、VB5.0 下可以正常运行。但创建桌面快捷方式和 Start Menu 快捷方式有些问题。在 VB6.0
中也有些问题(是否要安装 SP3?)。)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-10-31 14:55:44 | 查看全部
67,Q:VB 中使 TextBox 按 Mouse 右键时只出现自定 PopUp Menu?
A:一般我们可能在 TextBox 的 MouseDown Event 中 Check 是否按右键,若是,则设定出现 Popup Menu 程式如下:
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single,
Y As Single)
If Button = 2 Then
PopupMenu MyMenu
End If
End Sub
可是出现的还是原先内定的 Popup Menu,之后再按一次右键,才出现我们自定的 menu。很奇怪吧?如果用 API 来解决,那便是要拦截 Mouse
的按键(使用 SubClassing 的技巧),但是有人发现了以下的方式便可以解决(也是一个十分实作性的经验):
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single,
Y As Single)
If Button = 2 Then
Text1.Enabled = False : Text1.Enabled = True
PopupMenu MyMenu
End If
End Sub
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-10-31 14:55:55 | 查看全部
68,Q:用 VB 实现拖放功能:
A:拖放是用鼠标拖动一个对象到其它对象的活动。在图形操作过程中,拖放是最常用的功能之一,下面我们来看看怎样用 VB 实现拖放功能。
  首先介绍与拖放有关的控件:
  1.属性:DragMode 决定拖动操作的初始化是人工方式还是自动方式,DragIcon 确定在拖动过程中显示的指针的图标形状;
  2.方法:Drag 开始,结束或取消拖动控件;
  3.事件:MouseDown 事件发生于用户按下鼠标按钮时,DragOver 事件发生于拖动操作完成时,DragDrop 事件发生于拖动操作正在进行时。
  然后编写一个小程序,这个程序能实现在窗口中或窗口间拖动图标的功能。建立窗口 Form1 和 Form2,在窗口中都加入
Image1,为它们设置初始显示的图片。键入以下代码(本程序在 VB5.0/6.0,Window95/98/NT4.0 环境下通过):

  ' Form1 下程序代码为:
  Option Explicit
  Dim dragx As Single
  Dim dragy As Single
  Const BEGIN_DRAG=1
  Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
Image1.Picture=Source   'Sourse为被拖动的控件
   Form2.Image1.Picture=LoadPicture("")
   Image1.Move(X-dragx),(Y-dragy) ' X,Y为鼠标所在目标窗体或控件的当前坐标
  End Sub
  Private Sub Form_Load()
   Load Form2
   Form2.Show 0
  End Sub
  Private Sub Image1_MouseDown(Button As Integer,Shift As Integer,X As Single,Y
As Single)
   dragx=X
   dragy=Y
   Image1.Drag BEGIN_DRAG  '开始拖动操作
   Image1.DragIcon = LoadPicture("按下鼠标时想显示的光标")
  End Sub

  ' Form2 下程序代码为:
  Option Explicit
  Dim dragx As Single
  Dim dragy As Single
  Const BEGIN_DRAG=1
  Private Sub Form_DragDrop(Source As Control,X As Single,Y As Single)
   Image1.Picture=Source
   Form1.Image1.Picture=LoadPicture("")
   Image1.Move(X-dragx),(Y-dragy)
  End Sub
  Private Sub Image1_MouseDown(Button As Integer,Shift As Integer,X As Single,Y
As Single)
   dragx=X
   dragy=Y
   Image1.Drag BEGIN_DRAG
   Image1.DragIcon=LoadPicture("按下鼠标时想显示的光标")
  End Sub
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-10-31 14:56:07 | 查看全部
69,Q:用 VB 程序如何改变桌面的墙纸图片?
A:此一问题需调用 SystemParametersInfo API 函数,细节如下:
1. API 的声明:
Const SPI_SETDESKWALLPAPER = 20
Const SPIF_UPDATEINIFILE = &H1
Private Declare Function SystemParametersInfo Lib "user32" Alias
"SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByVal
lpvParam As Any, ByVal fuWinIni As Long) As Long
注:如果以上的声明放在「一般模块」底下,应在 Const 之前加上 Public 保留字,并且将 Private 保留字去掉。
2. 程序范例:
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, BMP图档名称,
SPIF_UPDATEINIFILE)
例如:
' 1. 将桌面图片设定成 c:\\windows\\setup.bmp:
  Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0,
"c:\\windows\\setup.bmp", SPIF_UPDATEINIFILE)
' 2. 将桌面图片清掉:
  Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "",
SPIF_UPDATEINIFILE)
程序如下:
  Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, BMP图档名称,
SPIF_UPDATEINIFILE)
但以上程序设定图片之后,必须等到下次 Windows 重新启动时才生效,如果希望设定之后立刻生效,则程序须修改如下:
Const SPIF_UPDATEINIFILE = &H1
Const SPIF_SENDWININICHANGE = &H2
Const SPI_SETDESKWALLPAPER = 20
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c:\\windows\\setup.bmp",
SPIF_UPDATEINIFILE +  SPIF_SENDWININICHANGE)
此外希望只有本次使用 Windows 时改变桌面图片(下次开机时还原原状),则程序如下:
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c:\\windows\\setup.bmp",
SPIF_SENDWININICHANGE) ' 去掉 SPIF_UPDATEINIFILE
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-10-31 14:56:21 | 查看全部
70,Q:用 VB 程序捕捉屏幕图像:
A:在 Form1 上添加一个 Picture 和 Command 控件,代码如下(Windows98/NT、VB6.0):
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal
hdc As Long) As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As
Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As
Long, ByVal hMem As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal
hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x
As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal
hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As
Long
Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal
lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String,
lpInitData As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long)
As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As
Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long

Sub ScrnCap(Lt, Top, Rt, Bot)
rWidth = Rt - Lt
rHeight = Bot - Top
SourceDC = CreateDC("DISPLAY", 0, 0, 0)
DestDC = CreateCompatibleDC(SourceDC)
BHandle = CreateCompatibleBitmap(SourceDC, rWidth, rHeight)
SelectObject DestDC, BHandle
BitBlt DestDC, 0, 0, rWidth, rHeight, SourceDC, Lt, Top, &HCC0020
Wnd = Screen.ActiveForm.hwnd
OpenClipboard Wnd
EmptyClipboard
SetClipboardData 2, BHandle
CloseClipboard
DeleteDC DestDC
ReleaseDC DHandle, SourceDC
End Sub

Sub Command1_Click()
Form1.Visible = False
ScrnCap 0, 0, 640, 480
Form1.Visible = True
Picture1 = Clipboard.GetData()
End Sub
71,Q:测试表中的记录总数又一法(笨而准确):
A:
Dim db As Database ' DAO
Dim rs As Recordset
Dim theRecordNum As Long
Set db = OpenDatabase(App.Path & "\\mylib.mdb")
Set rs = db.OpenRecordset("test") '测试表 test 中记录数
theRecordNum = 0
rs.MoveFirst
Do While Not rs.EOF()
  theRecordNum = theRecordNum + 1
  rs.MoveNext
Loop
Debug.Print theRecordNum ' 在监视窗口中输出
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-10-31 14:56:30 | 查看全部
72,Q:如何判断生成的记录集是“空集”(记录数为 0)?
A:如果记录集的 eof 为真,则记录集是“空集”:
  if AdoRS.EOF=true then
  ' ……
  EndIf
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-10-31 14:56:47 | 查看全部
73,Q:VB 编程中如何使窗口右上角的关闭按钮(X)失效?
A:用以下两个过程中的一个即可:
1、Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  Cancel = True
  End Sub
2、Private Sub Form_Unload(Cancel As Integer)
  Cancel = True
  End Sub
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-10-31 14:57:02 | 查看全部
74,Q:用 VB 实现超级链接功能:
A:声明 ShellExecute 函数;在 form 上建立 label、line
控件各一个(myHttp、Line1),再仿照以下代码,即可打开浏览器登录 http://why100000.at.china.com 网站。
Private Declare Function ShellExecute Lib "shell32.dll" Alias
"ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile
As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal
nShowCmd As Long) As Long
Private Sub myHttp_MouseDown(Button As Integer, Shift As Integer, X As
Single, Y As Single)
  Line1.Visible = False
End Sub

Private Sub myHttp_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
  Line1.Visible = True
End Sub
Private Sub Form_MouseMove(Index As Integer, Button As Integer, Shift As
Integer, X As Single, Y As Single)
  Line1.Visible = False
End Sub
Private Sub myHttp_Click()
  Dim HttpJump
  Dim MyUrl As String
  MyUrl = "http://why100000.at.china.com"
  HttpJump = ShellExecute(0&, vbNullString, MyUrl, vbNullString,
vbNullString, vbNormalFocus)
End Sub
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-10-31 14:57:11 | 查看全部
75,Q:在 VB 安装程序中加入“卸载”功能:
A:在制作安装盘的过程中,在建立程序项的时候,建立一个名为“卸载”的程序项,“目标”文本框中填入命令:
  $(WinPath)\\st6unst.exe -n "$(AppPath)\\st6unst.log"
  这样安装后的程序就会有卸载功能了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关注公众号
QQ会员群

Copyright © 2021-2025 中企互动平台 版权所有 All Rights Reserved.

相关侵权、举报、投诉及建议等,请发 E-mail:bztdxxl@vip.sina.com

Powered by Discuz! X3.5|京ICP备10020731号-1|京公网安备 11010102001080号

关灯 在本版发帖
扫一扫添加管理员微信
返回顶部
快速回复 返回顶部 返回列表