; #AutoIt3Wrapper_Au3Check_Parameters= -q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w 7 ; = Info =========================================================================================== ; Title : RunParamsDialog.au3 ; -------------------------------------------------------------------------------------------------- ; ; Version (vnots) : 0.0.14 ; Date : 2021-05-15 ; Author(s) : Professor Bernd ; ; Requirements : ; Language : ; Description : Im RunParamsDialog kann der User Startparameter eingeben, die bei "Run" an ; das .au3 Script übergeben werden, solange RunParamsDialog sichtbar ist. ; In the RunParamsDialog the user can enter start parameters, which will be ; passed to the .au3 script at "Run", as long as RunParamsDialog is visible. ; ================================================================================================== #NoTrayIcon #include #include #include ; z.B. für "_IsPressed()" #include #include #include Opt("MustDeclareVars", 1) Opt("WinDetectHiddenText", 1) ; Wichtig für "WinGetHandle()" u.ä. Funktionen. Global $g_hPSPad = WinGetHandle("[active]") ; Parent-Fenster für die eigene GUI. Global $g_hGui ; Handle der ersten RunParamsDialog-Instanz. Global $g_aGui_SizeAtStart ; Pos und Maße vom RunParamsDialog beim Start des Scripts. Global $g_oDict_COM_RunPrmsDlg ; COM ROT Dictionary Object zur Kommunikation mit anderen Scripts. Global $g_hDLL = DllOpen("user32.dll") ; Wird geschlossen in OnAutoItExit(). ;;;;;;;;;;;;;;Jocko Add;;;;;;;;;;;;;;;;;;;;;; Global $g_hEdit, $g_hFocTime=0 ;;;;;;;;;;;;;;End Jocko Add;;;;;;;;;;;;;;;;;;;;;; OnAutoItExitRegister('OnAutoItExit') GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO") Main_RunParamsDialog() ; ============================================================================== ; Main_RunParamsDialog ; ; Main function. ;-) ; ------------------------------------------------------------------------------ Func Main_RunParamsDialog() Local $nMsg Local $hGuiTmp ; Temp-Handle für RunParamsDialog, das im Dict gespeichert ist. Local $iResizeType ; Seite (links/rechts), an der der RunParamsDialog gesized werden soll. Local $aParentPos ; Pos von PSPad, an der der RunParamsDialog ausgerichtet wird (nur beim Start). Local $aGui_CliSizeAtStart ; Innere Maße des RunParamsDialog. Die Controls werden daran ausgerichtet. Local $edtUserParams Local $lblBorderL, $lblBorderR, $lblHelp, $lblMaximizeH, $lblMaximizeH_Frame Local $sCOM_ROT_Name_RunPrmsDlg ; Name (wird vom VBScript hierher übergeben) mit dem das COM Objekt für den Local $sRunParamsDlgTitle ; Titel für das RunParamsDialog-Fenster, wird vom VBScript hierher übergeben. If ($g_hPSPad = Null) Or ($g_hPSPad = 0) Or (_WinAPI_GetClassName($g_hPSPad) <> 'TfPSPad') Then MsgBox($MB_SYSTEMMODAL + $MB_ICONINFORMATION, "RunParamsDialog: - Error -", _ "Message from " & "'" & @ScriptName & "'" & @CRLF _ & "Function: 'Main_RunParamsDialog'" & @CRLF & @CRLF _ & 'No handle found for PSPad!') Exit(1) ; 1 = PSPad-hwnd NICHT gefunden. EndIf If $CmdLine[0] > 0 Then $sCOM_ROT_Name_RunPrmsDlg = $CmdLine[1] $sRunParamsDlgTitle = $CmdLine[2] Else MsgBox($MB_SYSTEMMODAL + $MB_ICONWARNING, 'COM Object Error', _ 'Error in Module "' & @ScriptName & '"' & @CRLF _ & 'Function "Main_RunParamsDialog"' & @CRLF & @CRLF _ & 'No COM ROT name was transmitted for:' & @CRLF & @CRLF & 'RunParamsDialog') Exit(2) ; 2 = Es wurde kein Name für das COM ROT Objekt (Dictionary) übermittelt. EndIf $g_oDict_COM_RunPrmsDlg = ObjGet($sCOM_ROT_Name_RunPrmsDlg) ; Dictionary object If @error Then MsgBox($MB_SYSTEMMODAL + $MB_ICONWARNING, 'COM Object Error', _ 'Error in Module "' & @ScriptName & '"' & @CRLF _ & 'Function "Main_RunParamsDialog"' & @CRLF & @CRLF _ & 'Error fetching a reference to the COM ROT object.') Exit(3) ; 3 = Fehler beim Holen einer Referenz auf das COM-ROT-Objekt. Else $g_oDict_COM_RunPrmsDlg.CompareMode = 1 ; (0 = BinärMode (default), 1 = Textmode = case INsensitive) EndIf ; If @error If $g_oDict_COM_RunPrmsDlg.Exists(String($g_hPSPad)) Then $hGuiTmp = HWnd($g_oDict_COM_RunPrmsDlg.Item(String($g_hPSPad))) If WinExists($hGuiTmp) Then Local $TmpEdit WinActivate($hGuiTmp) ; Die Reihenfolge von "Activate" und "Show" ist wichtig, ... If Not BitAND(WinGetState($hGuiTmp, ""), $WIN_STATE_VISIBLE) Then WinSetState($hGuiTmp, "", @SW_SHOW) ; ... damit die GUI optisch schneller als aktiv gezeigt wird. EndIf Exit(4) ; 4 = RunParamsDialog für diese PSPad-Instanz existiert schon. EndIf EndIf $aParentPos = WinGetPos($g_hPSPad) $g_hGui = GUICreate($sRunParamsDlgTitle, 240, 75, _ $aParentPos[0] + 40, $aParentPos[1] + 100, $GUI_SS_DEFAULT_GUI - $WS_MINIMIZEBOX, -1, $g_hPSPad) $g_oDict_COM_RunPrmsDlg(String($g_hPSPad)) = String($g_hGui) ; Key: Handle of PSPad; Value: Handle of RunParamsDialog. $g_aGui_SizeAtStart = WinGetPos($g_hGui) $aGui_CliSizeAtStart = WinGetClientSize($g_hGui) $lblBorderL = GUICtrlCreateLabel("", 0, 0, 4, $aGui_CliSizeAtStart[1]) GUICtrlSetCursor(-1, 13) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKTOP + $GUI_DOCKLEFT) $lblBorderR = GUICtrlCreateLabel("", $aGui_CliSizeAtStart[0] - 4, 0, 4, $aGui_CliSizeAtStart[1]) GUICtrlSetCursor(-1, 13) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKTOP + $GUI_DOCKRIGHT) $edtUserParams = GUICtrlCreateEdit("", 4, 4, $aGui_CliSizeAtStart[0] - 8, 44, $WS_HSCROLL) ;;;;;;;;;;;;;;Jocko Add;;;;;;;;;;;;;;;;;;;;;; $g_hEdit=$edtUserParams ;;;;;;;;;;;;;;End Jocko Add;;;;;;;;;;;;;;;;;; GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKHEIGHT) $lblHelp = GUICtrlCreateLabel("?", 4, $aGui_CliSizeAtStart[1] - 4 - 16, 16, 16, BitOR($SS_CENTER, $SS_CENTERIMAGE)) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKTOP + $GUI_DOCKLEFT) GUICtrlSetFont(-1, 10, 600, -1, "Arial") GUICtrlSetColor(-1, 0xFFFFFF) GUICtrlSetBkColor(-1, 0x0080F2) ; 0x0080F2 mittel blau, 0x0067C5 dunkel blau. $lblMaximizeH = GUICtrlCreateLabel("< >", 24, $aGui_CliSizeAtStart[1] - 4 - 16, 16 + 8, 16, BitOR($SS_CENTER, $SS_CENTERIMAGE)) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKTOP + $GUI_DOCKLEFT) GUICtrlSetFont(-1, 10, -1, -1, "Arial") $lblMaximizeH_Frame = GUICtrlCreateLabel("", 24, $aGui_CliSizeAtStart[1] - 4 - 16, 16 + 8, 16, $SS_BLACKFRAME) GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKTOP + $GUI_DOCKLEFT) GUISetState(@SW_SHOW) ;;;;;;;;;;;;;;Jocko Add;;;;;;;;;;;;;;;;;;;;;; SetKeys() GUIRegisterMsg($WM_ACTIVATE, "FocusChange") ;;;;;;;;;;;;;;End Jocko Add;;;;;;;;;;;;;;;;;; While 1 If _IsPressed("10", $g_hDLL) And _IsPressed("11", $g_hDLL) _ And _IsPressed("12", $g_hDLL) And _IsPressed("59", $g_hDLL) Then ExitLoop EndIf ;;;;;;;;;;;;;;Jocko Add;;;;;;;;;;;;;;;;;;;;;; If $g_hFocTime And TimerDiff($g_hFocTime)>250 Then If Not WinActive($g_hGui) Then SetKeys(False) $g_hFocTime=0 EndIf ;;;;;;;;;;;;;;EndJocko Add;;;;;;;;;;;;;;;;;;;;;; $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE ; Auch das Schließen per Esc landet hier. WinSetState($g_hGui, "", @SW_HIDE) Case $lblBorderL $iResizeType = 0xF000 + 1 ; 1: border left. _SendMessage($g_hGui, $WM_SYSCOMMAND, $iResizeType, 0) Case $lblBorderR $iResizeType = 0xF000 + 2 ; 2: border right. _SendMessage($g_hGui, $WM_SYSCOMMAND, $iResizeType, 0) Case $lblHelp MsgBox($MB_SYSTEMMODAL + $MB_ICONINFORMATION, "Info", _ "If the 'Run - params dialog' is visible, the specified parameters are passed to the script to be executed.", _ 0, $g_hGui) Case $lblMaximizeH If BitAND(WinGetState($g_hGui), $WIN_STATE_MAXIMIZED) = $WIN_STATE_MAXIMIZED Then WinSetState($g_hGui, "", @SW_RESTORE) GUICtrlSetData($lblMaximizeH, "< >") Else WinSetState($g_hGui, "", @SW_MAXIMIZE) GUICtrlSetData($lblMaximizeH, "> <") EndIf EndSwitch If Not WinExists($g_hPSPad) Then ExitLoop WEnd EndFunc ; ==> Main_RunParamsDialog ; ============================================================================== ; OnAutoItExit ; ; Routine die aufgerufen werden soll, wenn AutoIt verlassen wird. ; Sie wurde mit "OnAutoItExitRegister('OnAutoItExit')" registriert. ; ------------------------------------------------------------------------------ Func OnAutoItExit() DllClose($g_hDLL) EndFunc ; ==> OnAutoItExit ; ============================================================================== ; WM_GETMINMAXINFO ; ; Minimum und Maximum für Höhe und Breite der GUI einstellen. ; ------------------------------------------------------------------------------ Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam, $lParam If $hWnd = $g_hGui Then Local $aGui_SizeCurrent = WinGetPos($g_hGui) Local $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam) DllStructSetData($minmaxinfo, 4, $aGui_SizeCurrent[3]) ; height of the maximized window <= Kann nur benutzt werden, wenn NICHT mit max height eingeschränkt. DllStructSetData($minmaxinfo, 6, $aGui_SizeCurrent[1]) ; top of the maximized window DllStructSetData($minmaxinfo, 7, $g_aGui_SizeAtStart[2]) ; min width DllStructSetData($minmaxinfo, 8, $g_aGui_SizeAtStart[3]) ; min height Return 0 EndIf EndFunc ;==>WM_GETMINMAXINFO #cs typedef struct tagMINMAXINFO { POINT ptReserved; POINT ptMaxSize; POINT ptMaxPosition; POINT ptMinTrackSize; POINT ptMaxTrackSize; } MINMAXINFO, *PMINMAXINFO, *LPMINMAXINFO; #ce ;;;;;;;;;;;;;;Jocko Add;;;;;;;;;;;;;;;;;;;;;; Func FocusChange($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam, $lParam If $wParam Then SetKeys(True) Else $g_hFocTime=TimerInit() EndIf Return $GUI_RUNDEFMSG EndFunc Func SetKeys($bSet=True) For $n=32 To 126 If $bSet Then HotkeySet(Chr($n), "SendToControl") Else HotkeySet(Chr($n)) EndIf Next EndFunc Func SendToControl() Local $sHotKey=@HotKeyPressed HotkeySet($sHotKey) ControlSend($g_hGui, "", $g_hEdit, $sHotKey) HotkeySet($sHotKey,"SendToControl") EndFunc ;;;;;;;;;;;;;;End Jocko Add;;;;;;;;;;;;;;;;;;