Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di Vinniec
    Registrato dal
    Apr 2002
    Messaggi
    195

    [VB6]-API-PrintWindow

    Ciao,
    Su msdn è scritto chiaramente che non è possibile utilizzare SendKeys per inviare {PRTSC} per effettuare uno screenshoot. Bene, allora ho gironzolato tra le API ed ho trovato PrintWindow, che però stampa in un DC.. ora, a me di stampare su una finestra o su uno schermo non mi interessa... se volessi semplicemente salvare la stampa video su file??? Magari esattamente come accade premendo il pulsante STAMP, in modo da poter agire su ClipBoard.
    Suggerimenti?
    Grazie
    __________________
    non darmi consigli se non te li chiedo!
    .: DUCATI FOR LIFE :.
    *Vinniec*
    __________________

  2. #2
    Utente di HTML.it L'avatar di Boolean
    Registrato dal
    Oct 2005
    Messaggi
    758
    questa è la dichiarazione API:
    codice:
    Private Declare Sub keybd_event Lib "user32" _
                  (ByVal bVk As Byte, ByVal bScan As Byte, _
                  ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    
    Private Const VK_SNAPSHOT = &H2C
    e per "simulare" la pressione del tasto STAMP usi questa istruzione

    codice:
    keybd_event VK_SNAPSHOT, 1, 0, 0
    poi devi solo gestire l'immagine nella ClipBoard

    Boolean

  3. #3
    Utente di HTML.it L'avatar di Vinniec
    Registrato dal
    Apr 2002
    Messaggi
    195
    grazie,
    ero convinto che, come per sendkeys, l'emulazione della pressione del tasto STAMP fosse inibita anche in questa funzione. Proverò così.
    Thank you,
    __________________
    non darmi consigli se non te li chiedo!
    .: DUCATI FOR LIFE :.
    *Vinniec*
    __________________

  4. #4
    Utente di HTML.it L'avatar di LMondi
    Registrato dal
    Sep 2004
    Messaggi
    1,291
    Ho provato e completato il codice, gentilmente postato da Boolean.
    Riprendo il post per sapere se è possibile utilizzare la tecnica di cui trattasi per stampare (naturalmente su carta). Se è possibile, vorrei sapere se è una tecnica valida e se è reperibile un tutorial.


    codice:
    Private Declare Sub keybd_event Lib "user32" _
                  (ByVal bVk As Byte, ByVal bScan As Byte, _
                  ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    
    Private Const VK_SNAPSHOT = &H2C
    '------------------------------------------------------
    Private Sub Command1_Click()
    
    ' Pulisce la Clipboard
        Clipboard.Clear
    
    ' Elimina la bitmap dal form:
        Image1.Picture = LoadPicture()
    
    'per "simulare" la pressione del tasto STAMP usa questa istruzione:
        keybd_event VK_SNAPSHOT, 1, 0, 0
    
        DoEvents
    
    ' Recupera l'immagine dalla Clipboard:
        Image1.Picture = Clipboard.GetData
    
    ' Salva l'immagine in un file:
        SavePicture Image1.Picture, App.Path & "\Prova\ProvaScreen.bmp"
    ' Elimina la bitmap dal form:
        Image1.Picture = LoadPicture()
    End Sub
    LM

  5. #5
    Utente di HTML.it L'avatar di Boolean
    Registrato dal
    Oct 2005
    Messaggi
    758
    Ciao LMondi,

    stampare su carta, una volta ottenuta l'immagine con le istruzioni scritte nel tuo codice, è abbastanza immediato.

    potrebbe essere sufficiente utilizzare il metodo PaintPicture dell'oggetto Printer.

    anche senza per forza utilizzare un controllo Image sul form, puoi dichiarare una variabile oggetto stdPicture

    codice:
    Dim picPerStampa as stdPicture
    Set picPerStampa = Clipboard.GetData
    
    Printer.PaintPicture picPerStampa, 0, 0
    in qusto modo stampi la picture a partire dalle coordinate 0, 0
    e senza fare nessun adattamento alla misura del foglio, ma volendo, la sintassi completa di PaintPicture permette di impostare anche larghezza e altezza dell'immagine da stampare.

    Boolean

  6. #6
    Utente di HTML.it L'avatar di Vinniec
    Registrato dal
    Apr 2002
    Messaggi
    195
    quoto boolean!
    Non credevo che l'argomento potesse interessare..
    hihi..
    __________________
    non darmi consigli se non te li chiedo!
    .: DUCATI FOR LIFE :.
    *Vinniec*
    __________________

  7. #7
    Utente di HTML.it L'avatar di LMondi
    Registrato dal
    Sep 2004
    Messaggi
    1,291
    Molto interessante, però vorrei sapere se il predetto metodo è più performante rispetto a quello offerto da PrintForm i cui risultati in stampa sono deludenti soprattutto per quanto riguarda la risoluzione.
    Ora farò delle prove ...
    LM

  8. #8
    Utente di HTML.it L'avatar di LMondi
    Registrato dal
    Sep 2004
    Messaggi
    1,291
    Dunque ho fatto una prima stesura della routine di stampa, a dire il vero non mi soddisfa per la scarsa qualità della risoluzione, nonostante che abbia specificato 300 DPI (il max per la mia stampante, ma che di solito dà un risultato soddisfacente); poi vanno in stampa anche le barre, ecc. ... . Quale metodo si deve utilizzare per migliorare il tutto ?
    codice:
    Private Sub Command2_Click()
        Dim picPerStampa As StdPicture
    
    ' Imposta la gestione degli errori:
        On Error GoTo ErrorHandler
        
    ' Pulisce la Clipboard
        Clipboard.Clear
    
    'per "simulare" la pressione del tasto STAMP usa questa istruzione:
        keybd_event VK_SNAPSHOT, 1, 0, 0
    
        DoEvents
    
        Set picPerStampa = Clipboard.GetData(vbCFDIB)
        
    ' Imposta la risoluzione di stampa su 300 DPI:
        Printer.PrintQuality = 300
    ' Stampa l'immagine acquisita con la Clipboard:
        Printer.PaintPicture picPerStampa, 0, 0
        
    ' Invia il messaggio allo spooler di termine stampa:
        Printer.EndDoc
    
    
    ErrorHandler:
        If Err.Number <> 0 Then
            MsgBox "Errore durante il tentativo di stampa dell'immagine - " & "Numero errore: " & Err.Number & vbCr _
            & "Descrizione: " & Err.Description, vbCritical, "Prova di stampa dell'immagine dello schermo con Printer.PaintPicture."
            Err.Clear
            Exit Sub
        End If
    
    End Sub
    :master:
    LM

  9. #9
    Utente di HTML.it L'avatar di Boolean
    Registrato dal
    Oct 2005
    Messaggi
    758
    ciao LMondi,

    per la qualità, purtroppo non credo si possa più di tanto... tieni conto che l'immagine dello schermo è a 72 Dpi, quindi incrementare la qualità di stampa a 300 è a dir poco irrilevante

    per quanto riguarda la "selezione" della stampa, puoi vedere la sintassi completa del metodo PaintPicture, che oltre a ridimemsionare l'immagine permette anche di effettuare un "ritaglio" sull'immagine sorgente:

    codice:
    Dim imgW as Integer
    Dim imgH as Integer
    imgW = Printer.ScaleX(picPerStampa, vbHimetric, vbTwips)
    imgH = Printer.ScaleY(picPerStampa, vbHimetric, vbTwips)
    Printer.PaintPicture picPerStampa, 0, 0 , Printer.ScaleWidth, Printer.ScaleHeight, 150, 150, imgW-300, imgH-300
    Printer.EndDoc
    in questo esempio viene stampata l'immagine rifilata di 150 twips per lato adattandone l'immagine allo spazio disponibile della stampante.

    Boolean

  10. #10
    Utente di HTML.it L'avatar di LMondi
    Registrato dal
    Sep 2004
    Messaggi
    1,291
    Grazie Boolean,
    le tue spiegazioni sono molto chiare.
    Ora capisco perchè il metodo è poco, per così dire, frequentato. Peccato che la risoluzione sia scadente, altrimenti il metodo sarebbe molto comodo.
    LM

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.