FileSelectFolder - Frage Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

gero
Posts: 172
Joined: 02 Oct 2013, 05:36

FileSelectFolder - Frage

Post by gero » 22 Apr 2024, 08:38

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

Nussbeisser
Posts: 120
Joined: 17 Jul 2019, 08:49

Re: FileSelectFolder - Frage  Topic is solved

Post by Nussbeisser » 23 Apr 2024, 13:01

Hallo,
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)
		}
	}
}




gero
Posts: 172
Joined: 02 Oct 2013, 05:36

Re: FileSelectFolder - Frage

Post by gero » 23 Apr 2024, 15:38

@Nussbeisser
Beeindruckender Code ... macht ganz genau was es soll und funktioniert auf Anhieb ... :D , auch wenn ich da absolut nichts blicke ... :shock:

Ganz dickes Danke
gruss
gero

edit//
etwas später: ... wie gebe ich dem Code ein Startverzeichnis für FileSelectFolder mit ? ... :?

Nussbeisser
Posts: 120
Joined: 17 Jul 2019, 08:49

Re: FileSelectFolder - Frage

Post by Nussbeisser » 24 Apr 2024, 08:33

Hallo,
funktioniert das bei dir nicht?

FileSelectFolder, AusgabeVar, C:\Windows , 3

gero
Posts: 172
Joined: 02 Oct 2013, 05:36

Re: FileSelectFolder - Frage

Post by gero » 24 Apr 2024, 08:48

Hallo Nussbeisser ... jetzt ! ... klar doch ! ... das funktioniert ... :D
Da stand ich total auf der Leitung.

Nochmals herzlichen Dank für deine Hilfe
gruss
gero

Post Reply

Return to “Ich brauche Hilfe”