Crée une boîte de dialogue Rechercher/Remplacer, de type modale, définie par le système, pour rechercher/remplacer du texte dans un document
#include <WinAPIDlg.au3>
_WinAPI_FindTextDlg ( $hOwner [, $sFindWhat = '' [, $iFlags = 0 [, $pFindProc = 0 [, $lParam = 0]]]] )
$hOwner | Le handle de la fenêtre qui est propriétaire de la boîte de dialogue. La procédure de fenêtre de la fenêtre spécifiée reçoit des messages FINDMSGSTRING de la boîte de dialogue. Ce paramètre doit être le handle d'une 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. |
$iFlags | [optionnel] Un jeu de flag 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 enregistré FINDMSGSTRING pour indiquer l'entrée de l'utilisateur. Ce paramètre peut prendre une ou plusieurs des valeurs suivantes: $FR_DIALOGTERM - La boîte de dialogue se ferme. Après le traitement de ce message par la fenêtre propriétaire, le handle de la boîte de dialogue n'est plus valide. $FR_DOWN - Si ce flag est levé, le bouton Bas des boutons radio directionnels est coché pour indiquer que l'utilisateur souhaite effectuer une recherche à partir de l'emplacement actuel jusqu'à la fin du document. Si FR_DOWN est baissé, le bouton Haut est coché pour indiquer que l'utilisateur souhaite rechercher au début du document. $FR_ENABLEHOOK - Active la fonction de hook spécifiée dans le membre Hook. Cet indicateur est utilisé uniquement pour initialiser la boîte de dialogue. $FR_ENABLETEMPLATE - Indique que les membres Instance et TemplateName spécifient un modèle de boîte de dialogue à utiliser à la place du modèle par défaut. Cet indicateur est utilisé uniquement pour initialiser la boîte de dialogue. $FR_ENABLETEMPLATEHANDLE - Indique que le membre Instance identifie un bloc de données contenant un modèle de boîte de dialogue préchargé. Le système ignore le membre TemplateName si cet indicateur est spécifié. $FR_FINDNEXT - L'utilisateur a cliqué sur le bouton Suivant dans la boîte de dialogue Rechercher ou Remplacer. $FR_HIDEUPDOWN - Si ce flag est levé lors de l'initialisation d'une boîte de dialogue Rechercher, masque les boutons radio de la direction de recherche. $FR_HIDEMATCHCASE - Si ce flag est levé lors de l'initialisation d'une boîte de dialogue Rechercher ou Remplacer, masque la case à cocher relative à la casseSi ce flag est levé lors de l'initialisation d'une boîte de dialogue Rechercher ou Remplacer, masque la case à cocher relative à la casse. $FR_HIDEWHOLEWORD - Si ce flag est levé lors de l'initialisation d'une boîte de dialogue Rechercher ou Remplacer, masque la case à cocher relative à Mot entier. $FR_MATCHCASE - Si ce flag est levé, la case à cocher 'Respecter la casse' est cochée, indiquant que l'utilisateur souhaite que la recherche soit sensible à la casse. Si FR_MATCHCASE est baissé, la case à cocher n'est pas cochée, la recherche est insensible à la casse. $FR_NOMATCHCASE - Si ce flag est levé lors de l'initialisation d'une boîte de dialogue Rechercher ou Remplacer, décoche la case relative à la casse $FR_NOUPDOWN - Si ce flag est levé lors de l'initialisation d'une boîte de dialogue Rechercher, désactve les boutons radio relatifs à la direction $FR_NOWHOLEWORD - Si ce flag est levé lors de l'initialisation d'une boîte de dialogue Rechercher ou Remplacer, décoche la case Mot entier $FR_REPLACE - L'utilisateur a cliqué sur le bouton Remplacer dans la boîte de dialogue Remplacer. $FR_REPLACEALL - L'utilisateur a cliqué sur le bouton Remplacer Tout dans la boîte de dialogue Remplacer. $FR_SHOWHELP - Force la boîte de dialogue à afficher le bouton Aide. Le membre Owner doit spécifier la fenêtre pour recevoir les messages enregistrés HELPMSGSTRING que la boîte de dialogue envoie lorsque l'utilisateur clique sur le bouton Aide. $FR_WHOLEWORD - Si ce flag est levé, la case 'Mot entier' est cochée, indiquant que l'utilisateur souhaite rechercher uniquement les mots entiers correspondant à la chaîne de recherche. Si FR_WHOLEWORD est baissé, la case n'est pas cochée. Vous devez également rechercher les fragments de mot correspondant à la chaîne de recherche. |
$pFindProc | [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 défini. (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 de la fenêtre de la boîte de dialogue. |
Échec: | Retourne 0 et définit @error <> 0, @extended contient le code d'erreur de la boîte de dialogue. |
La fonction _WinAPI_FindTextDlg() ne lance pas une opération de recherche. Au lieu de cela, la boîte de dialogue envoie les messages enregistrés FINDMSGSTRING à la procédure fenêtre de la fenêtre propriétaire de la boîte de dialogue.
Avant d'appeler _WinAPI_FindTextDlg(), vous devez appeler la fonction _WinAPI_RegisterWindowMessage() pour obtenir l'identifiant du message FINDMSGSTRING. La procédure de boîte de dialogue utilise cet identifiant pour envoyer des messages lorsque l'utilisateur clique sur le bouton "Suivant", ou quand la boîte de dialogue est fermée. Le paramètre "lParam" du message de FINDMSGSTRING contient un pointeur sur une structure $tagFINDREPLACE. Le membre "Flags" de cette structure indique l'événement qui a déclenché le message. D'autres membres de la structure indiquent l'entrée de l'utilisateur.
La fonction _WinAPI_FindTextDlg() utilise une mémoire tampon interne pour y placer la chaîne que l'utilisateur a tapée dans le contrôle d'édition "Rechercher". Vous pouvez augmenter la taille de cette mémoire tampon en utilisant la fonction _WinAPI_SetFRBuffer(). De plus, pour libérer la mémoire allouée pour la mémoire 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 FindText 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 $e_sText = '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, $e_sText, 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) ; Inscrit le 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 une boîte de dialogue Find ou 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), 'Ne peut pas trouver "'& $sFind & '" ('& $iError & ')', 0, $g_hDlg) Return EndIf ; Ici et ci-dessous est utilisé le message EM_SETSEL directement parce que _GUICtrlRichEdit_SetSel() définit le focus dans 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 une 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), 'Cannot find "'& $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 se referme Case BitAND($iFlags, $FR_DIALOGTERM) ; Détruit le 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