Détruit la mémoire tampon interne utilisée par les fonctions _WinAPI_FindTextDlg() et _WinAPI_ReplaceTextDlg()
#include <WinAPIDlg.au3>
_WinAPI_FlushFRBuffer ( )
Succès: | Retourne 1. |
Échec: | Retourne 0 et définit @error <> 0. |
_WinAPI_FlushFRBuffer() peut être appelée qu'en réponse au message FINDMSGSTRING avec le flag $FR_DIALOGTERM activé.
Pour plus d'informations, voir les fonctions _WinAPI_FindTextDlg() et _WinAPI_ReplaceTextDlg().
_WinAPI_FindTextDlg, _WinAPI_ReplaceTextDlg, _WinAPI_SetFRBuffer
#include <APIDlgConstants.au3> #include <FontConstants.au3> #include <GUIConstantsEx.au3> #include <GuiRichEdit.au3> #include <MsgBoxConstants.au3> #include <SendMessage.au3> #include <WinAPIDlg.au3> #include <WinAPIGdi.au3> #include <WinAPIMisc.au3> #include <WinAPISysWin.au3> #include <WindowsConstants.au3> Local Const $sTxt = 'AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting. It uses a combination of simulated keystrokes, mouse movement and window/control manipulation in order to automate tasks in a way not possible or reliable with other languages (e.g. VBScript and SendKeys). AutoIt is also very small, self-contained and will run on all versions of Windows out-of-the-box with no annoying "runtimes" required!'& @CRLF & @CRLF & _ 'AutoIt was initially designed for PC "roll out" situations to reliably automate and configure thousands of PCs. Over time it has become a powerful language that supports complex expressions, user functions, loops and everything else that veteran scripters would expect.' ; Crée une GUI Local $hForm = GUICreate('Test '& StringReplace(@ScriptName, '.au3', '()'), 800, 600) ; Crée un menu principal Local $idMenu = GUICtrlCreateMenu('&File') Local $idExitItem = GUICtrlCreateMenuItem('E&xit...', $idMenu) $idMenu = GUICtrlCreateMenu('&Edit') Local $idFindItem = GUICtrlCreateMenuItem('&Find...', $idMenu) Local $idReplaceItem = GUICtrlCreateMenuItem('R&eplace...', $idMenu) ; Crée un contrôle Rich Edit avec la sélection de texte toujours visible, et définit la police "Courier New" dans le contrôle Local $hRichEdit = _GUICtrlRichEdit_Create($hForm, $sTxt, 0, 0, 800, 600, BitOR($ES_AUTOVSCROLL, $ES_NOHIDESEL, $ES_MULTILINE, $WS_VSCROLL), 0) Local $hFont = _WinAPI_CreateFont(17, 0, 0, 0, $FW_NORMAL, 0, 0, 0, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $ANTIALIASED_QUALITY, $DEFAULT_PITCH, 'Courier New') _SendMessage($hRichEdit, $WM_SETFONT, $hFont, 1) _SendMessage($hRichEdit, $EM_SETSEL) ; Crée un message FINDMSGSTRING pour recevoir les messages de la boîte de dialogue GUIRegisterMsg(_WinAPI_RegisterWindowMessage('commdlg_FindReplace'), 'WM_FINDMSGSTRING') ; Affiche la GUI GUISetState(@SW_SHOW) Global $g_hDlg Local $iMsg = GUIGetMsg(), $sText While $iMsg <> $GUI_EVENT_CLOSE And $iMsg <> $idExitItem Switch $iMsg Case $idFindItem, $idReplaceItem $sText = _GUICtrlRichEdit_GetSelText($hRichEdit) If @error Then $sText = '' EndIf ; Désactive les éléments de menu "Find..." et "Replace...", sinon, le script peut se bloquer GUICtrlSetState($idFindItem, $GUI_DISABLE) GUICtrlSetState($idReplaceItem, $GUI_DISABLE) Switch $iMsg Case $idFindItem $g_hDlg = _WinAPI_FindTextDlg($hForm, $sText, $FR_DOWN, 0, $hRichEdit) Case $idReplaceItem $g_hDlg = _WinAPI_ReplaceTextDlg($hForm, $sText, '', 0, 0, $hRichEdit) EndSwitch Case $idReplaceItem EndSwitch $iMsg = GUIGetMsg() WEnd GUIDelete() Func _IsMatchSelection($hWnd, $sText, $iBehavior) Local $aPos = _GUICtrlRichEdit_GetSel($hWnd) If @error Then Return 0 $aPos = _GUICtrlRichEdit_FindTextInRange($hWnd, $sText, $aPos[0], $aPos[1], BitAND($iBehavior, $FR_MATCHCASE) = $FR_MATCHCASE, BitAND($iBehavior, $FR_WHOLEWORD) = $FR_WHOLEWORD, BitAND($iBehavior, BitOR($FR_MATCHALEFHAMZA, $FR_MATCHDIAC, $FR_MATCHKASHIDA))) If @error Or ($aPos[0] = -1) Or ($aPos[1] = -1) Then Return 0 Else Return 1 EndIf EndFunc ;==>_IsMatchSelection Func WM_FINDMSGSTRING($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam Local $tFINDREPLACE = DllStructCreate($tagFINDREPLACE, $lParam) Local $sReplace = _WinAPI_GetString(DllStructGetData($tFINDREPLACE, 'ReplaceWith')) Local $sFind = _WinAPI_GetString(DllStructGetData($tFINDREPLACE, 'FindWhat')) Local $hRichEdit = Ptr(DllStructGetData($tFINDREPLACE, 'lParam')) Local $iFlags = DllStructGetData($tFINDREPLACE, 'Flags') Local $aPos, $iCur = -1 Select ; L'utilisateur a cliqué sur le bouton "Replace" dans une boîte de dialogue Replace Case BitAND($iFlags, $FR_REPLACE) If _IsMatchSelection($hRichEdit, $sFind, $iFlags) Then _GUICtrlRichEdit_ReplaceText($hRichEdit, $sReplace) EndIf ContinueCase ; L'utilisateur a cliqué sur le bouton "Find Next" dans la boîte de dialogue Find et Replace Case BitAND($iFlags, $FR_FINDNEXT) $aPos = _GUICtrlRichEdit_GetSel($hRichEdit) If @error Then Return If BitAND($iFlags, $FR_DOWN) Then $aPos = _GUICtrlRichEdit_FindTextInRange($hRichEdit, $sFind, $aPos[1], -1, BitAND($iFlags, $FR_MATCHCASE) = $FR_MATCHCASE, BitAND($iFlags, $FR_WHOLEWORD) = $FR_WHOLEWORD) Else $aPos = _GUICtrlRichEdit_FindTextInRange($hRichEdit, $sFind, $aPos[0], 0, BitAND($iFlags, $FR_MATCHCASE) = $FR_MATCHCASE, BitAND($iFlags, $FR_WHOLEWORD) = $FR_WHOLEWORD, BitAND($iFlags, $FR_DOWN)) EndIf If @error Or ($aPos[0] = -1) Or ($aPos[1] = -1) Then Local $iError = @error MsgBox(BitOR($MB_ICONINFORMATION, $MB_SYSTEMMODAL), WinGetTitle($g_hDlg), 'Cannot find "'& $sFind & '" ('& $iError & ')', 0, $g_hDlg) Return EndIf ; Ici et ci-dessous est utilisé le message EM_SETSEL directement parce _GUICtrlRichEdit_SetSel () définit le focus sur le contrôle Rich Edit _SendMessage($hRichEdit, $EM_SETSEL, $aPos[0], $aPos[1]) ; _GUICtrlRichEdit_ScrollToCaret($HRichEdit) ; L'utilisateur a cliqué sur le bouton "Replace All" dans la boîte de dialogue Replace Case BitAND($iFlags, $FR_REPLACEALL) Dim $aPos[2] = [0, -1] While 1 $aPos = _GUICtrlRichEdit_FindTextInRange($hRichEdit, $sFind, $aPos[0], -1, BitAND($iFlags, $FR_MATCHCASE) = $FR_MATCHCASE, BitAND($iFlags, $FR_WHOLEWORD) = $FR_WHOLEWORD) If ($aPos[0] = -1) Or ($aPos[1] = -1) Then If $iCur = -1 Then MsgBox(BitOR($MB_ICONINFORMATION, $MB_SYSTEMMODAL), WinGetTitle($g_hDlg), 'Impossible de trouver "'& $sFind & '"', 0, $g_hDlg) Return EndIf ExitLoop EndIf If $iCur = -1 Then _GUICtrlRichEdit_PauseRedraw($hRichEdit) EndIf _SendMessage($hRichEdit, $EM_SETSEL, $aPos[0], $aPos[1]) If _GUICtrlRichEdit_ReplaceText($hRichEdit, $sReplace) Then $iCur = $aPos[0] + StringLen($sReplace) Else ExitLoop EndIf WEnd _SendMessage($hRichEdit, $EM_SETSEL, $iCur, $iCur) ; _GUICtrlRichEdit_ScrollToCaret($HRichEdit) _GUICtrlRichEdit_ResumeRedraw($hRichEdit) ; La boîte de dialogue est fermée Case BitAND($iFlags, $FR_DIALOGTERM) ; Détruit la mémoire tampon interne, et libère la mémoire allouée _WinAPI_FlushFRBuffer() ; Active les éléments de menu "Find..." et "Replace..." GUICtrlSetState($idReplaceItem, $GUI_ENABLE) GUICtrlSetState($idFindItem, $GUI_ENABLE) EndSelect EndFunc ;==>WM_FINDMSGSTRING