306、如何得知某一台网络打印机尚有几份等待打印的报表? 307、如何每天下载 Internet 上某一个网页中的图片来更换桌面的图案? 308、如何呼叫系统的控制面板? 309、如何完全模拟系统的控制面板? 310、如何设定 MsgBox 在若干时间之后若无回应则自动关闭?
306、如何得知某一台网络打印机尚有几份等待打印的报表?
当我们要打印报表时,如果打印机是本机的打印机的话,当然马上就会将报表打印出来,反正打印机就只有您一个人在使用而已!但是如果是在一个人数很多的公司或企业时,往往就必须很多人来分享某一部打印机了,而且打印机也不一定就放在举目可及之处!
当您将报表丢到网络打印机之后,由于不一定看得到打印机,您必须特别到摆放打印机的地方去拿报表,这时候您最关心的,就是报表印了没有,如果还没有的话,那还有几份还没打印的报表排在您的报表之前呢?
下面这一段程序,可以让您知道某一台网络打印机尚有几份等待打印的报表?在您的程序丢出报表的同时,您可以告诉您的
User,他的报表排在第几份!
'在 .bas 文件中加入以下声明及模组:
'Constants
Definition Public Const CCHDEVICENAME = 32 Public Const CCHFORMNAME
= 32 Public Const PRINTER_ACCESS_ADMINISTER = &H4 Public Const
PRINTER_ACCESS_USE = &H8
'Types Definition Public Type
DEVMODE dmDeviceName As String * CCHDEVICENAME dmSpecVersion As
Integer dmDriverVersion As Integer dmSize As
Integer dmDriverExtra As Integer dmFields As Long dmOrientation
As Integer dmPaperSize As Integer dmPaperLength As
Integer dmPaperWidth As Integer dmScale As Integer dmCopies As
Integer dmDefaultSource As Integer dmPrintQuality As
Integer dmColor As Integer dmDuplex As Integer dmYResolution As
Integer dmTTOption As Integer dmCollate As Integer dmFormName As
String * CCHFORMNAME dmUnusedPadding As Integer dmBitsPerPel As
Long dmPelsWidth As Long dmPelsHeight As Long dmDisplayFlags As
Long dmDisplayFrequency As Long End Type
Public Type
PRINTER_DEFAULTS pDatatype As String pDevMode As
DEVMODE DesiredAccess As Long End Type
'API
Declarations Public Declare Function OpenPrinter Lib "winspool.drv"
Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long,
pDefault As PRINTER_DEFAULTS) As Long Public Declare Function EnumJobs
Lib "winspool.drv" Alias "EnumJobsA" (ByVal HPrinter As Long, ByVal
FirstJob As Long, ByVal NoJobs As Long, ByVal Level As Long, pJob As Byte,
ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As
Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal
hObject As Long) As Long
'取得指定的打印机,目前有多少 Jobs (最大值为
128) '打印机的名称可以是 mapping 的网络路径名称,例如: "\\myserver\myprinter" Function
GetPrinterQueue(PrinterName As String) As Long Dim PrinterStruct As
PRINTER_DEFAULTS Dim HPrinter As Long Dim ret As Boolean Dim
JobStruct(0 To 127) As Byte Dim pcbNeeded As Long Dim pcReturned As
Long Dim TempByte As Byte
'设定 Printer structure
初值 PrinterStruct.pDatatype =
vbNullString PrinterStruct.pDevMode.dmSize =
Len(PrinterStruct.pDevMode) PrinterStruct.DesiredAccess =
PRINTER_ACCESS_USE '取得打印机的 Handle ret = OpenPrinter(PrinterName,
HPrinter, PrinterStruct) '取得打印机的 active jobs ret =
EnumJobs(HPrinter, 0, 127, 1, TempByte, 0, pcbNeeded, pcReturned) If
pcbNeeded = 0 Then GetPrinterQueue = 0 Else ret =
EnumJobs(HPrinter, 0, 127, 1, JobStruct(0), pcbNeeded, pcbNeeded,
pcReturned) GetPrinterQueue = pcReturned End If '关闭打印机 ret =
CloseHandle(HPrinter) End Function
'在表单中放一个
CommandButton,程序码如下:
Private Sub Command1_Click() '测试预设打印机的
Queue (Printer.DeviceName) Msgbox "打印机中尚有 " &
GetPrinterQueue(Printer.DeviceName) & " 份报表", 64, "讯息" End
Sub
'好了,试试看吧!
307、如何每天下载 Internet 上某一个网页中的图片来更换桌面的图案?
有些处理图片的软件,尤其是可以处理桌面图片的软件,会提供您每天自动到 Internet
上的某一个网址,去下载它的网站所提供,每天更换的图片,来更改桌面的底图,这是一个很炫的功能,而我们用 VB
也可以很容易的做到这样的功能,您相信吗?
这个主题会运用到之前我们提过的几个功能:
问题: 如何让程序在 Windows
启动时自动执行? 问题: 如何从 Internet 上下载某一个网页的内容? 问题: 如何移除或更改桌面背景的底色图案
(Wallpaper)?
让我们直接来练习吧!
'请在 .BAS 中加入以下声明:
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
SPI_SETDESKWALLPAPER = 20 Const SPIF_UPDATEINIFILE = &H1 Const
SPIF_SENDWININICHANGE = &H2
'请在表单中放入一个 TextBox 及一个 Internet
Transfer Control
Private Sub Form_Load() Dim Pos As
Integer Dim Pos2 As Integer Dim Bilden() As Byte Dim NrString As
String
Text1.Text = Inet1.OpenURL("http://www.vbeden.com/")
'Download the page. Pos = InStr(1, Text1.Text,
"/preblem/61-80") Pos2 = InStr(Pos, Text1.Text, ".gif") NrString =
Mid(Text1.Text, Pos, Pos2 - Pos) Text1.Text = "http://www.vbeden.com" +
NrString + ".gif" ' Debug filename Bilden() =
Inet1.OpenURL("http://www.vbeden.com" + NrString + ".gif", icByteArray) '
Download picture.
Open "C:\dilbert.gif" For Binary Access Write As
#1 ' Save the file. Put #1, , Bilden() Close
#1
Picture1.Picture = LoadPicture("c:\dilbert.gif") 'Reload it To
PictureBox SavePicture Picture1.Picture, "c:\dilbert.bmp" 'Converted To
bmp..
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0,
"c:\dilbert.bmp", SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE) 'Change the
wallpaper. Unload Me ' Exit program End
Sub
至于其中的网址及图片的文件名,请自行更改。若是您直接使用以上的程序码的话,也可以,您每天都可以看到一篇漫画 !!
308、如何呼叫系统的控制面板?
在 Windows
的系统中,从很多地方,您有很多方式去叫出系统的控制面板,例如从【我的电脑】、【资源管理器】或是【开始】功能表中的【设置】选项中都可以看到控制面板。
使用
VB 您也可以在程序中叫出控制面板来使用!而且程序码很简单,只要一行就可以了,如下:
Private Sub
Command1_Click() Shell "rundll32.exe shell32.dll,Control_RunDLL",
vbNormalFocus End Sub
上面的程序码,不管您是使用 Windows 95/98/NT 都可以适用的!
309、如何完全模拟系统的控制面板?
在上一个主题:如何呼叫系统的控制面板?中,我们告诉您如何直接叫用系统的控制面板,但是,如果您只是想要叫用控制面板中的某一个单一功能设定画面的话,您也可以做到的!
其实,控制面板的那么多的功能,是分别叫用您电脑中的一些扩展文件名为
.CPL 的文件,这些文件在 Windows 95/98/NT 中存放的位置有一些不同,分别说明如下:
Windows
95/98:文件位置在 c:\windows\system Windows NT:文件位置在
c:\winnt\system32
下面的程序码以 Windows98 为例来说明,如果您是在 Windows NT
中,请自行稍微修改。在表单上放一个 CommandButton 及一个 FileListBox,程序码如下:
Private Sub
Form_Load() File1.Pattern = "*.CPL" File1.FileName =
"C:\WINdows\SYSTEM" '若是 NT 的话请改这里 End Sub
Private Sub
Command1_Click() Shell "rundll32.exe shell32.dll,Control_RunDLL " &
File1.FileName, vbNormalFocus End Sub
好了,别惊讶,程序码就是这么短而已!请先在
FileListBox 中选择一个文件,每一个文件分别代表控制面板中的某一个功能设定程序,然后按下 Command1 就可以执行了!
310、如何设定 MsgBox 在若干时间之后若无回应则自动关闭?
在我们的印象中,VB 所提供的 MsgBox 是一个强制回应的视窗,您一定要按了其中的某一个 CommandButton
之后,它才会关闭!但是在某些软体中,我们会看到,明明是使用系统的
MsgBox,可是您如果不理它,几秒钟之后,它就自行关闭了!别人是如何做到的呢?这个问题偶而会出现在讨论区中,有的人会回答:
只要自己做一个类似
MsgBox 的视窗,就可以自己用 Timer 来控制这个视窗何时要关闭了!
但是,其实不用这么麻烦的,只要使用系统的 MsgBox
再加一个 Timer 就可以控制了!
我们都知道 MsgBox
可以设定成很多不同的样子,可以有很多不同的图示,不同的按钮,其中控制按钮的部份,可以设定的常数如下:
常数 值 说明
vbOKOnly 0 只显示 OK 按钮。 VbOKCancel 1 显示 OK 及 Cancel 按钮。
VbAbortRetryIgnore 2 显示 Abort、 Retry 及 Ignore 按钮。 VbYesNoCancel 3
显示 Yes、No 及 Cancel 按钮。 VbYesNo 4 显示 Yes 及 No 按钮。 VbRetryCancel 5
显示 Retry 及 Cancel 按钮。
为什么要特别提到 MsgBox
的常数呢?因为下面我们要告诉您的方法,还是有一点点限制的!当您设定的常数是 VbAbortRetryIgnore 或 VbYesNo
时,下面的方法也是没用的!
'在表单的声明区中加入以下的声明
Private Declare Function
FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String,
ByVal lpWindowName As String) 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_CLOSE = &H10 Private Const MsgTitle As String = "Test
Message"
'在表单中加入一个 CommandButton 及一个 Timer
控制项,加入以下程序码:
Private Sub Command1_Click() Dim nRet As
Long Timer1.Interval = 3000 Timer1.Enabled = True nRet =
MsgBox("若您不回应的话,3 秒后此 MsgBox 会自动关闭", 64, MsgTitle) Timer1.Enabled =
False End Sub
Private Sub Timer1_Timer() Dim hWnd As
Long hWnd = FindWindow(vbNullString, MsgTitle) Call
SendMessage(hWnd, WM_CLOSE, 0, ByVal 0&) End
Sub
好了,很简单吧!您执行程序时,当 MsgBox 出现 3
秒之后,就会自动关闭了!
注意:此方法的限制说明:
1、当常数设定为 VbAbortRetryIgnore 或
VbYesNo 时,无效! 2、在 Design Time 时,无效,必须 Make EXE
之后才有效! |