紧急,自编程以来,遇到的最难的问题,不知各有什么好的解决办法                如保取得打印任务栏里当前打印的文件名(标题),可以用VC 或是VB解决,多谢

解决方案 »

  1.   

    如果想得到各打印作业的状态,通常我们可以通过调用以下API:
    OpenPrinter
    GetPrinter
    EnumJobs
    ClosePrinter 
    目前在微软的网站上没有现成的关于以上API调用的VB代码,但有一篇VC的示例代码,您可以参考一下:
    HOWTO: Get the Status of a Printer and a Print Job
    (http://support.microsoft.com/support/kb/articles/Q160/1/29.asp) 
    另外,您还可以试一下ADSI中的IADsPrintQueueOperations和IADsPrintJobOperations接口。具体信息您可以参考以下文档:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netdir/adsi/iadsprintjoboperations.asp?frame=true 
    它需要Win2000及以后版本或装了Active Directory Client Extension的WinNT 4.0sp6a/Win95/98/Me来运行。关于Active Directory Client Extension的安装信息,您可以参考以下文档:
    http://www.microsoft.com/windows2000/server/evaluation/news/bulletins/adextension.asp 
    - 微软亚洲技术中心 VB技术支持
    本贴子仅供YESKY的用户作为参考信息使用。其内容不具备任何法律保障。您需要考虑到并承担使用此信息可能带来的风险。VB声明 
    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 
    说明 
    枚举打印队列中的作业 
    返回值 
    Long,非零表示成功,零表示失败。会设置GetLastError 
    参数表 
    参数 类型及说明 
    hPrinter Long,一个已打开的打印机对象的句柄(用OpenPrinter获得) 
    FirstJob Long,作业列表中要枚举的第一个作业的索引(注意编号从0开始) 
    NoJobs Long,要枚举的作业数量 
    Level Long,1或2 
    pJob Byte,包含 JOB_INFO_1 或 JOB_INFO_2 结构的缓冲区 
    cbBuf Long,pJob缓冲区中的字符数量 
    pcbNeeded Long,指向一个Long型变量的指针,该变量用于保存请求的缓冲区长度,或者实际读入的字节数量 
    pcReturned Long,载入缓冲区的结构数量(用于那些能返回多个结构的函数) VB声明 
    Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long 
    说明 
    打开指定的打印机,并获取打印机的句柄 
    返回值 
    Long,非零表示成功,零表示失败。会设置GetLastError 
    参数表 
    参数 类型及说明 
    pPrinterName String,要打开的打印机的名字 
    phPrinter Long,用于装载打印机的句柄 
    pDefault PRINTER_DEFAULTS,这个结构保存要载入的打印机信息 
      

  2.   

    JOB_INFO_1 JOB_INFO_2 得到的都只是一些ID啊.没有真正的文件名啊.多谢
      

  3.   

    用了我2小时的时间,记得要给分,呵呵Private Type PRINTER_DEFAULTS
            pDatatype As String
            pDevMode As Long
            DesiredAccess As Long
    End TypePrivate Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As LongPrivate Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As LongPrivate 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 LongPrivate Type SYSTEMTIME
            wYear As Integer
            wMonth As Integer
            wDayOfWeek As Integer
            wDay As Integer
            wHour As Integer
            wMinute As Integer
            wSecond As Integer
            wMilliseconds As Integer
    End TypePrivate Type JOB_INFO_1
            JobId As Long
            pPrinterName As Long
            pMachineName As Long
            pUserName As Long
            pDocument As Long
            pDatatype As Long
            pStatus As Long
            Status As Long
            Priority As Long
            Position As Long
            TotalPages As Long
            PagesPrinted As Long
            Submitted As SYSTEMTIME
    End TypePrivate Const PRINTER_ACCESS_ADMINISTER = &H4Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As LongPrivate Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200Private Sub Command1_Click()
        Dim hPrinter        As Long
        Dim RetVal          As Long
        Dim pd              As PRINTER_DEFAULTS
        Dim lngCount        As Long
        
        Dim JI1()           As JOB_INFO_1
        Dim aJi1()          As Byte
        
        Dim dwBytesNeed     As Long
        Dim dwBytesRet      As Long
        
        Dim lngSize         As Long
        Dim JI_1             As JOB_INFO_1
        
        lngSize = Len(JI_1)
        pd.DesiredAccess = PRINTER_ACCESS_ADMINISTER
        RetVal = OpenPrinter(Printer.DeviceName, hPrinter, pd)
        ReDim aJi1(lngSize - 1)
        RetVal = EnumJobs(hPrinter, 0, 3, 1, aJi1(0), lngSize, dwBytesNeed, dwBytesRet)
        
        If RetVal = 0 And dwBytesNeed = 0 Then
            GetAPIError Err.LastDllError
            Exit Sub
        End If
        
        If dwBytesNeed = 0 Then
            MsgBox "没有打印任务!", vbInformation
            Exit Sub
        End If
        
        If dwBytesNeed > lngSize Then
            ReDim aJi1(dwBytesNeed - 1)
            RetVal = EnumJobs(hPrinter, 0, 3, 1, aJi1(0), dwBytesNeed, dwBytesNeed, dwBytesRet)
        End If
        
        ReDim JI1(1 To dwBytesRet)
        List1.Clear
        For lngCount = 1 To dwBytesRet
            Call CopyMemory(JI1(lngCount), aJi1((lngCount - 1) * lngSize), lngSize)
            List1.AddItem "打印任务" & lngCount
            List1.AddItem "JobID:" & JI1(lngCount).JobId
            List1.AddItem "pPrinterName:" & GetStringFromMem(JI1(lngCount).pPrinterName)
            List1.AddItem "pMachineName:" & GetStringFromMem(JI1(lngCount).pMachineName)
            List1.AddItem "pUserName:" & GetStringFromMem(JI1(lngCount).pUserName)
            List1.AddItem "pDocument:" & GetStringFromMem(JI1(lngCount).pDocument)
            List1.AddItem "pStatus:" & JI1(lngCount).pStatus
            List1.AddItem "Status:" & JI1(lngCount).Status
            List1.AddItem "Priority:" & JI1(lngCount).Priority
            List1.AddItem "Position:" & JI1(lngCount).Position
            List1.AddItem "TotalPages:" & JI1(lngCount).TotalPages
            List1.AddItem "PagesPrinted:" & JI1(lngCount).PagesPrinted
            List1.AddItem "Year:" & JI1(lngCount).Submitted.wYear
            List1.AddItem "Month:" & JI1(lngCount).Submitted.wMonth
            List1.AddItem "Day:" & JI1(lngCount).Submitted.wDay
            List1.AddItem "DayOfWeek:" & JI1(lngCount).Submitted.wDayOfWeek
            List1.AddItem "Hour:" & JI1(lngCount).Submitted.wHour
            List1.AddItem "Minute:" & JI1(lngCount).Submitted.wMinute
            List1.AddItem "Second:" & JI1(lngCount).Submitted.wSecond
            List1.AddItem "wMilliseconds:" & JI1(lngCount).Submitted.wMilliseconds
        Next
        ClosePrinter (hPrinter)
    End SubPublic Function GetAPIError(ByVal API_ERROR As Long)
        Dim Lret As Long
        Dim M_Msg As String
        M_Msg = String(256, " ")
        Lret = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, 0&, API_ERROR, 0&, M_Msg, Len(M_Msg), 0&)
        If Lret <> 0 Then
           M_Msg = Trim(M_Msg)
           MsgBox M_Msg, , "API错误信息"
        End If
    End Function'从给定的内存地址中获得字符串
    Private Function GetStringFromMem(ByVal Addr As Long) As String
        Dim lngSize         As Long
        Dim bytStr()        As Byte
        Dim lngX            As Long
        
        '获得字符串的长度
        Call CopyMemory(lngSize, ByVal Addr - 4, 4)
        ReDim bytStr(lngSize / 2)
        Call CopyMemory(bytStr(0), ByVal Addr, lngSize / 2 + 1)
        GetStringFromMem = StrConv(bytStr, vbUnicode)
    End Function
      

  4.   

    你好,感谢你在以前回答我的一个问题,让我学到许多东西
    http://expert.csdn.net/Expert/topic/2646/2646636.xml?temp=.3826715
    现在再让请教同一问题,就是
    Private Function GetStringFromMem(ByVal Addr As Long) As String
        Dim lngSize         As Long
        Dim bytStr()        As Byte
        Dim lngX            As Long
        
        '获得字符串的长度
    '这在这句里由于是4,所以取的任务栏不全,如果改成5则有的机行,有的机不行多谢
        Call CopyMemory(lngSize, ByVal Addr - 4, 4)    ReDim bytStr(lngSize / 2)
        Call CopyMemory(bytStr(0), ByVal Addr, lngSize / 2 + 1)
        GetStringFromMem = StrConv(bytStr, vbUnicode)
    End Function