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