by Frosti » 02 Aug 2020, 11:02
Ich habe die
LV_ExtListview Bibliothek von cyrus benutzt um im Druckdialog von Sumatra Zugriff auf das SysListview321-Steuerlement zu erhalten.
Das funktioniert soweit gut, solange ich eine 32bit Variante einer Autohotkey.exe (AHK-L in meinem Fall AHK-H) verwende. Ansonsten wird der Fehlercode:
87 ausgeworfen (ERROR_INVALID_PARAMETER - The parameter is incorrect).
Die Bibliothek kann lt. Beschreibung mit 32/64bit ANSI oder Unicode umgehen. Achtung in meinem Fall habe ich die Zeile
NumPut( (bSelect) ? 0x0003 : 0x0000, LVITEM, 12, "UInt" ) geändert (focused and selected).
Code: Select all
Error in #include file "M:\Praxis\Skripte\Skripte Neu\Addendum für AlbisOnWindows\lib\LV_ExtListView.ahk":
objLV.pwritebuf: error writing memory
Specifically: LastError: 87
Line#
092: VarSetCapacity( LVITEM, objLV.szwritebuf, 0 )
093: NumPut( 0x0008, LVITEM, 0, "UInt")
094: NumPut( nItem, LVITEM, 4, "Int" )
095: NumPut( 0, LVITEM, 8, "Int" )
096: NumPut( (bSelect) ? 0x0003 : 0x0000, LVITEM, 12, "UInt")
097: NumPut( 0x0003, LVITEM, 16, "UInt")
099: if ( !DllCall( "WriteProcessMemory", Ptr,objLV.hproc, Ptr,objLV.pwritebuf, Ptr,&LVITEM, UInt,objLV.szwritebuf, UInt,0 ) )
---> 100: Throw,Exception("objLV.pwritebuf: error writing memory", "WriteProcessMemory", "LastError: " A_LastError)
101: SendMessage,0x102B,nItem,objLV.pwritebuf,,"ahk_id " objLV.hlv
103: Return,ErrorLevel
104: }
106: {
111: PROCESS_ALL_ACCESS := 0x001F0FFF
112: INVALID_HANDLE_VALUE := 0xFFFFFFFF
113: PAGE_READWRITE := 4
The current thread will exit.
Für's Testen mein Code (Druckdialog muss geöffnet sein!).
Code: Select all
SetTitleMatchMode, RegEx
sumatraprint := "i)[(Print)|(Drucken)] ahk_class i)#32770 ahk_exe i)SumatraPDF.exe"
StandardA4 := "Microsoft Print to PDF"
rxPrinter:= StrReplace(Trim(StandardA4), " ", "\s")
rxPrinter:= StrReplace(rxPrinter, "(", "\(")
rxPrinter:= StrReplace(rxPrinter, ")", "\)")
hSumatra := WinExist("ahk_class SUMATRA_PDF_FRAME")
hSumatraprint := GetHex(WinExist(sumatraprint))
; Handle der SysListview321 (Druckerliste)
ControlGet, hLV, Hwnd,, SysListview321, % "ahk_id " hSumatraprint
; Auslesen der vorhandenen Drucker
ControlGet, Items , List , Col1 ,, % "ahk_id " hLV
; Listview Position des Standarddrucker suchen
ItemNr := 0
Loop, Parse, Items, `n
If RegExMatch(A_LoopField, "i)" rxPrinter) {
ItemNr := A_Index
break
}
; Drucker in der externen Listview auswählen
If ItemNr {
objLV := ExtListView_Initialize(sumatraprint)
ControlFocus,, % "ahk_id " objLV.hlv
err := ExtListView_ToggleSelection(objLV, 1, ItemNr - 1)
ExtListView_DeInitialize(objLV)
}
else {
MsgBox, % "Drucker: " StandardA4 "`nkonnte nicht gefunden werden."
}
Ich hoffe jemand kann mir da weiterhelfen.
Anmerkung:
Ich kann das Dokument nicht per cli-Aufruf ausdrucken, da die Dokumente in meiner Verwaltungssoftware hinterlegt sind. Die Software startet je nach Arbeitsplatzeinstellung entweder Sumatra oder der FoxitReader.
Sinn des Ganzen ist ein automatisierter Druck eines Dokumentes. Das bietet meine Software leider nicht.
Ich habe die [url=https://github.com/cyruz-git/ahk-libs/blob/3e06929dbe7da02492ece096f850575bf2c134a9/ExtListView.ahk]LV_ExtListview[/url] Bibliothek von cyrus benutzt um im Druckdialog von Sumatra Zugriff auf das SysListview321-Steuerlement zu erhalten.
Das funktioniert soweit gut, solange ich eine 32bit Variante einer Autohotkey.exe (AHK-L in meinem Fall AHK-H) verwende. Ansonsten wird der Fehlercode: [b]87[/b] ausgeworfen (ERROR_INVALID_PARAMETER - The parameter is incorrect).
Die Bibliothek kann lt. Beschreibung mit 32/64bit ANSI oder Unicode umgehen. Achtung in meinem Fall habe ich die Zeile [c]NumPut( (bSelect) ? 0x0003 : 0x0000, LVITEM, 12, "UInt" )[/c] geändert (focused and selected).
[code]
Error in #include file "M:\Praxis\Skripte\Skripte Neu\Addendum für AlbisOnWindows\lib\LV_ExtListView.ahk":
objLV.pwritebuf: error writing memory
Specifically: LastError: 87
Line#
092: VarSetCapacity( LVITEM, objLV.szwritebuf, 0 )
093: NumPut( 0x0008, LVITEM, 0, "UInt")
094: NumPut( nItem, LVITEM, 4, "Int" )
095: NumPut( 0, LVITEM, 8, "Int" )
096: NumPut( (bSelect) ? 0x0003 : 0x0000, LVITEM, 12, "UInt")
097: NumPut( 0x0003, LVITEM, 16, "UInt")
099: if ( !DllCall( "WriteProcessMemory", Ptr,objLV.hproc, Ptr,objLV.pwritebuf, Ptr,&LVITEM, UInt,objLV.szwritebuf, UInt,0 ) )
---> 100: Throw,Exception("objLV.pwritebuf: error writing memory", "WriteProcessMemory", "LastError: " A_LastError)
101: SendMessage,0x102B,nItem,objLV.pwritebuf,,"ahk_id " objLV.hlv
103: Return,ErrorLevel
104: }
106: {
111: PROCESS_ALL_ACCESS := 0x001F0FFF
112: INVALID_HANDLE_VALUE := 0xFFFFFFFF
113: PAGE_READWRITE := 4
The current thread will exit.
[/code]
Für's Testen mein Code (Druckdialog muss geöffnet sein!).
[code]
SetTitleMatchMode, RegEx
sumatraprint := "i)[(Print)|(Drucken)] ahk_class i)#32770 ahk_exe i)SumatraPDF.exe"
StandardA4 := "Microsoft Print to PDF"
rxPrinter:= StrReplace(Trim(StandardA4), " ", "\s")
rxPrinter:= StrReplace(rxPrinter, "(", "\(")
rxPrinter:= StrReplace(rxPrinter, ")", "\)")
hSumatra := WinExist("ahk_class SUMATRA_PDF_FRAME")
hSumatraprint := GetHex(WinExist(sumatraprint))
; Handle der SysListview321 (Druckerliste)
ControlGet, hLV, Hwnd,, SysListview321, % "ahk_id " hSumatraprint
; Auslesen der vorhandenen Drucker
ControlGet, Items , List , Col1 ,, % "ahk_id " hLV
; Listview Position des Standarddrucker suchen
ItemNr := 0
Loop, Parse, Items, `n
If RegExMatch(A_LoopField, "i)" rxPrinter) {
ItemNr := A_Index
break
}
; Drucker in der externen Listview auswählen
If ItemNr {
objLV := ExtListView_Initialize(sumatraprint)
ControlFocus,, % "ahk_id " objLV.hlv
err := ExtListView_ToggleSelection(objLV, 1, ItemNr - 1)
ExtListView_DeInitialize(objLV)
}
else {
MsgBox, % "Drucker: " StandardA4 "`nkonnte nicht gefunden werden."
}
[/code]
Ich hoffe jemand kann mir da weiterhelfen.
Anmerkung:
Ich kann das Dokument nicht per cli-Aufruf ausdrucken, da die Dokumente in meiner Verwaltungssoftware hinterlegt sind. Die Software startet je nach Arbeitsplatzeinstellung entweder Sumatra oder der FoxitReader.
Sinn des Ganzen ist ein automatisierter Druck eines Dokumentes. Das bietet meine Software leider nicht.