vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB & Windows API
SpecialFolderLocation 
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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SpecialFolderLocation 
Autor: ModeratorMartoeng (Moderator)
Datum: 24.01.04 23:07

Bin heute abend nicht mehr so zu Höchstleistungen fähig, aber mal einige Gedanken.

1. Wozu genau musst Du die Eigenschaften dauerhaft umstellen? Denn man muss ja nicht unbedingt für ein paar mal drucken alles bleibend einstellen.

2. Ginge es auch, wenn Du intern die Werte abspeicherst und beim nächsten Druckauftrag einfach das Printer-Objekt nimmst und dessen Werte veränderst?

3. Falls 1 und 2 nicht zutreffen sollten, dann können wir mal gucken, was wir da machen können. Aber das wären natürlich einfache und auch effektive Lösungen.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SpecialFolderLocation 
Autor: ModeratorMartoeng (Moderator)
Datum: 24.01.04 23:47

Property PrintQuality As Integer
Mitglied von VB.Printer
Gibt einen Wert zurück, der die Druckerauflösung bestimmt, oder legt diesen fest.

Property ColorMode As Integer
Mitglied von VB.Printer
Gibt die ausgewählte Farbe zurück oder legt diese fest.

Das könnte helfen. Hab das noch nie ausprobiert ehrlich gesagt, war noch nicht nötig.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SpecialFolderLocation 
Autor: zillertaler
Datum: 26.01.04 10:38

Hast du dir diese API-Funktion schon angeschaut ?
http://www.vbarchiv.net/vbapi/PrintDlg.php
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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!)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel