科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Visual Basic中实现I/O端口控制

Visual Basic中实现I/O端口控制

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

VB没有提供直接读写I/O口的方法。所以只能借助其他语言来编写DLL,然后再在VB中调用。

作者:陈琦 来源:yesky 2007年10月15日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
打印机技巧

  用 API 打开打印对话框

  使用通用对话框控件当然可以打开打印对话框, 不过要浪费更多的资源和增加了一个 OCX 部件。 而用 API 会高效。

  声明:

Declare Function PRINTDLG Lib "comdlg32.dll" Alias _
"PrintDlgA" (pPrintdlg As PRINTDLG) As Long
 Type PRINTDLG
 lStructSize As Long
 hwndOwner As Long
 hDevMode As Long
 hDevNames As Long
 hdc As Long
 flags As Long
 nFromPage As Integer
 nToPage As Integer
 nMinPage As Integer
 nMaxPage As Integer
 nCopies As Integer
 hInstance As Long
 lCustData As Long
 lpfnPrintHook As Long
 lpfnSetupHook As Long
 lpPrintTemplateName As String
 lpSetupTemplateName As String
 hPrintTemplate As Long
 hSetupTemplate As Long
End Type

  使用:

Private Sub Command1_Click()
 Dim p As PRINTDLG
 p.lStructSize = Len(p)
 p.hwndOwner = Me.hWnd
 p.nFromPage = 1
 p.nToPage = 1
 p.nMinPage = 1
 p.nMaxPage = 1
 p.nCopies = 1
 x = PRINTDLG(p)
 Printer.Print Text1.Text
End Sub

  在打印字符串时自动换行

  其中 len1 为打印的宽度, Str 为打印的文本。

Do While Len(Str) > 0
 str1 = Str
 Do While len1 > 0 And Printer.TextWidth(str1) > len1
  str1 = Left(str1, Len(str1) - 1)
 Loop
 Printer.Print str1 '打印
 If Len(str1) = 0 Then Exit Do '不匹配
  Str = Mid(Str, Len(Str1)+1) '截断!
Loop

  打印机只打印一行

  在 Win95 下,只有在使用 EndDoc 或 NewPage 时,打印机才开始打印,而且每次都要换页。使用以下的方法,可以只打印一行,并且可以把打印机的控制字符也直接发到打印机。
注意:如果打印机无汉字库,不能输出中文。

Open "PRN" For Output As #1
Print #1, "一行"

  如何改变 Windows 预设的打印机?

  在 VB 里面, 原本改变预设打印机的方法是:(假设安装有两种打印机(驱动程序))

Set Printer = Printers(0) ' 将预设打印机设定成第一种打印机
Set Printer = Printers(1) ' 将预设打印机设定成第二种打印机

  但实际上以上叙述有时候不会成功(原因不详), 为了能够成功地改变预设打印机,以下是调用 Windows API 的方法:(补充说明: 此一解决方案适用于 Windows 95, 至于 NT 设定预设打印机的方法请叁考 98/04/05 的每周小技巧)

  1. API 的声明:

Const HWND_BROADCAST = &HFFFF&
Const WM_WININICHANGE = &H1A
Private Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long

Private Declare Function WriteProfileString Lib "kernel32" Alias "WriteProfileStringA" (ByVal lpszSection As String, ByVal lpszKeyName As String, ByVal lpszString 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


  注:如果以上的声明放在「一般模块」底下, 应在 Const 之前加上 Public 保留字, 并且将 Private 保留字去掉。

  2. 程序范例:

PrinterName = "您想设定的打印机名称"
Dim S As String, length As Long, hKey As Long
S = String(80, Chr(0))
length = GetProfileString("devices", PrinterName, "", S, Len(S))
S = Left(S, length)
Call WriteProfileString("windows", "device", PrinterName & "," & S)
Call SendMessage(HWND_BROADCAST, WM_WININICHANGE, &H7FFF&, ByVal "windows")

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章