Deutsch
Forum

GetSaveFileName und OFNHookProc Problem

 

Georg
Hovenbitzer
Hallo zusammen,

ich verstehe mal wieder Windows nicht
Der Code unten funktioniert, nur wenn ich per .Flag OFN_ENABLEHOOK einschalte wird das Fenster nicht mehr im Explorer Style angezeigt. Also es fehlen links die großen Buttons. Wobei es laut win32.hlp so gehen soll.
Testen kann man dies, wenn man im Code unter .Flag& das $20 löscht. Die HookProc wird aufgerufen wenn man eine Datei auswählt die vorhanden ist und OK drückt.

Noch eine Zusatzfrage:
Ich habe den Code mal so geändert, dass ein Dialog in der HookProc geöffnet wird.
Die Schriftart in der Messagebox und in dem Dialog sind unterschiedlich, wie bekomme ich den Dialog in der gleichen Schrift wie die Messagebox. Mit SetDialogfont 0 habe ich es schon probiert, bringt aber nichts.
KompilierenMarkierenSeparieren
Def GetSaveFileName(1) !"COMDLG32.DLL","GetSaveFileNameA"
Def Make256String(1) ((@$(1) + @Chr$(0)) + @Space$(256 - @Len(@$(1))))
Struct tagOFN = lStructSize&,
hWndOwner&,
hInstance&,
lpstrFilter&,
lpstrCustomFilter&,
nMaxCustFilter&,
nFilterIndex&,
lpstrFile&,
nMaxFile&,
lpstrFileTitle&,
nMaxFileTitle&,
lpstrInitialDir&,
lpstrTitle&,
Flags&,
nFileOffset%,
nFileExtension%,
lpstrDefExt&,
lCustData&,
lpfnHook&,
lpTemplateName&
Declare ofn#
Dim ofn#,tagOFN
Struct _Rect = Left&,
Top&,
Right&,
Bottom&
Declare Rect#
Dim Rect#,_Rect

Proc SaveDateiHook

    Parameters hdlg&,uMsg&,wParam&,lParam&
    Declare Parent&
    Clear Rect#

    If uMsg& = 49265

        If @FileExists(@String$(ofn#.lpstrFile&,0)) = 1

            Parent& = @External("USER32","GetParent",hdlg&)
            @External("USER32","GetWindowRect",Parent&,Rect#)
            Declare Fenster&
            Declare Weiter&
            Declare Neu&
            Declare Abbruch&
            Fenster& = @Create("Dialog",Parent&,"Datei existiert",10,10,300,150)
            Weiter& = @Create("DefButton",Fenster&,"Anhängen",20,60,120,30)
            Neu& = @Create("Button",Fenster&,"Überschreiben",150,60,120,30)
            @MessageBox("Left = "+@Str$(Rect#.Left&)+"
            "+"Top = "+@Str$(Rect#.Top&)+"
            "+"Right = "+@Str$(Rect#.Right&)+"
            "+"Bottom = "+@Str$(Rect#.Bottom&)+"
            "+"File = "+@String$(ofn#.lpstrFile&,0),"Info",1)
            Return 1

        EndIf

    EndIf

    Return 0

EndProc

Proc SaveDatei

    Parameters hWnd&,Titel$,FileSpec$,InitialDir$,Filter$,DefExt$
    Declare CustomFilter$
    Declare FileTitle$
    Declare rCode&
    Declare Auswahl$
    Clear ofn#
    Titel$ = Make256String(Titel$)
    FileSpec$ = Make256String(FileSpec$)
    InitialDir$ = Make256String(InitialDir$)
    Filter$ = @Translate$(Filter$,"|",@Chr$(0)) + @Chr$(0)
    Filter$ = Make256String(Filter$)
    DefExt$ = Make256String(DefExt$)

    With ofn#

        .lStructSize&       = @SizeOf(ofn#)
        .hWndOwner&         = hWnd&
        .hInstance&         = %hInstance
        .lpstrFilter&       = @Addr(Filter$)
        .lpstrCustomFilter& = @Addr(CustomFilter$)
        .nMaxCustFilter&    = 0
        .nFilterIndex&      = 1
        .lpstrFile&         = @Addr(FileSpec$)
        .nMaxFile&          = 256
        .lpstrFileTitle&    = @Addr(FileTitle$)
        .nMaxFileTitle&     = 256
        .lpstrInitialDir&   = @Addr(InitialDir$)
        .lpstrTitle&        = @Addr(Titel$)
        .Flags&             = ($4 | $20 | $80000 | $800)
        OFN_HIDEREADONLY $4
        OFN_ENABLEHOOK $20
        OFN_PATHMUSTEXIST $800
        OFN_EXPLORER $80000
        .lpstrDefExt&       = @Addr(DefExt$)
        .lpfnHook&					= @ProcAddr(SaveDateiHook,4)

    EndWith

    rCode& = GetSaveFileName(ofn#)

    If rCode& <> 0

        Auswahl$ = @String$(ofn#.lpstrFile&,0)

    Else

        Auswahl$ = ""

    EndIf

    Dispose ofn#
    Return Auswahl$

EndProc

Window 100,100-800,600
Print SaveDatei(%hWnd,"Datei speichern unter:","DLQueue",$ProgDir,"Download File (*.dat)|*.dat|Textfile (*.txt)|*.txt","*.dat")
WaitInput
Dispose ofn#
Dispose Rect#
End
 
Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a)
02.06.2006  
 



Ich hatte das Ganze hier  [...]  etwas anders gelöst, aber ich glaube mich zu erinnern das dass Problem das Selbe war.
 
02.06.2006  
 



Ich kann mir vorstellen das WinXP mittels eines eigenen Hooks diese Bar erzeugt, was dann nicht geschieht wenn man einen owner-Hook definiert.
 
02.06.2006  
 




Georg
Hovenbitzer
Hallo iF,

dein Demo kenne ich sehr gut
Ich klaue doch gerne

Aber bei dir wird der Explorer Sytle auch nicht angezeigt

Mal der Auszug aus der Win32.hlp:

[quote:d1a14d6a62]
By default, Windows 95 and Windows NT version 4.0 display a new version of the Save dialog box that provides user-interface features that are similar to the Windows Explorer. You can provide an OFNHookProc hook procedure for an Explorer-style Save dialog box. To enable the hook procedure, set the OFN_EXPLORER and OFN_ENABLEHOOK flags in the Flags member of the OPENFILENAME structure and specify the address of the hook procedure in the lpfnHook member.
[/quote:d1a14d6a62]
 
Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a)
02.06.2006  
 



Ist imho doch auch richtig wie das Win da reagiert. Dort steht ja schliesslich nicht das OFN_EXPLORER für die Bar zuständig ist. Für mich ist es schlüssig das Windows da den default LoadSaveDialog anzeigt da halt eine eigene HookProc für diese Extras sorgen soll.

Ich habe keinen Rat wie man beides miteinander vereinen kann.
 
02.06.2006  
 




Georg
Hovenbitzer
Hallo iF,

was ist denn dann der Explorer Style ?!
Da beide Varianten sich nur durch die Bar an der linken Seite unterscheiden.
 
Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a)
02.06.2006  
 




Uwe
''Pascal''
Niemeier
Hallo Leute!

Seit Win2000 wurde die OpenFileName-Struktur um 3 optionale Parameter ergänzt (siehe MSDN). Wird die Grösse der Struktur entsprechend erweitert (die drei LongInts am Ende müssen Null sein) sollte es klappen.
Hier eine Demo, um einen Dialog per Hook in der Miniatur-Ansicht zu öffnen (zwecks Bild-Auswahl):
KompilierenMarkierenSeparieren
!
window 10,10-700,500
 $H Messages.ph
 $H Windows.ph

proc OpenFileHook-------------------------------OpenFileHook----------------------------

    parameters dlg&,msg&,wparam&,lparam&
    case Status%:return 1-----Ansicht muss nur einmal angepasst werden
    casenot msg&=~WM_NOTIFY:return 1

    if long(lparam&,8)=-603---Bei  Init existieren DefView und LV noch nicht!

        Status%=1
        DefView&=~FindWindowEx(~GetParent(dlg&),0,"SHELLDLL_DefView","")
        sendmessage(DefView&,~WM_COMMAND,$702D,0)--Undokumentierte Message

    endif

    return 1
    endproc---------------------------------------------------------------------------------

    proc LoadPicDialog------------------------------LoadPicDialog---------------------------

        parameters Pfad$,Titel$,Name$
        declare ofn#,Result$,Result&
        declare DefView&,Status%------Variablen für Hook
        Name$=Name$+"z*.bmp;*.jpe;*.jpeg;*.jpg;*.gifzz"--Filter (bei Bedarf anpassen)
        dim ofn#,88+256---------------Struktur (Win2000/NT/XP) + Puffer
        clear ofn#
        long ofn#,0=88----------------Grösse Struktur für GetOpenFileName (76 für Win9x)
        long ofn#,4=%hwnd-------------übergeordnetes Fenster
        long ofn#,12=addr(Name$)------Filter/Typ
        long ofn#,28=ofn#+88----------Beginn Puffer
        long ofn#,32=255--------------Puffergrösse
        long ofn#,44=addr(Pfad$)------Anfangspfad
        long ofn#,48=addr(Titel$)-----Titel
        long ofn#,52=$880024----------Flags
        long ofn#,68=procaddr("OpenFileHook",4)
        Result&=external("COMDLG32","GetOpenFileNameA",ofn#)
        Result$=string$(ofn#,88)
        casenot Result&:Result$=""
        procaddr("OpenFileHook",-4)
        dispose ofn#
        return Result$
        endproc---------------------------------------------------------------------------------
        print LoadPicDialog("","Bitte Bild wählen","Bild")
        waitkey

HTH
Pascal
 
02.06.2006  
 



Es funktioniert.
 
02.06.2006  
 




Georg
Hovenbitzer
Der Pascal mal wieder

Es funktioniert klasse

Das Ding links nennt sich places bar und kann in der erweiterten Variante mit 1 in FlagsEx (letzter Parameter) aus- und mit 0 eingeschaltet werden.
 
Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a)
02.06.2006  
 




Georg
Hovenbitzer
Hallo zusammen,

mir fällt da im Code vom Pascal nochwas auf was ich nicht kannte.

Ist es erlaubt die Variablen für die Hook Proc in der Hauptproc zu deklarieren, so wie in dem Beispiel vom Pascal ?
Unter Profan klappt dies sehr gut, nur es läßt sich per Profan2CPP nicht übersetzen.
 
Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a)
07.06.2006  
 




Sebastian
König
[quote:beab6f0e39]Ist es erlaubt die Variablen für die Hook Proc in der Hauptproc zu deklarieren, so wie in dem Beispiel vom Pascal ?
Unter Profan klappt dies sehr gut, nur es läßt sich per Profan2CPP nicht übersetzen.[/quote:beab6f0e39]
Ja, in (X)Profan klappt das (leider ). Mit Profan2Cpp sollte es funktionieren, wenn Du in den Übersetzungsoptionen Alle Variablen global deklarieren aktivierst.

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
08.06.2006  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

2.382 Betrachtungen

Unbenanntvor 0 min.
Andreas Koch19.04.2012
liveFamilie28.03.2012

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie