To:griefforyou(为你伤心)请先看清楚我的问题,好吗?我是说打印完后不走纸。

解决方案 »

  1.   

    Hook简介上Hook简介
     
    Hook这个东西有时令人又爱又怕,Hook是用来拦截系统某些讯息之用,例如说,我们想让系统不管在什麽地方只要按个Ctl-B便执行NotePad,或许您会使用Form的KeyPreview,设定为True,但在其他Process中按Ctl-B呢?那就没有用,这是就得设一个Keyboard Hook来拦截所有Key in的键;再如:MouseMove的Event只在该Form或Control上有效,如果希望在Form的外面也能得知Mouse Move的讯息,那只好使用Mouse Hook来栏截Mouse的讯息。再如:您想记录方才使用者的所有键盘动作或Mosue动作,以便录巨集,那就使用JournalRecordHook,如果想停止所有Mosue键盘的动作,而放(执行)巨集,那就使用JournalPlayBack Hook;Hook呢,可以是整个系统为范围(Remote Hook),即其他Process的动作您也可以拦截,也可以是LocalHook,它的拦截范围只有Process本身。Remote Hook的Hook Function要在.Dll之中,Local Hook则在.Bas中。在VB如何设定Hook呢?使用SetWindowsHookEx()
     
    Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
          (ByVal idHook As Long, _
            ByVal lpfn As Long,  _
            ByVal hmod As Long,  _
            ByVal dwThreadId As Long) As Long
     
    idHook代表是何种Hook,有以下几种
        Public Const WH_CALLWNDPROC = 4
        Public Const WH_CALLWNDPROCRET = 12
        Public Const WH_CBT = 5
        Public Const WH_DEBUG = 9
        Public Const WH_FOREGROUNDIDLE = 11
        Public Const WH_GETMESSAGE = 3
        Public Const WH_HARDWARE = 8
        Public Const WH_JOURNALPLAYBACK = 1
        Public Const WH_JOURNALRECORD = 0
        Public Const WH_KEYBOARD = 2
        Public Const WH_MOUSE = 7
        Public Const WH_MSGFILTER = (-1)
        Public Const WH_SHELL = 10
        Public Const WH_SYSMSGFILTER = 6
     
    lpfn代表Hook Function所在的Address,这是一个CallBack Fucnction,当挂上某个Hook时,我们便得定义一个Function来当作某个讯息产生时,来处理它的Function,这个Hook Function有一定的叁数格式
     
        Private Function HookFunc(ByVal nCode As Long, _
                                ByVal wParam As Long, _
                                ByVal lParam As Long ) As Long
     
            nCode 代表是什麽请况之下所产生的Hook,随Hook的不同而有不同组的可能值。
            wParam lParam 传回值则随Hook的种类和nCode的值之不同而不同。
        因这个叁数是一个 Function的Address所以我们固定将Hook Function放在.Bas中,并以AddressOf HookFunc传入。至於Hook Function的名称我们可以任意给定,不一定叫 HookFunc
     
    hmod 代表.DLL的hInstance,如果是Local Hook,该值可以是Null(VB中可传0进去),而如果是Remote Hook,则可以使用GetModuleHandle(".dll名称")来传入。
     
    dwThreadId 代表执行这个Hook的ThreadId,如果不设定是那个Thread来做,则传0(所以一般来说,Remote Hook传0进去),而VB的Local Hook一般可传App.ThreadId进去。
     
    值回值 如果SetWindowsHookEx()成功,它会传回一个值,代表目前的Hook的Handle,这个值要记录下来。
     
    因为A程式可以有一个System Hook(Remote Hook),如KeyBoard Hook,而B程式也来设一个Remote的KeyBoard Hook,那麽到底KeyBoard的讯息谁所拦截?答案是,最後的那一个所拦截,也就是说A先做keyboard Hook,而後B才做,那讯息被B拦截,那A呢?就看B的Hook Function如何做。如果B想让A的Hook Function也得这个讯息,那B就得呼叫CallNextHookEx()将这讯息Pass给A,於是产生Hook的一个连线。如果B中不想Pass这讯息给A,那就不要呼叫CallNextHookEx()。
     
    Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" _
            (ByVal hHook As Long, _
            ByVal ncode As Long, _
            ByVal wParam As Long, _
            lParam As Any) As Long
     
    hHook值是SetWindowsHookEx()的传回值,nCode, wParam, lParam则是Hook Procedure中的三个叁数。
     
    最後是将这Hook去除掉,请呼叫UnHookWindowHookEx()
     
    Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx"  _
            (ByVal hHook As Long) As Long
     
    hHook便是SetWindowsHookEx()的传回值。此时,以上例来说,B程式结束Hook,则换A可以直接拦截讯息。
           以上代码来自: SourceCode Explorer(源代码数据库)
               复制时间: 2002-06-15 18:10:52
               当前版本: 1.0.707
                   作者: Shawls
               个人主页: Http://Shawls.Yeah.Net
                 E-Mail: [email protected]
                     QQ: 9181729
    Hook简介下KeyBoard Hook的范例
     
    Hook Function的三个叁数
     
    nCode        wParam                     lParam            传回值
    ===========  ========================== ==============    ================
    HC_ACTION    表按键Virtual Key          与WM_KEYDOWN同  若讯息要被处理传0
    或                                                        反之传1
    HC_NOREMOVE
     
     
    Public hHook as Long
     
    Public Sub UnHookKBD()
    If hnexthookproc <> 0 Then
        UnhookWindowsHookEx hHook
        hHook = 0
    End If
    End Sub
     
    Public Function EnableKBDHook()
    If hHook <> 0 Then
        Exit Function
    End If
    hhook = SetWindowsHookEx(WH_KEYBOARD, AddressOf _
                MyKBHFunc, App.hInstance, App.ThreadId)
    End Function
     
    Public Function MyKBHFunc(ByVal iCode As Long, _
        ByVal wParam As Long, ByVal lParam As Long) As Long
      MyKBHfunc = 0 '表示要处理这个讯息
     
      If wParam = vbKeySnapshot Then  '侦测 有没有按到PrintScreen键
        MyKBHFunc = 1 '在这个Hook便吃掉这个讯息
      End If
      Call CallNextHookEx(hHook, iCode, wParam, lParam) '传给下一个Hook
    End Function
     
    至于其他的 Hook的详细资料与nCode,wParam, lParam的意义,请查Win32 Help或Windows 95: A Developer's Guide (Jeffrey Richter著)(中译本:基峰 李书良译 侯俊杰总监 Windows95程式设计指南)
           以上代码来自: SourceCode Explorer(源代码数据库)
               复制时间: 2002-06-15 18:11:01
               当前版本: 1.0.707
                   作者: Shawls
               个人主页: Http://Shawls.Yeah.Net
                 E-Mail: [email protected]
                     QQ: 9181729
      

  2.   

    to:watt(瓦特)
    你的意思是说设置打印纸的大小是吗?这样不行的,你可以用一张A4纸试一下,如果你只打印一行的话,打印完后照样将整张纸退出来。TO:kongkuBillchen(BillChen) 
    退格指令有什么用?能说详细点吗?To:zyb_8022(紫光)
    不知道你说的是什么意思?假如没有那句的话,打印机根本不打印。如果是用那句打印直接打印的话,打印完后肯定走纸,将整张纸退出。TO:2sword(笛之侠)
    能具体说一下在本问题上Hook怎样应用吗?我不是很看得懂你的意思,小弟只是一只菜鸟,还望多多指教
      

  3.   

    我想只有2sword(笛之侠)的方法可能有效在Windows下面打印是不能象古老的DOS一样可以打印多少走多少的
    它被固定成一次打印只能完全张,如三张半就是四张
      

  4.   

    我想只有2sword(笛之侠)的方法可能实现,不过太复杂,有点大材小用了事实上Windows操作系统已经不可能象DOS时代一样打多少走多少了
    它已经固定了只能打印整数页,如三张半则打印四张根据你的意思,方便点的方法是设置自定义的小纸,再用连续纸打印
    另外你应该用专用的票据打印机应该不难的
    如果你用Crystal Report等报表设计器的话,那更简单了我做类似的东西,如还不行可心再联系
      

  5.   

    To:shenxin(木头) 你的意思是说:将纸张长度设成整卷纸的长度,也就是说将整卷纸设成一张纸,是吗?那WINDOWS既然是固定只能打印整数页,那打完几行数据后,会不会将整卷纸当成一张纸全部退出来呢?
      

  6.   

    你是票据打印,我也是票据打印,为什么不让它走纸?不走纸怎么出纸?
     只要把走纸控制好,不就行了忙?Public Sub leavecard_print()
      If MsgBox("打印出门证?", vbQuestion + vbOKCancel, "提示") = vbOK Then
        Dim yy As String
        Dim mm As String
        Dim dd As String
        Dim fpath As String
        On Error GoTo mylable
        mydoc.Close
        appwd.Quit
    mylable:
        Call del_doc
        yy = Year(CDate(RTrim(T_date.Text)))
        mm = Month(CDate(RTrim(T_date.Text)))
        dd = Day(CDate(RTrim(T_date.Text)))
            Dim pini As String
            Dim df_Y As Integer
            Dim df_X As Integer
            pini = ReadWriteINI("get", App.Path + "\print.ini", "票据打印设置", "WIN98")
            If RTrim(pini) = "1" Then  'app in  win98
              df_Y = 0
              df_X = 0
            Else                 'app in win2000
               df_Y = CInt(ReadWriteINI("get", App.Path + "\print.ini", "票据打印设置", "Y矫正值"))
               df_X = CInt(ReadWriteINI("get", App.Path + "\print.ini", "票据打印设置", "X矫正值"))
            End If
                Printer.CurrentX = 0
                Printer.CurrentY = 0
                Printer.Font.name = "宋体"
                Printer.Font.Size = 14
                Printer.CurrentY = Printer.CurrentY + 550 + df_Y
                Printer.CurrentX = 2400 + df_X
                Printer.Print "绍兴鼎峰水泥有限公司" '公司名称
                Printer.Font.name = "宋体"
                Printer.Font.Size = 11
                Printer.CurrentY = 1170 + df_Y
                Printer.CurrentX = 2300 + df_X
                Printer.Print yy + "     " + mm + "    " + dd '年月日
                Printer.CurrentY = 1638 + df_Y
                Printer.CurrentX = 2400 + df_X
                Printer.Print Cb_comp.Text  '提货单位
                Printer.CurrentY = 1638 + df_Y
                Printer.CurrentX = 7900 + df_X
                Printer.Print T_link_man.Text '提货人
                Printer.CurrentY = 2308 + df_Y
                Printer.CurrentX = 2400 + df_X
                Printer.Print "普通水泥/" + T_degree.Text   '强度等级
                Printer.CurrentY = 2308 + df_Y
                Printer.CurrentX = 5200 + df_X
                Printer.Print T_breed_code.Text  '水泥编号
                Printer.CurrentY = 2308 + df_Y
                Printer.CurrentX = 8000 + df_X
                Printer.Print T_store_name.Text    '仓位号
                Printer.CurrentY = 2938 + df_Y
                Printer.CurrentX = 2800 + df_X
                Printer.Print T_bill_number.Text '提货单号
                Printer.CurrentY = 2938 + df_Y
                Printer.CurrentX = 7500 + df_X
                Printer.Print T_amount.Text + "  吨" '提货数量
                Printer.CurrentY = 3608 + df_Y '4308
                Printer.CurrentX = 2800 + df_X
                Printer.Print T_vehi_comp.Text '承运单位
                Printer.CurrentY = 3608 + df_Y
                Printer.CurrentX = 7500 + df_X
                Printer.Print T_vehi_tool.Text  '运输工具
                Printer.CurrentY = 4908 + df_Y '6208
                Printer.CurrentX = 7800 + df_X
                Printer.Print Cb_makeout_man.Text '开单人
                Printer.EndDoc
            Call Sleep(4000)
            GoTo mylab0
    mylab0:
            On Error GoTo mylab1
            Open "LPT1:" For Output As #1
            For i = 0 To 16
                Print #1, ""
            Next
           Close #1
          Exit Sub
    mylab1:
      Err.Clear
      Call Sleep(4000)
      GoTo mylab0
     End If
    End Sub
      

  7.   

    To:wzsswz(岌岌荆棘)谢谢,我先试试