Deutsches AutoHotkey Homepage AutoHotkey Community
Wir helfen uns gegenseitig aus der Patsche
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Fensterinhalt drucken - Die Zweite
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Ich brauche Hilfe!
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jochen



Anmeldedatum: 30.01.2008
Beiträge: 103

BeitragVerfasst am: Di Mai 13, 2008 7:36 pm    Titel: Fensterinhalt drucken - Die Zweite Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
fredchf



Anmeldedatum: 18.09.2006
Beiträge: 605
Wohnort: Deutschland

BeitragVerfasst am: Di Mai 13, 2008 9:00 pm    Titel: Antworten mit Zitat

hallo,
den aktuellen standartdrucker kannst du z.b. so in eine var speichern. Wink
Code:
RegRead, standartdrucker, HKCU, Software\Microsoft\Windows NT\CurrentVersion\Windows, Device
RegExMatch(standartdrucker, "\\\\.+\\(.+?)(?=,)", da)
MsgBox, % da1

_________________
Mit freundlichen Grüßen
fredchf
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jochen



Anmeldedatum: 30.01.2008
Beiträge: 103

BeitragVerfasst am: Mi Mai 14, 2008 7:35 am    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Obi-Wahn



Anmeldedatum: 19.04.2006
Beiträge: 538
Wohnort: Wien

BeitragVerfasst am: Mi Mai 14, 2008 7:46 am    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jochen



Anmeldedatum: 30.01.2008
Beiträge: 103

BeitragVerfasst am: Mi Mai 14, 2008 2:58 pm    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Obi-Wahn



Anmeldedatum: 19.04.2006
Beiträge: 538
Wohnort: Wien

BeitragVerfasst am: Mi Mai 14, 2008 3:32 pm    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jochen



Anmeldedatum: 30.01.2008
Beiträge: 103

BeitragVerfasst am: Mi Mai 14, 2008 4:02 pm    Titel: Antworten mit Zitat

Hmm, langsam wirds spannend Wink

F12 bringt bei mir die Fehler-MsgBox

RUNDLL
Fehler in shimgvw.dll
Folgender Eintrag fehlt: ImageView_PrinTo

Betriebssystem ist Win2000
_________________
Jochen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Obi-Wahn



Anmeldedatum: 19.04.2006
Beiträge: 538
Wohnort: Wien

BeitragVerfasst am: Mi Mai 14, 2008 4:16 pm    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jochen



Anmeldedatum: 30.01.2008
Beiträge: 103

BeitragVerfasst am: Mi Mai 14, 2008 7:39 pm    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Obi-Wahn



Anmeldedatum: 19.04.2006
Beiträge: 538
Wohnort: Wien

BeitragVerfasst am: Do Mai 15, 2008 8:47 am    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jochen



Anmeldedatum: 30.01.2008
Beiträge: 103

BeitragVerfasst am: Fr Mai 16, 2008 9:09 am    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Obi-Wahn



Anmeldedatum: 19.04.2006
Beiträge: 538
Wohnort: Wien

BeitragVerfasst am: Fr Mai 16, 2008 10:52 am    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jochen



Anmeldedatum: 30.01.2008
Beiträge: 103

BeitragVerfasst am: Fr Mai 16, 2008 11:10 am    Titel: Antworten mit Zitat

Hm,

Hast Du eine Ahnung, warum es unter Vista dazu kommt?
_________________
Jochen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Obi-Wahn



Anmeldedatum: 19.04.2006
Beiträge: 538
Wohnort: Wien

BeitragVerfasst am: Fr Mai 16, 2008 11:15 am    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jochen



Anmeldedatum: 30.01.2008
Beiträge: 103

BeitragVerfasst am: Fr Mai 16, 2008 11:42 am    Titel: Antworten mit Zitat

...auf die Gefahrt hin,daß ich Dich nerve Embarassed

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Ich brauche Hilfe! Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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