By
mLipok
Today, in the end as well, worked out using the Acrobat Reader ActiveX COM Object "AcroPDF.PDF.1"
#include-once
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <MenuConstants.au3>
#include <WinAPI.au3>
;~ Thanks to BrewManNH
;~ http://www.autoitscript.com/forum/topic/134878-guiregistermsg-replacement-for-guictrlsetonevent-and-guigetmsg/
;~ Thanks to mikell
;~ http://www.autoitscript.com/forum/topic/161985-how-to-close-gui-with-guiregistermsg/
; Install a custom error handler
Global $oMyError = ObjEvent("AutoIt.Error", "_ComErrFunc")
Global $__hExampleGUI
Global $__idOPEN
Global $_fExit
Global $__hACROBAT_GUI = ''
Global $__idACROBAT_GUI_CTRL_AX = ''
Global $__oACROBAT_READER = ''
#include <GUIConstantsEx.au3>
;~ GUIRegisterMsg($WM_ERASEBKGND, "_WM_EXTRACTOR")
;~ GUIRegisterMsg($WM_PAINT, "_WM_EXTRACTOR")
;~ GUIRegisterMsg($WM_ACTIVATE, "_WM_EXTRACTOR")
;~ GUIRegisterMsg($WM_CAPTURECHANGED, "_WM_EXTRACTOR")
;~ GUIRegisterMsg($WM_DEVICECHANGE, "_WM_EXTRACTOR")
GUIRegisterMsg($WM_EXITSIZEMOVE, "_WM_EXTRACTOR")
GUIRegisterMsg($WM_COMMAND, "_WM_EXTRACTOR")
GUIRegisterMsg($WM_SYSCOMMAND, "_WM_EXTRACTOR")
GUIRegisterMsg($WM_HSCROLL, "_WM_EXTRACTOR")
_ExampleProgram_Gui()
While 1
Sleep(10)
If $_fExit Then
_ACROBAT_GUI_DELETE()
DeleteGui()
Exit
EndIf
WEnd
Func DeleteGui()
GUIDelete($__hExampleGUI)
EndFunc ;==>DeleteGui
Func _ExampleProgram_Gui()
; Create a GUI with various controls.
$__hExampleGUI = GUICreate("Example")
$__idOPEN = GUICtrlCreateButton("&Open", 310, 370, 85, 25)
; Display the GUI.
GUISetState(@SW_SHOW, $__hExampleGUI)
EndFunc ;==>_ExampleProgram_Gui
#Region ACROBAT FUNCTION
Func _AcrobatInit()
$__oACROBAT_READER = ObjCreate("AcroPDF.PDF.1");
Return $__oACROBAT_READER.GetVersions
EndFunc ;==>_AcrobatInit
Func _Acrobat_Events(ByRef $aMSG)
If $aMSG[1] = $__hACROBAT_GUI Then
Switch $aMSG[0]
Case $GUI_EVENT_CLOSE
_ACROBAT_GUI_DELETE()
EndSwitch
EndIf
EndFunc ;==>_Acrobat_Events
Func _ACROBAT_Destroy()
$__oACROBAT_READER = ""
;~ MsgBox(1,'test','destroyed')
EndFunc ;==>_ACROBAT_Destroy
Func _AcrobatShow($sFile, $sTitle = "PDF ", $iLeft = 50, $iTop = 0, $iWidth = 1000, $iHeight = 700)
If FileExists($sFile) Then
_AcrobatInit()
; Set option
$__oACROBAT_READER.src = $sFile
$__oACROBAT_READER.SetLayoutMode(4)
$__oACROBAT_READER.SetPageMode(1)
$__oACROBAT_READER.SetShowToolbar(0)
$__oACROBAT_READER.SetView(1)
; Create GUI
$__hACROBAT_GUI = GUICreate($sTitle, $iWidth, $iHeight, $iLeft, $iTop, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_MAXIMIZEBOX))
$__idACROBAT_GUI_CTRL_AX = GUICtrlCreateObj($__oACROBAT_READER, 5, 5, $iWidth - 20, $iHeight - 10)
GUICtrlSetStyle($__idACROBAT_GUI_CTRL_AX, $WS_VISIBLE)
GUISetState()
EndIf
EndFunc ;==>_AcrobatShow
Func _ACROBAT_Refresh()
If IsObj($__oACROBAT_READER) Then
Local $hPreviouslyGui = GUISwitch($__hACROBAT_GUI)
GUISetState(@SW_LOCK)
Local $iGUI_PDFWidth = WinGetPos($__hACROBAT_GUI)[2] - 20
Local $iGUI_PDFHeight = WinGetPos($__hACROBAT_GUI)[3] - 40
Local $sFile = $__oACROBAT_READER.src
; this below line do not works with Acro Reader
; Local $iCurrentPage = $__oACROBAT_READER.GetNumber
Local $iCurrentPage = 0
_ACROBAT_Destroy()
GUICtrlDelete($__idACROBAT_GUI_CTRL_AX)
_AcrobatInit()
$__idACROBAT_GUI_CTRL_AX = GUICtrlCreateObj($__oACROBAT_READER, 5, 5, $iGUI_PDFWidth, $iGUI_PDFHeight)
$__oACROBAT_READER.src = $sFile
;~ $__oACROBAT_READER.SetCurrentPage($iCurrentPage)
GUISetState(@SW_UNLOCK)
GUISwitch($hPreviouslyGui)
EndIf
EndFunc ;==>_ACROBAT_Refresh
Func _ACROBAT_GUI_DELETE()
_ACROBAT_Destroy()
if IsHWnd($__hACROBAT_GUI) then GUIDelete($__hACROBAT_GUI)
EndFunc ;==>_ACROBAT_GUI_DELETE
#EndRegion ACROBAT FUNCTION
#Region MSG and ERROR HANDLER
Func _WM_EXTRACTOR($hWnd, $iMsg, $wParam, $lParam)
;~ ConsoleWrite('! $hWnd = ' & $hWnd & ' $iMsg = ' & $iMsg & '('&HEX($iMsg)&')'& ' $wParam = ' & $wParam & ' $lParam = ' & $lParam & @CRLF)
If $hWnd = ControlGetHandle($__hACROBAT_GUI, '', $__idACROBAT_GUI_CTRL_AX) Then
ConsoleWrite('! -------------- $hWnd = ' & $hWnd & ' $iMsg = ' & $iMsg & '(' & Hex($iMsg) & ')' & ' $wParam = ' & $wParam & ' $lParam = ' & $lParam & @CRLF)
EndIf
If $hWnd = $__hACROBAT_GUI Then
Switch $iMsg
Case $WM_COMMAND
#cs
Case $WM_ACTIVATE
Local $test = BitAND($wParam, 0x00000004)
if $test <> 0 then
MsgBox(1,'$WM_ACTIVATE','test')
_ACROBAT_Refresh()
EndIf
Case $WM_ERASEBKGND
WinGetHandle("[ACTIVE]")
if $__hACROBAT_GUI <> _WinAPI_GetWindow ( $__hACROBAT_GUI, $GW_HWNDPREV ) then
ConsoleWrite('! Case $WM_ERASEBKGND' & @CRLF)
_ACROBAT_Refresh()
_WinAPI_RedrawWindow($__hACROBAT_GUI,0,0,$RDW_NOERASE)
EndIf
Case $WM_PAINT
_WinAPI_RedrawWindow($__hACROBAT_GUI,0,0,$RDW_NOERASE)
Case $WM_CAPTURECHANGED
_ACROBAT_Refresh()
Case $WM_DEVICECHANGE
_ACROBAT_Refresh()
#ce
Case $WM_EXITSIZEMOVE
_ACROBAT_Refresh()
Case $WM_SYSCOMMAND
;~ Local $test = BitAND($wParam, 0xFFF0)
Local $test = BitAND($wParam, 0x0000FFFF)
Switch $test
Case $SC_CLOSE
_ACROBAT_GUI_DELETE()
Case $SC_CONTEXTHELP
Case $SC_DEFAULT
Case $SC_HOTKEY
Case $SC_HSCROLL
Case $SC_KEYMENU
Case $SC_MAXIMIZE
_ACROBAT_Refresh()
Case $SC_MINIMIZE
Case $SC_MONITORPOWER
Case $SC_MOUSEMENU
Case $SC_MOVE
;~ _ACROBAT_Refresh()
Case $SC_NEXTWINDOW
;~ _ACROBAT_Refresh()
Case $SC_PREVWINDOW
;~ _ACROBAT_Refresh()
Case $SC_RESTORE
_ACROBAT_Refresh()
Case $SC_SCREENSAVE
Case $SC_SIZE
Case $SC_TASKLIST
Case $SC_VSCROLL
EndSwitch
EndSwitch
EndIf
If $hWnd = $__hExampleGUI Then
Switch $iMsg
Case $WM_COMMAND
Local $nID = BitAND($wParam, 0x0000FFFF)
Local $hCtrl = $lParam
Switch $nID
Case $__idOPEN
if not IsObj($__oACROBAT_READER) then
_AcrobatShow(FileOpenDialog("Choose PDF", "C:\Temp", "PDF Files(*.pdf)", 3)) ; put your own start folder here)
EndIf
EndSwitch
Case $WM_SYSCOMMAND
Local $test = BitAND($wParam, 0xFFF0)
Switch $test
Case $SC_CLOSE
$_fExit = True
Case $SC_CONTEXTHELP
Case $SC_DEFAULT
Case $SC_HOTKEY
Case $SC_HSCROLL
Case $SC_KEYMENU
Case $SC_MAXIMIZE
Case $SC_MINIMIZE
Case $SC_MONITORPOWER
Case $SC_MOUSEMENU
Case $SC_MOVE
Case $SC_NEXTWINDOW
Case $SC_PREVWINDOW
Case $SC_RESTORE
Case $SC_SCREENSAVE
Case $SC_SIZE
Case $SC_TASKLIST
Case $SC_VSCROLL
EndSwitch
EndSwitch
EndIf
Return $GUI_RUNDEFMSG
EndFunc ;==>_WM_EXTRACTOR
Func _ComErrFunc()
Local $HexNumber = Hex($oMyError.number, 8)
MsgBox(0, "AutoItCOM Test", _
"We intercepted a COM Error !" & @CRLF & @CRLF & _
"err.description is: " & @TAB & $oMyError.description & @CRLF & _
"err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
"err.number is: " & @TAB & $HexNumber & @CRLF & _
"err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
"err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
"err.source is: " & @TAB & $oMyError.source & @CRLF & _
"err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
"err.helpcontext is: " & @TAB & $oMyError.helpcontext _
)
SetError(1)
EndFunc ;==>_ComErrFunc
#EndRegion MSG and ERROR HANDLER
Any comments are welcome.
Cheers
mLipok