| |
VB & Windows APISpecialFolderLocation | | | Autor: GuidoE | Datum: 24.01.04 22:56 |
| Hallo Leute.
Ich habe im Fortgeschrittenen - Forum gepostet, aber da kuckt keiner rein. (10 Views) vielleicht habe da alle Angst, oder ich habs nicht richtig erklärt ?
Ich versuchs mal hier, denn ich weiss, dass es VBler gibt, die das können!
Ich benutze Win XP
Ich will Druckereinstellungen setzen bzw. speichern. Bisher sind alle API - Funktionen fehlgeschlagen! (Ich habe glaube ich 1 Million DevMode-Strukturen probiert!)
Versuch 2: Wie kann ich den (virtuellen) Ordner "Drucker und Faxgeräte" öffnen ?
Ich hab die API - Funktion "SHGetSpecialFolderLocation" und den zugehörigen Tipp aus dem API-Guide "Special Folder" schon in allen erdenklichen Arten ausprobiert, nichts funktioniert. Auch ca. 700 Beispiel-Codes aus dem Internet funktionieren nicht. Liegt das an XP ?
Wie kann ich diesen verflixten Ordner öffnen ?
Oder wie bekomme ich im Druckerdialog bei Farb- und Druck-Qualität- Auswahl den "Übernehmen"-Button hin ?
Vielen Dank für Hilfe, Guido. | |
Re: SpecialFolderLocation | | | Autor: GuidoE | Datum: 24.01.04 23:25 |
| Hallo Martoeng
Vielen Dank für deine Antwort.
Und du hast recht: Die einfachste Lösung ist auch mir am liebsten!
Ich habe ein riesiges Freeware-Programm geschrieben "PhotoCopier (GES)" mit dem man per Scanner + Drucker photokopieren kann. Beim Ausdrucken kann man zoomen, den Bildausschnitt wählen und und und (du kennst bestimmt meinen Tipp "Scannen mit EZTWAIN (GES)" !?)
Der User soll halt jetzt beim Ausdrucken ein paar kleinere Druckereigenschaften einstellen können, wenigstens die Druckqualiät (von "Entwurf" bis "Optimal") und "Farbe" oder "Schwarz/Weiss" !
Mit allen bisherigen Möglichkeiten liesen sich im höchsten Fall diese beiden Eigenschaften für sage und schreibe ein-einziges Mal setzen!! Das heist: habe ich die Einstellungen gesetzt und drucke dann aus, sind die Einstellungen wieder weg!
Der langen Rede kurzer Sinn:
Es würde mir genügen, wenn die Druckeinstellungen "Qualität" und "Farbe" wärend/für mein Programm fest einzustellen wären.
Wie geht das ?
Vielen Dank für Hilfe, Guido. | |
Re: SpecialFolderLocation | | | Autor: GuidoE | Datum: 25.01.04 01:56 |
| Hallo Martoeng
Ich habe diese Zuweisungen alle ausprobiert, nichts funktioniert. Der Drucker übernimmt diese Einstellungen einfach nicht! Und wenn ich einen eigenen Anwendungs-Drucker deklariere, sagt VB sogar, dass diese Einstellungen schreibgeschützt sind !?
Deshalb will ich auch über den Weg der Special-Folders gehen.
Wie öffne ich denn den Ordner "Drucker und Faxgeräte" unter XP ?
Falls jemand weiss, wie ich den Drucker dazu kriege, die Einstellungen zu übernehmen, bitte bescheid sagen!
Gruss, Guido. | |
Re: SpecialFolderLocation | | | Autor: zillertaler | Datum: 25.01.04 10:05 |
| Ich glaub du kannst den Druckerordner sogar per Befehlszeilenparameter öffnen. das geht mit der rundll.exe, weiss aber den Parameter nicht mehr. werd mal googeln.
MfG FJ | |
Re: SpecialFolderLocation | | | Autor: zillertaler | Datum: 25.01.04 10:16 |
| Habs gefunden.
Druckerordner öffnen:
rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL PrintersFolder
hier stehen noch mehr möglichkeiten:
http://www.faqweb.de/tip0564.htm
MfG FJ | |
Re: SpecialFolderLocation | | | Autor: GuidoE | Datum: 25.01.04 21:13 |
| Hallo FJ
Voll cool!
Ich wusste doch, auf uns VB@rchivler ist Verlass!
Ich hab den ersten Aufruf gleich getestet (hat tadellos funktioniert) und werde mir jetzt mal die Liste ansehen.
Vielen Dank !!
Wie kann ich denn jetzt noch die Druckereinstellungen setzen/speichern ?
Gruss, Guido. | |
Re: SpecialFolderLocation | | | Autor: GuidoE | Datum: 26.01.04 18:40 |
| Hallo zillertaler
Hmmm-hmmm *wehmütig_bejahend
*heul_flenn_schluchtz !!
Ich habe alle 1 Million+eins - Codes ausprobiert. Genau darum gehts! Ich habe noch nicht herausgefunden, wie die gewählten Einstellungen aus dem Dialog zur Verwendung im eigenen Programm zu setzen sind. Manche haben überhaupt keine Wirkung (nur Lese-Wirkung) andere setzen eine Eigenschaft oder 2 und verlieren sie nach einmal ausdrucken. Und es kann ja nicht sein, dass der User für jedes Blatt das er ausdrucken will, die Eigenschaften neu setzt !
Bitte helfen ! ! *verzweifelt_ ich_bin
Viele Grüsse und danke für deine Hilfe, Guido. | |
Re: SpecialFolderLocation | | | Autor: Mr. Fox | Datum: 26.01.04 20:18 |
| Hi Guido!
Hast du auch schon mal das Ganze mit der SetPrinter-API-Funktion ausprobiert ??
In der MSDN dürften einige sehr interessante Beispiele sein z.B.
"HOWTO: Modify Printer Settings by Using SetPrinter".
ciao | |
Re: SpecialFolderLocation | | | Autor: GuidoE | Datum: 26.01.04 23:43 |
| Hallo Mr. Fox
Vielen Dank für deine Hilfe.
Ich habe schon so viele API und Common - Dialog Aufrufe ausprobiert, dass ich gar nicht mehr weiss, ob noch einer übrig ist *grins.
Ich habe auch die MSDN durchforstet, da steht so viel drin, aber nichts was hilt.
Das was du vorschlägst, hört sich gut an! Wo finde ich das ? Ich habe eine deutsche Version. Ist das in der Visual Basic Dokumentation oder bei C/C++ (letzteres kann ich nicht).
Gruss, Guido. | |
Re: SpecialFolderLocation | | | Autor: Mr. Fox | Datum: 27.01.04 00:38 |
| Hi Guido!
Du musst eigentlich nur nach genau dieser Überschrift suchen.
Hab´s zumindest in einer 2003 und 1998 MSDN gefunden (beide deutsch).
Das Problem bei diesem Artikel ist, dass als Programmiersprache C/C++ verwendet wird. Da aber meist sowieso nur irgendeine API-Funktion aufgerufen wird, sollte es eigentlich kein größeres Problem sein, hoffe ich mal.
ciao | |
Re: SpecialFolderLocation | | | Autor: GuidoE | Datum: 27.01.04 05:31 |
| Hallo Mr. Fox.
Danke, ich werde gleich mal suchen!
Ich melde mich (voraussichtlich) morgen.
Gruss, Guido. | |
Re: SpecialFolderLocation | | | Autor: Ralf Schoen | Datum: 28.01.04 12:08 |
| Hi Guido, hoffe Dir geht es gut
Ok, zu deinem Problem.. Das mit der SetPrinter war schon mal der richtige Ansatz.
Du holst Dir über GetPrinter (Level 2) die Infos über den Drucker. Dann holst Du Dir die DevMode Struktur ... Da Du nur Pointer hast, mußt du ein bischen Memory spielen.
Dann änderst du die Werte und schreibst das ganze wieder zurück in den speicher.
Dann mit SetPrinter bestätigen und alles ist gut..... Hoffe mal das ist das was Du brauchst.
Ich habe das ganze in den Command_click gelegt kannst aber auch einfach eine
Function oder Sub draus mache...
Option Explicit
Private Sub Command1_Click()
Dim phPrinter As Long
Dim pDefault As PRINTER_DEFAULTS
Dim pDevMode As devMode
Dim pi2 As PRINTER_INFO_2
Dim dm As devMode
pDefault.pDevMode = pDevMode
pDefault.DesiredAccess = PRINTER_ACCESS_ADMINISTRATOR
Debug.Print "o" & OpenPrinter(Printers(3).DeviceName, phPrinter, pDefault)
Dim size As Long
Dim bytesUsed As Long
' erstmal die größe holen (Buffer wird nicht direkt angelegt, daher erstmal die
' wirkliche größe holen ;-)
Call GetPrinter(phPrinter, 2, ByVal 0&, 0, size)
ReDim Buffer(0 To size - 1) As Byte
' hier nochmal aufrufen und die Daten holen
Call GetPrinter(phPrinter, 2, Buffer(0), size, bytesUsed)
Call CopyMemory(pi2, Buffer(0), Len(pi2)) ' und ab damit in die Lokale kopie
' -> schwups
' leider nur ein pointer auf die DevStruktur
m_pi2.pDevMode = pi2.pDevMode
' Aber dann holen wir uns halt die Daten selber -> DevMode füllen
Call CopyMemory(dm, ByVal m_pi2.pDevMode, Len(dm))
' änder was geändert werden muß
dm.dmPrintQuality = DMRES_LOW
' jezt wieder zurück damit...
Call CopyMemory(ByVal m_pi2.pDevMode, dm, Len(dm))
' und setzen....
Call SetPrinter(phPrinter, 2, pi2, 0&)
ClosePrinter phPrinter
End Sub Hier jetzt noch die Declares . Hatte ich in einem Modul ..
<Nachricht zu lang>
Kannst Dich ja mal melden, ob es das war...
Viele Grüße
Ralf
Gru?
Ralf
| |
Hier jetzt das Modul | | | Autor: Ralf Schoen | Datum: 28.01.04 12:08 |
| Option Explicit
Public Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" ( _
ByVal pPrinterName As String, phPrinter As Long, pDefault As Any) As Long
Public Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As _
Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination _
As Any, Source As Any, ByVal Length As Long)
Public Declare Function SetPrinter Lib "winspool.drv" Alias "SetPrinterA" ( _
ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal Command _
As Long) As Long
Public Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" ( _
ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As _
Long, pcbNeeded As Long) As Long
' Print qualities
Public Const DMRES_DRAFT = (-1)
Public Const DMRES_LOW = (-2)
Public Const DMRES_MEDIUM = (-3)
Public Const DMRES_HIGH = (-4)
Public Type devMode
dmDeviceName As String * 32
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * 32
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
' struktur um die Daten sichtbar zu machen ' look and feel ;-)
Public Type PrinterInfo2
pServerName As String
pPrinterName As String
pShareName As String
pPortName As String
pDriverName As String
pComment As String
pLocation As String
pDevMode As Long 'DEVMODE
pSepFile As String
pPrintProcessor As String
pDatatype As String
pParameters As String
pSecurityDescriptor As Long 'SECURITY_DESCRIPTOR
Attributes As Long
Priority As Long
DefaultPriority As Long
StartTime As Long
UntilTime As Long
Status As Long
cJobs As Long
AveragePPM As Long
End Type
' Struktur um die daten von Windows zu holen
Public Type PRINTER_INFO_2
pServerName As Long
pPrinterName As Long
pShareName As Long
pPortName As Long
pDriverName As Long
pComment As Long
pLocation As Long
pDevMode As Long 'DEVMODE
pSepFile As Long
pPrintProcessor As Long
pDatatype As Long
pParameters As Long
pSecurityDescriptor As Long 'SECURITY_DESCRIPTOR
Attributes As Long
Priority As Long
DefaultPriority As Long
StartTime As Long
UntilTime As Long
Status As Long
cJobs As Long
AveragePPM As Long
End Type
Public Const PRINTER_ACCESS_ADMINISTRATOR = &H4 'Nur Administartor zugriff
Public Const PRINTER_ACCESS_USE = &H8 'Standard zugriff, nur Drucken
Public Const PRINTER_ALL_ACCESS = &HF000C 'Voller zugriff zur Synchronisation
Public Type PRINTER_DEFAULTS
pDatatype As String
pDevMode As devMode
DesiredAccess As Long
End Type
Public m_pi2 As PrinterInfo2 Gru?
Ralf
| |
Re: Hier jetzt das Modul | | | Autor: GuidoE | Datum: 28.01.04 19:31 |
| Hallo Ralf
Vielen Dank!
Es freut mich, wieder von dir zu hören. Offen gesagt, habe ich bei diesem kniffligen Thema mit einer Antwort von dir gerechnet/gehofft. Denn es ist ein echt schwieriges Unterfangen für "echte Könner". Also ein dickes Dankeschön und Lob!
Dein Tipp sieht erstmal sehr gut aus. Ich werde mich mal hineinarbeiten.
Dass da mit dem Speicher gearbeitet werden muss, habe ich mir fast gedacht(befürchtet). Damit kenne ich mich nicht so gut aus, was Pointer betrifft und so. Deshalb bin ich über diese Hilfestellung besonders glücklich.
Viele Grüsse, Guido.
PS: Ich melde mich dann. | |
Re: SpecialFolderLocation | | | Autor: SirTurner | Datum: 03.03.05 18:39 |
| Hi
Falls der Beitrag noch aktuell ist, google mal "prnadmin.dll"
War mit den druckereinstellungen und VB auch schon am verzweifeln.
Schau dir auch mal das Word Dokument "prnadmin.doc" an.
Da wird beschrieben wie du die .dll anspricht
Über die .dll kannst du mit den Drucker alles anstellen was du willst.
Zudem lässt sie sich ziemlich leich ansprechen
Gruß SirTurner | |
Re: SpecialFolderLocation | | | Autor: Guido Eisenbeis | Datum: 04.03.05 01:54 |
| Hallo Sir Turner!
"Falls der Beitrag noch aktuell ist, ... " Nicht mehr so ganz aktuell (vom Jan. 2004) *grins*
Aber das Thema ist immer noch aktuell. Damals habe ich mir mit eigenem Code beholfen, von dem ich heute nicht auf Anhieb weiß, wo ich ihn finde! *smile*. Deshalb werde ich mir die von dir genannten Sachen gerne ankucken!
Es freut mich, dass selbst nach so langer Zeit noch ein Hinweis kommt!
Ansonsten kommen eher Fragen zu meinen veröffentlichten Tipps. (Darüber freue ich mich natürlich auch!)
Vielen Dank!
Guido
Apropo Tipps veröffentlichen: Hab da gerade ein Update zum Tipp "MouseInOut (GES)" für Controls MIT und OHNE hWnd fertig gestellt. Jetzt muss ich nur noch daran denken, in "stadtfein" zu machen und an Dieter zu schicken! (An dieser Stelle: Gruß an Dieter!) | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere Infos
|