Crée une boîte de dialogue de type modal, définie par le système, qui permet à l'utilisateur de spécifier une chaîne à rechercher et une chaîne de remplacement
#include <WinAPIDlg.au3>
_WinAPI_ReplaceTextDlg ( $hOwner [, $sFindWhat = '' [, $sReplaceWith = '' [, $iFlags = 0 [, $pReplaceProc = 0 [, $lParam = 0]]]]] )
$hOwner | Le handle de la fenêtre qui est propriétaire de la boîte de dialogue. La procédure fenêtre de la fenêtre spécifiée reçoit les messages FINDMSGSTRING de la boîte de dialogue. Ce paramètre peut être n'importe quel handle de fenêtre valide, mais il ne doit pas être 0. |
$sFindWhat | [optionnel] La chaîne à rechercher qui s'affiche lors de l'initialisation de la boîte de dialogue. |
$sReplaceWith | [optionnel] La chaîne de remplacement qui s'affiche lorsque vous initialisez la boîte de dialogue. |
$iFlags | [optionnel] Un jeu de bits qui permet d'initialiser la boîte de dialogue. La boîte de dialogue définit ces flags quand elle envoie le message inscrit FINDMSGSTRING pour indiquer l'entrée de l'utilisateur. Ce paramètre prendre une ou plusieurs des valeurs suivantes: $FR_DIALOGTERM $FR_DOWN $FR_ENABLEHOOK $FR_ENABLETEMPLATE $FR_ENABLETEMPLATEHANDLE $FR_FINDNEXT $FR_HIDEUPDOWN $FR_HIDEMATCHCASE $FR_HIDEWHOLEWORD $FR_MATCHCASE $FR_NOMATCHCASE $FR_NOUPDOWN $FR_NOWHOLEWORD $FR_REPLACE $FR_REPLACEALL $FR_SHOWHELP $FR_WHOLEWORD |
$pReplaceProc | [optionnel] Pointeur sur une procédure hook qui peut traiter les messages destinés à la boîte de dialogue. Ce paramètre est ignoré si le flag $FR_ENABLEHOOK n'est pas activé. (Voir MSDN pour plus d'informations) |
$lParam | [optionnel] Données définies par l'application que le système passe à la procédure hook. |
Succès: | Retourne le handle fenêtre de la boîte de dialogue. |
Échec: | Définit @error <> 0, @extended contient le code d'erreur de boîte de dialogue. |
_WinAPI_ReplaceTextDlg() n'effectue pas une opération de remplacement de texte. A la place, la boîte de dialogue envoie les messages inscrits FINDMSGSTRING à la procédure fenêtre de la fenêtre propriétaire de la boîte de dialogue.
Avant d'appeler _WinAPI_ReplaceTextDlg(), vous devez appeler la fonction _WinAPI_RegisterWindowMessage() pour obtenir l'identifiant du message FINDMSGSTRING.
La procédure de la boîte de dialogue utilise cet identifiant pour envoyer des messages lorsque l'utilisateur clique sur les boutons "Find Next", "Replace" ou "Replace All", ou quand la boîte de dialogue se ferme.
Le paramètre "lParam" du message FINDMSGSTRING contient un pointeur sur une structure $tagFINDREPLACE.
Le membre "Flags" de cette structure indique l'événement qui a provoqué le message.
D'autres membres de la structure indiquent l'entrée de l'utilisateur.
_WinAPI_ReplaceTextDlg() utilise une mémoire tampon interne pour contenir la chaîne que l'utilisateur a tapé dans les contrôles d'édition "Find What" et "Replace With".
Vous pouvez augmenter la taille de ce tampon en utilisant la fonction _WinAPI_SetFRBuffer().
En plus, pour libérer la mémoire allouée pour le tampon interne, vous devez appeler _WinAPI_FlushFRBuffer() en réponse au message FINDMSGSTRING avec le flag $FR_DIALOGTERM activé.
_WinAPI_FlushFRBuffer, _WinAPI_RegisterWindowMessage, _WinAPI_SetFRBuffer
Consultez ReplaceText dans la librairie MSDN.
#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