 |
AutoHotkey Community Wir helfen uns gegenseitig aus der Patsche
|
| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
Jochen
Anmeldedatum: 30.01.2008 Beiträge: 103
|
Verfasst am: Di Mai 13, 2008 7:36 pm Titel: Fensterinhalt drucken - Die Zweite |
|
|
Hallo zusammen!
Ich habe eine Nachfrage zu Thema http://de.autohotkey.com/forum/viewtopic.php?t=1420&start=15
"Fensterinhalt drucken".
Kann man in dem Skript von Obi-Wahn irgendwie einfach den jeweiligen Standard-Drucker ansprechen?
Auch bei mir klappt die Eingabe des Druckernamen (auch in verschiedenen Modifikationen) einfach nicht.
Wenn man den Standarddrucker definieren könnte, könnte man solche Probleme elegant umschiffen!
Dank Euch!
Jochen _________________ Jochen |
|
| Nach oben |
|
 |
fredchf
Anmeldedatum: 18.09.2006 Beiträge: 605 Wohnort: Deutschland
|
Verfasst am: Di Mai 13, 2008 9:00 pm Titel: |
|
|
hallo,
den aktuellen standartdrucker kannst du z.b. so in eine var speichern.
| Code: | RegRead, standartdrucker, HKCU, Software\Microsoft\Windows NT\CurrentVersion\Windows, Device
RegExMatch(standartdrucker, "\\\\.+\\(.+?)(?=,)", da)
MsgBox, % da1 |
_________________ Mit freundlichen Grüßen
fredchf |
|
| Nach oben |
|
 |
Jochen
Anmeldedatum: 30.01.2008 Beiträge: 103
|
Verfasst am: Mi Mai 14, 2008 7:35 am Titel: |
|
|
Hallo frechf,
Danke erstmal; leider funkts noch nicht.
Daran, daß ich den "standartdrucker" in "standarddrucker" umbenannt habe, kanns ja nicht liegen, oder?
Mir ist auch nicht ganz klar, wofür die MsgBox gut ist.
DAS ist mein Code; bis zum erstellen der jpg.-Datei ist auch alles gut, aber es wird halt nichts gedruckt.
| Code: |
;
; AutoHotkey Version: 1.x
; Language: English
; Platform: Win9x/NT
; Author: A.N.Other <myemail@nowhere.com>
;
; Script Function:
; Template script (you can customize this template by editing "ShellNew\Template.ahk" in your Windows folder)
;
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
#SingleInstance, force
RegRead, standarddrucker, HKCU, Software\Microsoft\Windows NT\CurrentVersion\Windows, Device
RegExMatch(standarddrucker, "\\\\.+\\(.+?)(?=,)", da)
MsgBox, % da1
^d::
Gui, -Caption -Border
Gui, Color, White
Clipboard =
Send, !{PrintScreen}
sFileTo := "C:\ImageTo.jpg" ; Adjust the name
Ansi2Unicode(sFileTo, wFileTo)
GUID4String(ImageCodecJPG, "{557CF401-1A04-11D3-9A73-0000F81EF32E}")
VarSetCapacity(xParam, 4 + 28 + 4)
nValue := 14
GUID4String(EncoderTransformation, "{8D0EB2D1-A58E-4EA8-AA14-108074B7B6F9}") ; Transformation: 13 14 15 16 17
EncodeInteger(&xParam + 0, 1) ; number of list
RtlMoveMemory(&xParam + 4, &EncoderTransformation, 16) ; 16 byte CLSID of Encoder
EncodeInteger(&xParam + 20, 1) ; number of values
EncodeInteger(&xParam + 24, 4) ; type of values
EncodeInteger(&xParam + 28, &xParam + 32) ; address of the value
EncodeInteger(&xParam + 32, nValue)
hGdiPlus := DllCall("LoadLibrary", "str", "gdiplus.dll")
VarSetCapacity(si, 16, 0)
si := Chr(1)
DllCall("gdiplus\GdiplusStartup", "UintP", pToken, "Uint", &si, "Uint", 0)
; Ab hier zugriff auf die zwischenablage
DllCall("OpenClipboard", "Uint", 0)
If DllCall("IsClipboardFormatAvailable", "Uint", 2)
hBM := DllCall("GetClipboardData", "Uint", 2)
DllCall("CloseClipboard")
If !hBM
ExitApp
DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "Uint", hBM, "Uint", 0, "UintP", pImage)
; Ende zwischenablagezugriff
DllCall("gdiplus\GdipSaveImageToFile" , "Uint", pImage, "str", wFileTo, "str", ImageCodecJPG, "str", xParam)
DllCall("gdiplus\GdipDisposeImage", "Uint", pImage)
DllCall("gdiplus\GdiplusShutdown" , "Uint", pToken)
DllCall("FreeLibrary", "Uint", hGdiPlus)
; Hier die zeile unterhalb in den Code einfügen...
RunWait, %A_Windir%\system32\rundll32.exe shimgvw.dll,ImageView_PrintTo /pt "C:\ImageTo.jpg" "%standarddrucker%"
;Filedelete, C:\ImageTo.jpg
; Löscht den screenshot wieder...
Return
; Funktionen unterhalb
RtlMoveMemory(pDst, pSrc, nSize = 1)
{
DllCall("RtlMoveMemory", "Uint", pDst, "Uint", pSrc, "Uint", nSize)
}
; Das notwendigste aus der COMHelper (COHelper.ahk)
Ansi2Unicode(ByRef sString, ByRef wString, nLen = 0)
{
If !nLen
nLen := DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", 0, "int", 0)
VarSetCapacity(wString, nLen * 2 + 1)
DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", &wString, "int", nLen)
}
GUID4String(Byref CLSID, sString)
{
VarSetCapacity(CLSID, 16)
Ansi2Unicode(sString, wString, 38)
DllCall("ole32\CLSIDFromString", "str", wString, "str", CLSID)
}
EncodeInteger(ref, val, nSize = 4)
{
DllCall("RtlMoveMemory", "Uint", ref, "int64P", val, "Uint", nSize)
}
|
Ich hätte gern, daß der Screenshot zur Not mit einer Standardanwendung (z.B. Internet Explorer o.ä.) asugedruckt wird, also ohne IrfanView o.ä. _________________ Jochen |
|
| Nach oben |
|
 |
Obi-Wahn
Anmeldedatum: 19.04.2006 Beiträge: 538 Wohnort: Wien
|
Verfasst am: Mi Mai 14, 2008 7:46 am Titel: |
|
|
Is doch klar, dass es nicht funktioniert:
| Code: | RegExMatch(standarddrucker, "\\\\.+\\(.+?)(?=,)", da)
MsgBox, % da1
; Hier stimmt die variable (%da1%)
; ....
RunWait, %A_Windir%\system32\rundll32.exe shimgvw.dll,ImageView_PrintTo /pt "C:\ImageTo.jpg" "%standarddrucker%"
; Aber hier nicht. nicht %standarddrucker%, sondern %da1% |
EDIT: Ich hab mal den alten Code etwas raffiniert:
| Code: | /*
CREDITS:
| Sean
| Lazlo
|
| URLS:
| http://www.autohotkey.com/forum/viewtopic.php?t=17179&highlight=gdi
| http://www.autohotkey.com/forum/topic16631.html
| http://www.a-bit-more.de/userhomes/www.a-bit-more.de/cms/produkte/ITHau.Apps.ImageManipulator/Manual.html
|
| MODIFICATIONS:
| Alle unnötigen (auskommatierten zeilen entfernt.
| Ausdruck-Dll-Call hinzugefügt
*/
#NoEnv
SendMode Input
#SingleInstance, force
F12::TakeAShot("Window", 0, 1, 1)
TakeAShot(Area, AskForLocation = 1, PrintIt = 0, DeleteOnFinishedPrint = 1) {
ClpBak := ClipboardAll
IfEqual, Area, Screen, Send, {PrintScreen}
Else, Send, !{PrintScreen}
IfEqual, AskForLocation, 1, FileSelectFile, Img, S, , Bitte Speicherpfad angeben, JPG-Bilder (*.jpg)
Else, SetEnv, Img, %A_Temp%\temp.jpg
Ansi2Unicode(Img, wFileTo)
GUID4String(ImageCodecJPG, "{557CF401-1A04-11D3-9A73-0000F81EF32E}")
VarSetCapacity(xParam, 4 + 28 + 4)
GUID4String(EncoderTransformation, "{8D0EB2D1-A58E-4EA8-AA14-108074B7B6F9}") ; Transformation: 13 14 15 16 17
EncodeInteger(&xParam + 0, 1) ; number of list
RtlMoveMemory(&xParam + 4, &EncoderTransformation, 16) ; 16 byte CLSID of Encoder
EncodeInteger(&xParam + 20, 1) ; number of values
EncodeInteger(&xParam + 24, 4) ; type of values
EncodeInteger(&xParam + 28, &xParam + 32) ; address of the value
EncodeInteger(&xParam + 32, 14)
hGdiPlus := DllCall("LoadLibrary", "str", "gdiplus.dll")
VarSetCapacity(si, 16, 0)
si := Chr(1)
DllCall("gdiplus\GdiplusStartup", "UintP", pToken, "Uint", &si, "Uint", 0)
; Ab hier zugriff auf die zwischenablage
DllCall("OpenClipboard", "Uint", 0)
If DllCall("IsClipboardFormatAvailable", "Uint", 2)
hBM := DllCall("GetClipboardData", "Uint", 2)
DllCall("CloseClipboard")
If !hBM
Return, 1
DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "Uint", hBM, "Uint", 0, "UintP", pImage)
; Ende zwischenablagezugriff
DllCall("gdiplus\GdipSaveImageToFile" , "Uint", pImage, "str", wFileTo, "str", ImageCodecJPG, "str", xParam)
DllCall("gdiplus\GdipDisposeImage", "Uint", pImage)
DllCall("gdiplus\GdiplusShutdown" , "Uint", pToken)
DllCall("FreeLibrary", "Uint", hGdiPlus)
If PrintIt = 1 {
RegRead, StdPrnt, HKCU, Software\Microsoft\Windows NT\CurrentVersion\Windows, Device
StringSplit, PrntrName, StdPrnt, `,
RunWait, %A_Windir%\system32\rundll32.exe shimgvw.dll,ImageView_PrintTo /pt "%Img%" "%PrntrName1%"
IfEqual, DeleteOnFinishedPrint, 1, FileDelete, %Img%
}
Return, 0
}
RtlMoveMemory(pDst, pSrc, nSize = 1) {
DllCall("RtlMoveMemory", "Uint", pDst, "Uint", pSrc, "Uint", nSize)
}
; Das notwendigste aus der COMHelper (COHelper.ahk)
Ansi2Unicode(ByRef sString, ByRef wString, nLen = 0) {
If !nLen
nLen := DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", 0, "int", 0)
VarSetCapacity(wString, nLen * 2 + 1)
DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", &wString, "int", nLen)
}
GUID4String(Byref CLSID, sString) {
VarSetCapacity(CLSID, 16)
Ansi2Unicode(sString, wString, 38)
DllCall("ole32\CLSIDFromString", "str", wString, "str", CLSID)
}
EncodeInteger(ref, val, nSize = 4) {
DllCall("RtlMoveMemory", "Uint", ref, "int64P", val, "Uint", nSize)
} |
Das Gui, ... unter dem F12 kann man sich sparen, wenn man nicht eine AHK GUI ausdrucken will.
Man kann auch noch einen Drucker-Auswahl-Dialog hinzufügen, aber dafür hab ich keinen bock gerade....
Greets
BTW:
Im englischen AHK Forum hab ich auch noch was gefunden. Vllt. brauchts ja wer...
| Code: | GetDefaultPrinter() {
DllCall("winspool.drv\GetDefaultPrinterA", "str", gPrinter, "UintP", VarSetCapacity(gPrinter, 256))
Return, %gPrinter%
}
SetDefaultPrinter(sPrinter) {
DllCall("winspool.drv\SetDefaultPrinterA", "str", sPrinter)
Return, %Errorlevel%
} |
In diesem Sinne
Mahlzeit _________________ Garten ist eine Kunstnatur
Das Leben ist nicht fair. Es ist nur fairer als der Tod, das ist alles.
Obi-Wahns Codeschnipsel @ securityvision.ch |
|
| Nach oben |
|
 |
Jochen
Anmeldedatum: 30.01.2008 Beiträge: 103
|
Verfasst am: Mi Mai 14, 2008 2:58 pm Titel: |
|
|
Hi Obi-Wahn,
Danke für den Tip - Allerdings funkts auch mit der korrigierten Variable bei mir nicht.
Die Datei wird korrekt erstellt aber nicht gedruckt.
Den optimierten Code hab´ ich ausprobiert, da gibt´s glaub ich noch einen Fehler in Zeile 60
If PrintIt = 1 {
Habe die Klammer dann in die nächste Zeile gesetzt:
If PrintIt = 1
{
dann läuft das Script, allerdings wird weder was gedruckt, noch gibt´s ein GUI. _________________ Jochen |
|
| Nach oben |
|
 |
Obi-Wahn
Anmeldedatum: 19.04.2006 Beiträge: 538 Wohnort: Wien
|
Verfasst am: Mi Mai 14, 2008 3:32 pm Titel: |
|
|
| Code: | /*
CREDITS:
| Sean
| Lazlo
|
| URLS:
| http://www.autohotkey.com/forum/viewtopic.php?t=17179&highlight=gdi
| http://www.autohotkey.com/forum/topic16631.html
| http://www.a-bit-more.de/userhomes/www.a-bit-more.de/cms/produkte/ITHau.Apps.ImageManipulator/Manual.html
|
| MODIFICATIONS:
| Alle unnötigen (auskommatierten zeilen entfernt.
| Ausdruck-Dll-Call hinzugefügt
*/
#NoEnv
SendMode Input
#SingleInstance, force
F12::TakeAShot("Window", 0, 1)
Return
TakeAShot(Area, AskForLocation = 1, PrintIt = 0, DeleteOnFinishedPrint = 1) {
Clipboard =
IfEqual, Area, Screen, Send, {PrintScreen}
Else, Send, !{PrintScreen}
IfEqual, AskForLocation, 1, FileSelectFile, Img, S, , Bitte Speicherpfad angeben..., JPG-Bilder (*.jpg)
Else, SetEnv, Img, C:\image
Img = %Img%.jpg
Ansi2Unicode(Img, wFileTo)
GUID4String(ImageCodecJPG, "{557CF401-1A04-11D3-9A73-0000F81EF32E}")
VarSetCapacity(xParam, 4 + 28 + 4)
GUID4String(EncoderTransformation, "{8D0EB2D1-A58E-4EA8-AA14-108074B7B6F9}") ; Transformation: 13 14 15 16 17
EncodeInteger(&xParam + 0, 1) ; number of list
RtlMoveMemory(&xParam + 4, &EncoderTransformation, 16) ; 16 byte CLSID of Encoder
EncodeInteger(&xParam + 20, 1) ; number of values
EncodeInteger(&xParam + 24, 4) ; type of values
EncodeInteger(&xParam + 28, &xParam + 32) ; address of the value
EncodeInteger(&xParam + 32, 14)
hGdiPlus := DllCall("LoadLibrary", "str", "gdiplus.dll")
VarSetCapacity(si, 16, 0)
si := Chr(1)
DllCall("gdiplus\GdiplusStartup", "UintP", pToken, "Uint", &si, "Uint", 0)
; Ab hier zugriff auf die zwischenablage
DllCall("OpenClipboard", "Uint", 0)
If DllCall("IsClipboardFormatAvailable", "Uint", 2)
hBM := DllCall("GetClipboardData", "Uint", 2)
DllCall("CloseClipboard")
If !hBM
Return, 1
DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "Uint", hBM, "Uint", 0, "UintP", pImage)
; Ende zwischenablagezugriff
DllCall("gdiplus\GdipSaveImageToFile" , "Uint", pImage, "str", wFileTo, "str", ImageCodecJPG, "str", xParam)
DllCall("gdiplus\GdipDisposeImage", "Uint", pImage)
DllCall("gdiplus\GdiplusShutdown" , "Uint", pToken)
DllCall("FreeLibrary", "Uint", hGdiPlus)
If (PrintIt = 1) {
RegRead, StdPrnt, HKCU, Software\Microsoft\Windows NT\CurrentVersion\Windows, Device
StringSplit, PrntrName, StdPrnt, `,
RunWait, %comspec% /c "rundll32.exe shimgvw.dll`,ImageView_PrintTo /pt "%Img%" "%PrntrName1%"", , Hide
IfEqual, DeleteOnFinishedPrint, 1, FileDelete, %Img%
}
Return, 0
}
RtlMoveMemory(pDst, pSrc, nSize = 1) {
DllCall("RtlMoveMemory", "Uint", pDst, "Uint", pSrc, "Uint", nSize)
}
; Das notwendigste aus der COMHelper (COHelper.ahk)
Ansi2Unicode(ByRef sString, ByRef wString, nLen = 0) {
If !nLen
nLen := DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", 0, "int", 0)
VarSetCapacity(wString, nLen * 2 + 1)
DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", &wString, "int", nLen)
}
GUID4String(Byref CLSID, sString) {
VarSetCapacity(CLSID, 16)
Ansi2Unicode(sString, wString, 38)
DllCall("ole32\CLSIDFromString", "str", wString, "str", CLSID)
}
EncodeInteger(ref, val, nSize = 4) {
DllCall("RtlMoveMemory", "Uint", ref, "int64P", val, "Uint", nSize)
} |
Ja, hab ich auch gerade gesehen, das mit der If-Abfrage.
Ich hab den Code quasi Blind kopiert.
ich hab noch etwas herumgespielt, und jetzt hats auch funktioniert. Sollte also jetzt funktionieren (hoffentlich) _________________ Garten ist eine Kunstnatur
Das Leben ist nicht fair. Es ist nur fairer als der Tod, das ist alles.
Obi-Wahns Codeschnipsel @ securityvision.ch |
|
| Nach oben |
|
 |
Jochen
Anmeldedatum: 30.01.2008 Beiträge: 103
|
Verfasst am: Mi Mai 14, 2008 4:02 pm Titel: |
|
|
Hmm, langsam wirds spannend
F12 bringt bei mir die Fehler-MsgBox
RUNDLL
Fehler in shimgvw.dll
Folgender Eintrag fehlt: ImageView_PrinTo
Betriebssystem ist Win2000 _________________ Jochen |
|
| Nach oben |
|
 |
Obi-Wahn
Anmeldedatum: 19.04.2006 Beiträge: 538 Wohnort: Wien
|
Verfasst am: Mi Mai 14, 2008 4:16 pm Titel: |
|
|
Ok, das ist dann etwas problematisch. Ich hab XP Pro, und hab das mit der Dll über google gefunden, als ich in der hilfe den fotodruckassistenten etwas näher dafür untersucht hab....
Hat Win 2000 auch einen fotodruckassistenten?
EDIT:
So, nachdem ich wieder etwas klarer denken kann: Durch die Fehlermeldung würd ich darauf tippen, dass die shimgvw.dll bereits auf deinem Win2000 System ist.
Daher sollte sie in C:\Windows\system32\shimgvw.dll sein.
Dass diese Meldung aufpoppt heisst auch, dass die spezielle Funktion nicht vorhanden ist.
Daher würde ich dir mal raten, lade dir den DLL Export Viewer herunter und öffne damit die .dll
Vieleicht kommen wir so weiter, indem wir eine analoge funktion in der win2000 dll finden.
Schönen Abend noch
O-W _________________ Garten ist eine Kunstnatur
Das Leben ist nicht fair. Es ist nur fairer als der Tod, das ist alles.
Obi-Wahns Codeschnipsel @ securityvision.ch |
|
| Nach oben |
|
 |
Jochen
Anmeldedatum: 30.01.2008 Beiträge: 103
|
Verfasst am: Mi Mai 14, 2008 7:39 pm Titel: |
|
|
Ja, die Datei ist tatsächlich vorhanden; allerdings enthält sie nur ca. 50 Kb, gegenüber 450 Kb bei WinXP.
Austauschen bringt natürlich nix, weil Win2000 beim Neustart die ursprüngliche Version wiederherstellt.
Das Programm habe ich runtergeladen, aber in der Benutzung bin ich an meinen Grenzen...
Er zeigt mir
DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer
Demgegenüber zeigt die Datei aus WinXP:
ConvertDIBSECTIONTOThumbnail
DllCanUnloadNow
DllGetClassObject
DllInstall
DllRegisterServer
DllUnregisterServer
ImageView_COMServer
ImageView_FullScreen
ImageView_FullScreenA
ImageView_FullScreeW
imageview_fullScreenW
ImageView_PrinTo
ImageView_PrinToA
ImageView_PrinToW _________________ Jochen |
|
| Nach oben |
|
 |
Obi-Wahn
Anmeldedatum: 19.04.2006 Beiträge: 538 Wohnort: Wien
|
Verfasst am: Do Mai 15, 2008 8:47 am Titel: |
|
|
Ok, das ist wenig. Ich schätze, da wird dir nicht viel anderes ürbigbleiben als über ein Zweittool (z.b. Irfanview) zu drucken... Sorry. _________________ Garten ist eine Kunstnatur
Das Leben ist nicht fair. Es ist nur fairer als der Tod, das ist alles.
Obi-Wahns Codeschnipsel @ securityvision.ch |
|
| Nach oben |
|
 |
Jochen
Anmeldedatum: 30.01.2008 Beiträge: 103
|
Verfasst am: Fr Mai 16, 2008 9:09 am Titel: |
|
|
Ok,
Ich habe mir für Win2000 und XP einen Workaround überr den InternetExplorer gebastelt, da dieser zwangsläufig auf jedem Windows-Rechner vorhanden ist.
Bischen blöd ist halt, daß das Fenster dann immer aufpoppt, aber es funkt halt.
Unter Vista schaltet sich die Funktion bei mit aber aus; offensichtlich kommt die Zeile
If !hBM
ExitApp
zum tragen.
Blöde Frage: Was bedeutet die?
| Code: |
Gui, -Caption -Border
Gui, Color, White
Clipboard =
Send, !{PrintScreen}
sFileTo := "C:\ImageTo.jpg" ; Adjust the name
Ansi2Unicode(sFileTo, wFileTo)
GUID4String(ImageCodecJPG, "{557CF401-1A04-11D3-9A73-0000F81EF32E}")
VarSetCapacity(xParam, 4 + 28 + 4)
nValue := 14
GUID4String(EncoderTransformation, "{8D0EB2D1-A58E-4EA8-AA14-108074B7B6F9}") ; Transformation: 13 14 15 16 17
EncodeInteger(&xParam + 0, 1) ; number of list
RtlMoveMemory(&xParam + 4, &EncoderTransformation, 16) ; 16 byte CLSID of Encoder
EncodeInteger(&xParam + 20, 1) ; number of values
EncodeInteger(&xParam + 24, 4) ; type of values
EncodeInteger(&xParam + 28, &xParam + 32) ; address of the value
EncodeInteger(&xParam + 32, nValue)
hGdiPlus := DllCall("LoadLibrary", "str", "gdiplus.dll")
VarSetCapacity(si, 16, 0)
si := Chr(1)
DllCall("gdiplus\GdiplusStartup", "UintP", pToken, "Uint", &si, "Uint", 0)
; Ab hier zugriff auf die zwischenablage
DllCall("OpenClipboard", "Uint", 0)
If DllCall("IsClipboardFormatAvailable", "Uint", 2)
hBM := DllCall("GetClipboardData", "Uint", 2)
DllCall("CloseClipboard")
If !hBM
ExitApp
DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "Uint", hBM, "Uint", 0, "UintP", pImage)
; Ende zwischenablagezugriff
DllCall("gdiplus\GdipSaveImageToFile" , "Uint", pImage, "str", wFileTo, "str", ImageCodecJPG, "str", xParam)
DllCall("gdiplus\GdipDisposeImage", "Uint", pImage)
DllCall("gdiplus\GdiplusShutdown" , "Uint", pToken)
DllCall("FreeLibrary", "Uint", hGdiPlus)
; Hier die zeile unterhalb in den Code einfügen...
RunWait, %A_Windir%\system32\rundll32.exe shimgvw.dll,ImageView_PrintTo /pt "C:\ImageTo.jpg"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Hier kommt der Umweg über den InternetExplorer: ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Druck:
{
Run, "%A_ProgramFiles%\Internet Explorer\IEXPLORE.EXE" "C:\ImageTo.jpg"
WinActivate C:\ImageTo.jpg
WinWaitActive C:\ImageTo.jpg
Send !d
Send r
WinWaitActive Seite einrichten
Send !q
Send {TAB}4
Send {TAB}4
Send {TAB}4
Send {TAB}4
Send {ENTER}
Send ^p
WinWaitActive Drucken
WinActivate Drucken
Send !d
WinWaitNotActive Drucken
WinActivate C:\ImageTo.jpg
WinWaitActive C:\ImageTo.jpg
Send !{F4}
Filedelete, C:\ImageTo.jpg
ExitApp
GoSub Return
}
Return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Funktionen unterhalb
RtlMoveMemory(pDst, pSrc, nSize = 1)
{
DllCall("RtlMoveMemory", "Uint", pDst, "Uint", pSrc, "Uint", nSize)
}
; Das notwendigste aus der COMHelper (COHelper.ahk)
Ansi2Unicode(ByRef sString, ByRef wString, nLen = 0)
{
If !nLen
nLen := DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", 0, "int", 0)
VarSetCapacity(wString, nLen * 2 + 1)
DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", &wString, "int", nLen)
}
GUID4String(Byref CLSID, sString)
{
VarSetCapacity(CLSID, 16)
Ansi2Unicode(sString, wString, 38)
DllCall("ole32\CLSIDFromString", "str", wString, "str", CLSID)
}
EncodeInteger(ref, val, nSize = 4)
{
DllCall("RtlMoveMemory", "Uint", ref, "int64P", val, "Uint", nSize)
}
GoTo Druck
Return:
Return
|
_________________ Jochen |
|
| Nach oben |
|
 |
Obi-Wahn
Anmeldedatum: 19.04.2006 Beiträge: 538 Wohnort: Wien
|
Verfasst am: Fr Mai 16, 2008 10:52 am Titel: |
|
|
Bedeutet, dass wenn die Variable "hBM" leer ist, das programm beendet wird.
Hintergrund ist der, dass ein zugriff auf die Zwischenablage
| Code: | | hBM := DllCall("GetClipboardData", "Uint", 2) |
nicht möglich ist/war.
Weitere Interaktion im Code währe sinnlos, da kein Bild vorhanden. Ergo wurde die Abfrage eingebaut. _________________ Garten ist eine Kunstnatur
Das Leben ist nicht fair. Es ist nur fairer als der Tod, das ist alles.
Obi-Wahns Codeschnipsel @ securityvision.ch |
|
| Nach oben |
|
 |
Jochen
Anmeldedatum: 30.01.2008 Beiträge: 103
|
Verfasst am: Fr Mai 16, 2008 11:10 am Titel: |
|
|
Hm,
Hast Du eine Ahnung, warum es unter Vista dazu kommt? _________________ Jochen |
|
| Nach oben |
|
 |
Obi-Wahn
Anmeldedatum: 19.04.2006 Beiträge: 538 Wohnort: Wien
|
Verfasst am: Fr Mai 16, 2008 11:15 am Titel: |
|
|
Unter Vista hat sich vieles geändert - vieleicht auch diese .dll.
Ich hab den Code nur kopiert, aber vllt. reicht es auch einfach indem man die Variable %ClipboardAll% oder %Clipboard% verwendet, anstatt den ganzen Dll-Zugriff. _________________ Garten ist eine Kunstnatur
Das Leben ist nicht fair. Es ist nur fairer als der Tod, das ist alles.
Obi-Wahns Codeschnipsel @ securityvision.ch |
|
| Nach oben |
|
 |
Jochen
Anmeldedatum: 30.01.2008 Beiträge: 103
|
Verfasst am: Fr Mai 16, 2008 11:42 am Titel: |
|
|
...auf die Gefahrt hin,daß ich Dich nerve
Wo müßte man %ClipboardAll% einfügen, bzw. die dll-Aufrufe entfernen?
Hab ein bischen rumexperimentiert, war aber leider nicht sonderlich erfolgreich damit.
Wenn ich nur einfach %ClipboardAll% verwende und als jpg speichere, geht das ja in die Hose, weil die Datei nicht im korrekten Format gespeichert wird, vermute ich.
Bin leider immer noch in der "Anfängerliga". _________________ Jochen |
|
| Nach oben |
|
 |
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|