Hallo zusammen
Ich mal wieder an die Wissenden - betr. V1.
Wird dieses FileSelectFolder eigentlich immer bildschirmzentriert erstellt, oder kann man dem, wie auch immer, gleich ein paar Parameter wie Position und Grösse bei der Erstellung mitgeben ?
Wenn JA - wie, denn x y b h werden ignoriert ???
Auch ein definitives "Das geht nicht !" hilft mir weiter.
Bisher starte ich vorher einen Timer -300 der dann den Winmove macht ... aber das Gezappel nervt ...
Danke schon mal vorab für's Lesen
gruss
gero
FileSelectFolder - Frage Topic is solved
Moderator: jNizM
-
- Posts: 120
- Joined: 17 Jul 2019, 08:49
Re: FileSelectFolder - Frage Topic is solved
Hallo,
ich habe ein ähnliches Problem mit WinHook gelöst.
Zum Beispiel:
ich habe ein ähnliches Problem mit WinHook gelöst.
Zum Beispiel:
Code: Select all
#Requires Autohotkey v1.0
#NoEnv
#Singleinstance Force
WinHook.Shell.Add("FileSelectFolderCreated",Ordner suchen,,,1)
FileSelectFolder, AusgabeVar, , 3
if (AusgabeVar = "")
MsgBox, Keinen Ordner ausgewählt.
else
MsgBox, Ordner "%AusgabeVar%" ausgewählt.
FileSelectFolderCreated(){
WinMove,Ordner suchen,, 800,600,100,100
}
; [Class] WinHook
; Fanatic Guru
; 2019 02 18 v2
;
; Class to set hooks of windows or processes
;
;{============================
;
; Class (Nested): WinHook.Shell
;
; Method:
; Add(Func, wTitle:="", wClass:="", wExe:="", Event:=0)
;
; Desc: Add Shell Hook
;
; Parameters:
; 1) {Func} Function name or Function object to call on event
; 2) {wTitle} window Title to watch for event (default = "", all windows)
; 3) {wClass} window Class to watch for event (default = "", all windows)
; 4) {wExe} window Exe to watch for event (default = "", all windows)
; 5) {Event} Event (default = 0, all events)
;
; Returns: {Index} index to hook that can be used to Remove hook
;
; Shell Hook Events:
; 1 = HSHELL_WINDOWCREATED
; 2 = HSHELL_WINDOWDESTROYED
; 3 = HSHELL_ACTIVATESHELLWINDOW
; 4 = HSHELL_WINDOWACTIVATED
; 5 = HSHELL_GETMINRECT
; 6 = HSHELL_REDRAW
; 7 = HSHELL_TASKMAN
; 8 = HSHELL_LANGUAGE
; 9 = HSHELL_SYSMENU
; 10 = HSHELL_ENDTASK
; 11 = HSHELL_ACCESSIBILITYSTATE
; 12 = HSHELL_APPCOMMAND
; 13 = HSHELL_WINDOWREPLACED
; 14 = HSHELL_WINDOWREPLACING
; 32768 = 0x8000 = HSHELL_HIGHBIT
; 32772 = 0x8000 + 4 = 0x8004 = HSHELL_RUDEAPPACTIVATED (HSHELL_HIGHBIT + HSHELL_WINDOWACTIVATED)
; 32774 = 0x8000 + 6 = 0x8006 = HSHELL_FLASH (HSHELL_HIGHBIT + HSHELL_REDRAW)
;
; Note: ObjBindMethod(obj, Method) can be used to create a function object to a class method
; WinHook.Shell.Add(ObjBindMethod(TestClass.TestNestedClass, "MethodName"), wTitle, wClass, wExe, Event)
;
; ----------
;
; Desc: Function Called on Event
; FuncOrMethod(Win_Hwnd, Win_Title, Win_Class, Win_Exe, Win_Event)
;
; Parameters:
; 1) {Win_Hwnd} window handle ID of window with event
; 2) {Win_Title} window Title of window with event
; 3) {Win_Class} window Class of window with event
; 4) {Win_Exe} window Exe of window with event
; 5) {Win_Event} window Event
;
; Note: FuncOrMethod will be called with DetectHiddenWindows On.
;
; --------------------
;
; Method: Report(ByRef Object)
;
; Desc: Report Shell Hooks
;
; Returns: string report
; ByRef Object[Index].{Func, Title:, Class, Exe, Event}
;
; --------------------
;
; Method: Remove(Index)
; Method: Deregister()
;
;{============================
;
; Class (Nested): WinHook.Event
;
; Method:
; Add(eventMin, eventMax, eventProc, idProcess, WinTitle := "")
;
; Desc: Add Event Hook
;
; Parameters:
; 1) {eventMin} lowest Event value handled by the hook function
; 2) {eventMax} highest event value handled by the hook function
; 3) {eventProc} event hook function, call be function name or function object
; 4) {idProcess} ID of the process from which the hook function receives events (default = 0, all processes)
; 5) {WinTitle} WinTitle to identify which windows to operate on, (default = "", all windows)
;
; Returns: {hWinEventHook} handle to hook that can be used to unhook
;
; Event Hook Events:
; 0x8012 = EVENT_OBJECT_ACCELERATORCHANGE
; 0x8017 = EVENT_OBJECT_CLOAKED
; 0x8015 = EVENT_OBJECT_CONTENTSCROLLED
; 0x8000 = EVENT_OBJECT_CREATE
; 0x8011 = EVENT_OBJECT_DEFACTIONCHANGE
; 0x800D = EVENT_OBJECT_DESCRIPTIONCHANGE
; 0x8001 = EVENT_OBJECT_DESTROY
; 0x8021 = EVENT_OBJECT_DRAGSTART
; 0x8022 = EVENT_OBJECT_DRAGCANCEL
; 0x8023 = EVENT_OBJECT_DRAGCOMPLETE
; 0x8024 = EVENT_OBJECT_DRAGENTER
; 0x8025 = EVENT_OBJECT_DRAGLEAVE
; 0x8026 = EVENT_OBJECT_DRAGDROPPED
; 0x80FF = EVENT_OBJECT_END
; 0x8005 = EVENT_OBJECT_FOCUS
; 0x8010 = EVENT_OBJECT_HELPCHANGE
; 0x8003 = EVENT_OBJECT_HIDE
; 0x8020 = EVENT_OBJECT_HOSTEDOBJECTSINVALIDATED
; 0x8028 = EVENT_OBJECT_IME_HIDE
; 0x8027 = EVENT_OBJECT_IME_SHOW
; 0x8029 = EVENT_OBJECT_IME_CHANGE
; 0x8013 = EVENT_OBJECT_INVOKED
; 0x8019 = EVENT_OBJECT_LIVEREGIONCHANGED
; 0x800B = EVENT_OBJECT_LOCATIONCHANGE
; 0x800C = EVENT_OBJECT_NAMECHANGE
; 0x800F = EVENT_OBJECT_PARENTCHANGE
; 0x8004 = EVENT_OBJECT_REORDER
; 0x8006 = EVENT_OBJECT_SELECTION
; 0x8007 = EVENT_OBJECT_SELECTIONADD
; 0x8008 = EVENT_OBJECT_SELECTIONREMOVE
; 0x8009 = EVENT_OBJECT_SELECTIONWITHIN
; 0x8002 = EVENT_OBJECT_SHOW
; 0x800A = EVENT_OBJECT_STATECHANGE
; 0x8030 = EVENT_OBJECT_TEXTEDIT_CONVERSIONTARGETCHANGED
; 0x8014 = EVENT_OBJECT_TEXTSELECTIONCHANGED
; 0x8018 = EVENT_OBJECT_UNCLOAKED
; 0x800E = EVENT_OBJECT_VALUECHANGE
; 0x0002 = EVENT_SYSTEM_ALERT
; 0x8016 = EVENT_SYSTEM_ARRANGMENTPREVIEW
; 0x0009 = EVENT_SYSTEM_CAPTUREEND
; 0x0008 = EVENT_SYSTEM_CAPTURESTART
; 0x000D = EVENT_SYSTEM_CONTEXTHELPEND
; 0x000C = EVENT_SYSTEM_CONTEXTHELPSTART
; 0x0020 = EVENT_SYSTEM_DESKTOPSWITCH
; 0x0011 = EVENT_SYSTEM_DIALOGEND
; 0x0010 = EVENT_SYSTEM_DIALOGSTART
; 0x000F = EVENT_SYSTEM_DRAGDROPEND
; 0x000E = EVENT_SYSTEM_DRAGDROPSTART
; 0x00FF = EVENT_SYSTEM_END
; 0x0003 = EVENT_SYSTEM_FOREGROUND
; 0x0007 = EVENT_SYSTEM_MENUPOPUPEND
; 0x0006 = EVENT_SYSTEM_MENUPOPUPSTART
; 0x0005 = EVENT_SYSTEM_MENUEND
; 0x0004 = EVENT_SYSTEM_MENUSTART
; 0x0017 = EVENT_SYSTEM_MINIMIZEEND
; 0x0016 = EVENT_SYSTEM_MINIMIZESTART
; 0x000B = EVENT_SYSTEM_MOVESIZEEND
; 0x000A = EVENT_SYSTEM_MOVESIZESTART
; 0x0013 = EVENT_SYSTEM_SCROLLINGEND
; 0x0012 = EVENT_SYSTEM_SCROLLINGSTART
; 0x0001 = EVENT_SYSTEM_SOUND
; 0x0015 = EVENT_SYSTEM_SWITCHEND
; 0x0014 = EVENT_SYSTEM_SWITCHSTART
;
; Note: ObjBindMethod(obj, Method) can be used to create a function object to a class method
; WinHook.Event.Add((eventMin, eventMax, ObjBindMethod(TestClass.TestNestedClass, "MethodName"), idProcess, WinTitle := "")
;
; ----------
;
; Desc: Function Called on Event
; FuncOrMethod(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime)
;
; Parameters:
; 1) {hWinEventHook} Handle to an event hook instance.
; 2) {event} Event that occurred. This value is one of the event constants
; 3) {hwnd} Handle to the window that generates the event.
; 4) {idObject} Identifies the object that is associated with the event.
; 5) {idChild} Child ID if the event was triggered by a child element.
; 6) {dwEventThread} Identifies the thread that generated the event.
; 7) {dwmsEventTime} Specifies the time, in milliseconds, that the event was generated.
;
; Note: FuncOrMethod will be called with DetectHiddenWindows On.
;
; --------------------
;
; Method: Report(ByRef Object)
;
; Returns: string report
; ByRef Object[hWinEventHook].{eventMin, eventMax, eventProc, idProcess, WinTitle}
;
; --------------------
;
; Method: UnHook(hWinEventHook)
; Method: UnHookAll()
;
;{============================
class WinHook
{
class Shell
{
Add(Func, wTitle:="", wClass:="", wExe:="", Event:=0)
{
if !WinHook.Shell.Hooks
{
WinHook.Shell.Hooks := {}, WinHook.Shell.Events := {}
DllCall("RegisterShellHookWindow", UInt, A_ScriptHwnd)
MsgNum := DllCall("RegisterWindowMessage", Str, "SHELLHOOK")
OnMessage(MsgNum, ObjBindMethod(WinHook.Shell, "Message"))
}
if !IsObject(Func)
Func := Func(Func)
WinHook.Shell.Hooks.Push({Func: Func, Title: wTitle, Class: wClass, Exe: wExe, Event: Event})
WinHook.Shell.Events[Event] := true
return WinHook.Shell.Hooks.MaxIndex()
}
Remove(Index)
{
WinHook.Shell.Hooks.Delete(Index)
WinHook.Shell.Events[Event] := {} ; delete and rebuild Event list
For key, Hook in WinHook.Shell.Hooks
WinHook.Shell.Events[Hook.Event] := true
}
Report(ByRef Obj:="")
{
Obj := WinHook.Shell.Hooks
For key, Hook in WinHook.Shell.Hooks
Display .= key "|" Hook.Event "|" Hook.Func.Name "|" Hook.Title "|" Hook.Class "|" Hook.Exe "`n"
return Trim(Display, "`n")
}
Deregister()
{
DllCall("DeregisterShellHookWindow", UInt, A_ScriptHwnd)
WinHook.Shell.Hooks := "", WinHook.Shell.Events := ""
}
Message(Event, Hwnd) ; Private Method
{
DetectHiddenWindows, On
If (WinHook.Shell.Events[Event] or WinHook.Shell.Events[0])
{
WinGetTitle, wTitle, ahk_id %Hwnd%
WinGetClass, wClass, ahk_id %Hwnd%
WinGet, wExe, ProcessName, ahk_id %Hwnd%
for key, Hook in WinHook.Shell.Hooks
if ((Hook.Title = wTitle or Hook.Title = "") and (Hook.Class = wClass or Hook.Class = "") and (Hook.Exe = wExe or Hook.Exe = "") and (Hook.Event = Event or Hook.Event = 0))
return Hook.Func.Call(Hwnd, wTitle, wClass, wExe, Event)
}
}
}
class Event
{
Add(eventMin, eventMax, eventProc, idProcess := 0, WinTitle := "")
{
if !WinHook.Event.Hooks
{
WinHook.Event.Hooks := {}
static CB_WinEventProc := RegisterCallback(WinHook.Event.Message)
OnExit(ObjBindMethod(WinHook.Event, "UnHookAll"))
}
hWinEventHook := DllCall("SetWinEventHook"
, "UInt", eventMin ; UINT eventMin
, "UInt", eventMax ; UINT eventMax
, "Ptr" , 0x0 ; HMODULE hmodWinEventProc
, "Ptr" , CB_WinEventProc ; WINEVENTPROC lpfnWinEventProc
, "UInt" , idProcess ; DWORD idProcess
, "UInt", 0x0 ; DWORD idThread
, "UInt", 0x0|0x2) ; UINT dwflags, OutOfContext|SkipOwnProcess
if !IsObject(eventProc)
eventProc := Func(eventProc)
WinHook.Event.Hooks[hWinEventHook] := {eventMin: eventMin, eventMax: eventMax, eventProc: eventProc, idProcess: idProcess, WinTitle: WinTitle}
return hWinEventHook
}
Report(ByRef Obj:="")
{
Obj := WinHook.Event.Hooks
For hWinEventHook, Hook in WinHook.Event.Hooks
Display .= hWinEventHook "|" Hook.eventMin "|" Hook.eventMax "|" Hook.eventProc.Name "|" Hook.idProcess "|" Hook.WinTitle "`n"
return Trim(Display, "`n")
}
UnHook(hWinEventHook)
{
DllCall("UnhookWinEvent", "Ptr", hWinEventHook)
WinHook.Event.Hooks.Delete(hWinEventHook)
}
UnHookAll()
{
for hWinEventHook, Hook in WinHook.Event.Hooks
DllCall("UnhookWinEvent", "Ptr", hWinEventHook)
WinHook.Event.Hooks := "", CB_WinEventProc := ""
}
Message(event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime) ; 'Private Method
{
DetectHiddenWindows, On
Hook := WinHook.Event.Hooks[hWinEventHook := this] ; this' is hidden param1 because method is called as func
WinGet, List, List, % Hook.WinTitle
Loop % List
if (List%A_Index% = hwnd)
return Hook.eventProc.Call(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime)
}
}
}
Re: FileSelectFolder - Frage
@Nussbeisser
Beeindruckender Code ... macht ganz genau was es soll und funktioniert auf Anhieb ... , auch wenn ich da absolut nichts blicke ...
Ganz dickes Danke
gruss
gero
edit//
etwas später: ... wie gebe ich dem Code ein Startverzeichnis für FileSelectFolder mit ? ...
Beeindruckender Code ... macht ganz genau was es soll und funktioniert auf Anhieb ... , auch wenn ich da absolut nichts blicke ...
Ganz dickes Danke
gruss
gero
edit//
etwas später: ... wie gebe ich dem Code ein Startverzeichnis für FileSelectFolder mit ? ...
-
- Posts: 120
- Joined: 17 Jul 2019, 08:49
Re: FileSelectFolder - Frage
Hallo,
funktioniert das bei dir nicht?
FileSelectFolder, AusgabeVar, C:\Windows , 3
funktioniert das bei dir nicht?
FileSelectFolder, AusgabeVar, C:\Windows , 3
Re: FileSelectFolder - Frage
Hallo Nussbeisser ... jetzt ! ... klar doch ! ... das funktioniert ...
Da stand ich total auf der Leitung.
Nochmals herzlichen Dank für deine Hilfe
gruss
gero
Da stand ich total auf der Leitung.
Nochmals herzlichen Dank für deine Hilfe
gruss
gero
Who is online
Users browsing this forum: No registered users and 13 guests