APIs: Éliminer le message "Printing" |
Author(s) Dev Ashish |
|
Élimine le message "Printing".
(Q) Comment éliminer le message "Printing" qui accompagne la demande
d'impression d'un rapport (état) sur imprimante?
(A) Ce message est interne à Access et ne peut, en soi, être caché directement
depuis le code.
Par contre, en utilisant un Timer, on peut minimiser ce message peu
après qu'il se soit affiché. La fenêtre ne peut être restaurée, et elle est
automatiquement détruire une fois que l'ouvrage d'impression est localement terminée.
Note: le message reste visible jusqu'à ce que la procédure
événementielle ne se déclanche, ce qui dépend de la valeur de la propreté
TimerInterval du formulaire, et pendant le temps que met Access à exécuter le code
suivant.
L'utilisation de la procédure événementielle du Timer est cruciale, ici, car c'est
la seule procédure qui continue à être déclanchable même si Access présente un
formulaire ou un message en mode modal.
Créer un formulaire (que vous ouvrez en mode caché) et affecter sa propriété
TimerInterva là 300 ( trois dixièmes de seconde). La procédure événementielle devient
Private Sub Form_Timer()
Call sWatchAccess(Application.hWndAccessApp)
End Sub
Maintenant, du formulaire ayant la commande d'impression de l'état, ajouter le code
requis en s'inspirant du code suivant:
Private Sub Command0_Click()
On Error Resume Next
DoCmd.OpenForm "Form2"
DoEvents: DoEvents: DoEvents
DoCmd.OpenReport "Sales by Category", acViewNormal
DoCmd.Close acForm, "Form2"
End Sub
où Form2 est le formulaire caché avec son Timer en fonction.
Private Declare Function apiGetClassName Lib "user32" _
Alias "GetClassNameA" _
(ByVal hWnd As Long, _
ByVal lpClassname As String, _
ByVal nMaxCount As Long) _
As Long
Private Declare Function apiGetWindowText Lib "user32" _
Alias "GetWindowTextA" _
(ByVal hWnd As Long, _
ByVal lpString As String, _
ByVal aint As Long) _
As Long
Private Declare Function apiGetLastActivePopup Lib "user32" _
Alias "GetLastActivePopup" _
(ByVal hWndOwnder As Long) _
As Long
Private Declare Function apiShowWindow Lib "user32" _
Alias "ShowWindow" _
(ByVal hWnd As Long, _
ByVal nCmdShow As Long) _
As Long
Private Const MAX_LEN = 255
Private Const GW_HWNDNEXT = 2
Private Const SW_HIDE = 0
Private Const SW_MINIMIZE = 6
Private Const SW_SHOWMINNOACTIVE = 7
Private Const SW_SHOWDEFAULT = 10
Sub sWatchAccess(ByVal hWndApp As Long)
On Error GoTo Err_Handler
Dim lnghWndChild As Long
Dim strCaption As String
Dim strClass As String
Dim lngRet As Long
lnghWndChild = apiGetLastActivePopup(hWndApp)
strClass = fGetClassName(lnghWndChild)
strCaption = fGetCaption(lnghWndChild)
If strClass = "#32770" And Trim(strCaption) = "Printing" Then
lngRet = apiShowWindow(lnghWndChild, SW_SHOWMINNOACTIVE)
End If
Exit_Here:
Exit Sub
Err_Handler:
MsgBox "Error #: " & Err.Number & vbCrLf & Err.Description, _
vbCritical + vbOKOnly, "sWatchAccess-Runtime Error"
Resume Exit_Here
End Sub
Private Function fGetClassName(ByVal hWnd As Long) As String
Dim strBuffer As String
Dim lngRet As Long
strBuffer = String$(32, 0)
lngRet = apiGetClassName(hWnd, strBuffer, Len(strBuffer))
If lngRet > 0 Then
fGetClassName = Left$(strBuffer, lngRet)
End If
End Function
Private Function fGetCaption(ByVal hWnd As Long) As String
Dim strBuffer As String
Dim lngRet As Long
strBuffer = String$(MAX_LEN, 0)
lngRet = apiGetWindowText(hWnd, strBuffer, Len(strBuffer))
If lngRet > 0 Then
fGetCaption = Left$(strBuffer, lngRet)
End If
End Function
|