1 (изменено: avens, 2015-01-05 16:32:48)

Тема: AHK: Поиск и выделение текста в поле Edit

Как можно сделать поиск в поле Edit?
Так что бы при нахождении вводимого текста он выделялся, как например в стандартном блокноте Windows.

Text =
(
Как можно сделать поиск в поле Edit?
Так что бы при нахождении вводимого текста он выделялся, как например в стандартном блокноте Windows.
)

Gui, +Resize
Gui, Add, Edit, x0 y0 w500 h200 vMainEdit, %Text%
Gui, Show, xCenter y125 w500 h200, GuiEdit
Hotkey, IfWinActive, GuiEdit
Hotkey, ^sc021, SearchEdit ;Ctrl+F
return

GuiSize:
if ErrorLevel = 1
    return
NewWidth := A_GuiWidth
NewHeight := A_GuiHeight
GuiControl, Move, MainEdit, W%NewWidth% H%NewHeight%
WinSet, Redraw, ,
return

SearchEdit:
Gui, 2: +AlwaysOnTop +Owner +ToolWindow
Gui, 2: Add, Edit, x0 y0 w210 h20 vSearchText
Gui, 2: Add, Button, x210 y0 w40 h20 gGoSearch, Поиск
Gui, 2: Show, xCenter y180 w250 h20, Введите текст для поиска
Hotkey, IfWinActive, Введите текст для поиска
Hotkey, Enter, GoSearch ;Enter
return

GoSearch:
Gui Submit, NoHide
;???
return

GuiClose:
ExitApp

2GuiClose:
Gui, Destroy
return

2

Re: AHK: Поиск и выделение текста в поле Edit


Text =
(
Как можно сделать поиск в поле Edit?
Так что бы при нахождении вводимого текста он выделялся, как например в стандартном блокноте Windows.
)

Gui, +Resize
Gui, Add, Edit, x0 y0 w500 h200 vMainEdit HWNDhMainEdit, %Text%
Gui, 2: +AlwaysOnTop +Owner +ToolWindow
Gui, 2: Add, Edit, x0 y0 w210 h20 vSearchText HWNDhSearchEdit
Gui, 2: Add, Button, x210 y0 w40 h20 gGoSearch, Поиск
Gui, Show, xCenter y125 w500 h200, GuiEdit
Hotkey, IfWinActive, GuiEdit
Hotkey, ^sc021, SearchEdit ;Ctrl+F
EM_SETSEL = 0xB1
EM_SCROLLCARET = 0xB7
return

SearchEdit:
Gui, 2: Show, xCenter y180 w250 h20, Введите текст для поиска
Hotkey, IfWinActive, Введите текст для поиска
Hotkey, Enter, GoSearch ;Enter
return

GoSearch:
ControlGetText, Haystack,, ahk_id %hMainEdit%
ControlGetText, Needle,, ahk_id %hSearchEdit%
If( Pos := InStr( Haystack, Needle ) ) {
    Gui, 2: Hide
    SendMessage, %EM_SETSEL%, % Pos - 1, % Pos - 1 + StrLen( Needle ),, ahk_id %hMainEdit%
    SendMessage, %EM_SCROLLCARET%, 0, 0,, ahk_id %hMainEdit%
}
Else {
    ControlSetText,, Не найдено, ahk_id %hSearchEdit%
}
return

GuiClose:
ExitApp

3

Re: AHK: Поиск и выделение текста в поле Edit


Text =
(
Как можно сделать поиск в поле Edit?
Как можно сделать поиск в поле Edit?
Как можно сделать поиск в поле Edit?


Как можно сделать поиск в поле Edit?
Как можно сделать поиск в поле Edit?
Как можно сделать поиск в поле Edit?
)

Gui, +Resize
Gui, Add, Edit, x0 y0 w500 h100 vMainEdit hwndhMainEdit +256, %Text%
 ; +256 = ES_NOHIDESEL - показывает выделение при неактивном окне с контролом.
PostMessage, 0x00B1, 0, 0, , ahk_id %hMainEdit%    ;  EM_SETSEL
Gui, Show, y125 w500 h100, GuiEdit

Gui, 2: +AlwaysOnTop +Owner +ToolWindow  
Gui, 2: Add, Edit, x0 y0 w210 h20 vFind hwndhFind, можно
Gui, 2: Add, Button, x210 y0 w40 h20 gGoSearch, Поиск

Hotkey, IfWinActive, GuiEdit
Hotkey, ^sc021, SearchEdit ; Ctrl+F
  
SearchEdit:
    Gui, 2: Show, xCenter y180 w250 h20, Введите текст для поиска
    Hotkey, IfWinActive, Введите текст для поиска
    Hotkey, Enter, GoSearch ;Enter
    return

GoSearch:
    GuiControlGet, MainEdit, 1:
    GuiControlGet, Find, 2:
    StringReplace, MainEdit, MainEdit, `n , ``n, 1
    VarSetCapacity(end, 4)
    SendMessage, 0xB0,  , &end, , ahk_id %hMainEdit%  ; EM_GETSEL 
    If !f := (f := InStr(MainEdit, Find, 1, NumGet(end)+1)) ? f : InStr(MainEdit, Find, 1, 1)
    {
        MsgBox Не найдено
        return
    }
    PostMessage, 0x00B1, f-1, f+StrLen(Find)-1, , ahk_id %hMainEdit%    ;  EM_SETSEL
    PostMessage, 0xB7,,,, ahk_id %hMainEdit%    ;  EM_SCROLLCARET  
    return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: Поиск и выделение текста в поле Edit

serzh82saratov, ваш с повторным поиском, как и в блокноте Windows. Супер!
Давно хотел такую возможность на AHK!
Благодарю всех за помощь!

5

Re: AHK: Поиск и выделение текста в поле Edit

Я делал поиск с учётом переносов строк, указывая их в строке поиска как "`n", если не требуется, то лучше как в примере ниже. Ещё добавил регистр (не для кириллицы).

+ открыть спойлер

Text =
(
Как можно сделать поиск в поле Edit?
Как можно сделать поиск в поле Edit?
Как можно сделать поиск в поле Edit?


Как можно сделать поиск в поле Edit?
Как можно сделать поиск в поле Edit?
Как можно сделать поиск в поле Edit?
)

Gui, +Resize
Gui, Add, Edit, x0 y0 w500 h100 vMainEdit hwndhMainEdit +256, %Text%
 ; +256 = ES_NOHIDESEL - показывает выделение при неактивном окне с контролом.
PostMessage, 0x00B1, 0, 0, , ahk_id %hMainEdit%    ;  EM_SETSEL
Gui, Show, w500 h100, GuiEdit

Gui, 2: +AlwaysOnTop +Owner +ToolWindow  
Gui, 2: Add, Edit, x0 y0 w210 h20 vFind hwndhFind, можно
Gui, 2: Add, Checkbox, vSens y+5 Border, С учетом регистра
Gui, 2: Add, Button, x170 yp w40 h20 gGoSearch, Поиск

Hotkey, IfWinActive, GuiEdit
Hotkey, ^sc021, SearchEdit ; Ctrl+F
  
SearchEdit:
    Gui, 2: Show, , Введите текст для поиска
    Hotkey, IfWinActive, Введите текст для поиска
    Hotkey, Enter, GoSearch ;Enter 
    return

GoSearch:
    GuiControlGet, Sens, 2:  
    ControlGetText, MainEdit,, ahk_id %hMainEdit% 
    ControlGetText, Find,, ahk_id %hFind%
    VarSetCapacity(end, 4)
    SendMessage, 0xB0,  , &end, , ahk_id %hMainEdit%  ; EM_GETSEL 
    If !f := (f := InStr(MainEdit, Find, Sens, NumGet(end)+1)) ? f : InStr(MainEdit, Find, Sens, 1)
    {
        MsgBox Не найдено
        return
    }
    PostMessage, 0x00B1, f-1, f+StrLen(Find)-1, , ahk_id %hMainEdit%    ;  EM_SETSEL
    PostMessage, 0xB7,,,, ahk_id %hMainEdit%    ;  EM_SCROLLCARET  
    return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Поиск и выделение текста в поле Edit

Последний пример надо в Коллекцию!

7 (изменено: serzh82saratov, 2015-01-05 21:26:25)

Re: AHK: Поиск и выделение текста в поле Edit

Добавил направление поиска.
Изменил стиль окна, плюс оно теперь сворачивается вместе с главным.

#SingleInstance Force
#NoEnv

ES_NOHIDESEL := 256  ; показывает выделение текста в Edit при неактивном окне
EM_SETSEL := 0x00B1  ; установка выделения
EM_SCROLLCARET := 0xB7  ; сделать видимым выделенный текст
EM_GETSEL := 0xB0  ; извлечеть позицию каретки ввода
VarSetCapacity(start, 4), VarSetCapacity(end, 4)

Loop 12
    Text .= "Как можно сделать поиск в поле Edit?`n"

Gui, -DPIScale +HWNDhGUIMain
Gui, Add, Edit, x0 y0 w500 h100 vMainEdit hwndhMainEdit %ES_NOHIDESEL%, %Text%
PostMessage, EM_SETSEL, 0, 0, , ahk_id %hMainEdit%
Gui, Show, w500 h300, Edit find

Gui, 2: +AlwaysOnTop +Owner1 -MaximizeBox -MinimizeBox -DPIScale +HWNDhGUIFind
Gui, 2: Add, Text, ym+5, Что:
Gui, 2: Add, Edit, x+25 yp-5 w284 vFind hwndhFind, можно
Gui, 2: Add, Button, x+10 yp gGoSearch, Найти далее
Gui, 2: Add, Button, xp y+5 wp gCancel, Отмена
Gui, 2: Add, Checkbox, vSens y+0 xm, С учетом регистра
Gui, 2: Add, GroupBox, x+10 yp-20 h50, Направление
Gui, 2: Add, Radio, xp+10 yp+25 vDirectUp, Вверх
Gui, 2: Add, Radio, x+15 Checked, Вниз

SearchEdit:
    Gui, 2: Show, , Найти
    Return
Cancel:
    Gui, 2: Hide
    Return

GoSearch:
    GuiControlGet, DirectUp, 2:
    GuiControlGet, Sens, 2:
    ControlGetText, MainEdit,, ahk_id %hMainEdit%
    ControlGetText, Find,, ahk_id %hFind%
    SendMessage, EM_GETSEL, &start, &end, , ahk_id %hMainEdit%
    If DirectUp
        f := (f := InStr(SubStr(MainEdit, 1, NumGet(start)), Find, Sens, 0)) ? f : InStr(MainEdit, Find, Sens, 0)
    Else
        f := (f := InStr(MainEdit, Find, Sens, NumGet(end)+1)) ? f : InStr(MainEdit, Find, Sens, 1)
    If !f
    {
        MsgBox Не найдено
        Return
    }
    PostMessage, EM_SETSEL, f-1, f+StrLen(Find)-1, , ahk_id %hMainEdit%
    PostMessage, EM_SCROLLCARET,,,, ahk_id %hMainEdit%
    Return

#If WinActive("ahk_id" hGUIMain)
^vk46:: GoSub SearchEdit   ;  "Ctrl+F"
#If WinActive("ahk_id" hGUIFind)
Enter:: GoSub GoSearch
#If

GuiEscape:
GuiClose:
    ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Поиск и выделение текста в поле Edit

serzh82saratov пишет:

Хорошо, разместил.

По-моему, сыровато для Коллекции. Регистр кириллицы вполне можно учесть через RegEx. Кроме того, Msgbox «Не найдено» перекрывается окном поиска.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Поиск и выделение текста в поле Edit

Согласен.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Поиск и выделение текста в поле Edit

Ещё хотел убрать у окна поиска иконку в заголовке, также как в оригинале, но что то не понял как.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Поиск и выделение текста в поле Edit

+ToolWindow

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: Поиск и выделение текста в поле Edit

Так нет текста в заголовке, и окно какое то квадратное. Не то.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13 (изменено: avens, 2015-01-05 22:06:09)

Re: AHK: Поиск и выделение текста в поле Edit

serzh82saratov пишет:

Ещё хотел убрать у окна поиска иконку в заголовке, также как в оригинале, но что то не понял как.

Возможно это подойдет:
SysMenu: задайте -SysMenu, чтобы убрать системное меню и иконку из верхнего левого угла окна. Также данная опция убирает со строки заголовка кнопки свертывания, развертывания и закрытия окна.

----------
Ан нет, с ней наверное квадратик закрытия окна никак не вернуть...

14

Re: AHK: Поиск и выделение текста в поле Edit

serzh82saratov пишет:

Так нет текста в заголовке

У меня есть:
https://cloclo20.cloud.mail.ru/weblink/thumb/xw1/42d0fc83d1fa/2015.01.05-21.03.25.7.jpg
По-другому без полного удаления системного меню никак.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: AHK: Поиск и выделение текста в поле Edit

По идее иконка должна убираться, если посылать WM_SETICON с нулевым хендлом, но не срабатывает.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: Поиск и выделение текста в поле Edit

если посылать WM_SETICON с нулевым хендлом, но не срабатывает.

Что то такое пробовал, иконка исчезает, но место под неё остаётся зарезервированным.

---

Да, я всё это пробовал, потому и стало любопытно, как казалось бы простая вещь, реализована.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: Поиск и выделение текста в поле Edit

Попробовал найти слово "Сделать" без учета регистра - не нашло, а вот слово "сделать" нашло.

Как сказал мой дед - Я твой дед

18

Re: AHK: Поиск и выделение текста в поле Edit

С иконкой ничего не нашёл.

teadrinker пишет:

По-моему, сыровато для Коллекции. Регистр кириллицы вполне можно учесть через RegEx. Кроме того, Msgbox «Не найдено» перекрывается окном поиска.

RegEx думаю тяжелый получится с нахождением правых совпадений при поиске вверх. Насколько я знаю, тут "StringCaseSense Locale" хватит вполне. Msgbox подукрасил.


#SingleInstance Force
#NoEnv
StringCaseSense Locale

ES_NOHIDESEL := 256  ; показывает выделение текста в Edit при неактивном окне
EM_SETSEL := 0x00B1  ; установка выделения
EM_SCROLLCARET := 0xB7  ; сделать видимым выделенный текст
EM_GETSEL := 0xB0  ; извлечь позицию каретки ввода
VarSetCapacity(start, 4), VarSetCapacity(end, 4)

Loop 12
    Text .= "Как можно сделать поиск в поле Edit?`n"

Gui, -DPIScale +HWNDhGUIMain
Gui, Add, Edit, x0 y0 w500 h100 vMainEdit hwndhMainEdit %ES_NOHIDESEL%, %Text%
PostMessage, EM_SETSEL, 0, 0, , ahk_id %hMainEdit%
Gui, Show, w500 h300, Edit find

Gui, 2: +Owner1 -MaximizeBox -MinimizeBox -DPIScale +HWNDhGUIFind
Gui, 2: Add, Text, ym+5, Что:
Gui, 2: Add, Edit, x+25 yp-5 w284 vFind hwndhFind, Можно
Gui, 2: Add, Button, x+10 yp gGoSearch, Найти далее
Gui, 2: Add, Button, xp y+5 wp gCancel, Отмена
Gui, 2: Add, Checkbox, vSens y+0 xm, С учетом регистра
Gui, 2: Add, GroupBox, x+10 yp-25 h50, Направление
Gui, 2: Add, Radio, xp+10 yp+25 vDirectUp, Вверх
Gui, 2: Add, Radio, x+15 Checked, Вниз 

SearchEdit: 
    Gui, 2: Show, , Найти
    Return
    
Cancel:
    Gui, 2: Hide
    Return

GoSearch:
    GuiControlGet, DirectUp, 2:
    GuiControlGet, Sens, 2:
    ControlGetText, MainEdit,, ahk_id %hMainEdit%
    ControlGetText, Find,, ahk_id %hFind%
    SendMessage, EM_GETSEL, &start, &end, , ahk_id %hMainEdit%
    If DirectUp
        f := (f := InStr(SubStr(MainEdit, 1, NumGet(start)), Find, Sens, 0)) ? f : InStr(MainEdit, Find, Sens, 0)
    Else
        f := (f := InStr(MainEdit, Find, Sens, NumGet(end)+1)) ? f : InStr(MainEdit, Find, Sens, 1)
    If !f
    {
        MsgBox, 8256, Edit find, Не удаётся найти "%Find%"
        Return
    }
    PostMessage, EM_SETSEL, f-1, f+StrLen(Find)-1, , ahk_id %hMainEdit%
    PostMessage, EM_SCROLLCARET,,,, ahk_id %hMainEdit%
    Return

#If WinActive("ahk_id" hGUIMain)
F3::
^vk46:: GoSub SearchEdit   ;  "Ctrl+F"
#If WinActive("ahk_id" hGUIFind)
Enter:: GoSub GoSearch
#If

GuiEscape:
GuiClose:
    ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Поиск и выделение текста в поле Edit

serzh82saratov пишет:

Насколько я знаю, тут "StringCaseSense Locale" хватит вполне.

Да, точно, забыл про него.
Но в твоём коде один минус. При нажатии F3, если окно поиска уже вызывалось ранее, оно не должно появляться снова, а просто поиск и выделение продолжается по указанным прежде данным.
Ради интереса сделал нативный вариант:

global FR_DOWN := 0x1, FR_MATCHCASE := 0x4, EM_SETSEL := 0xB1
ES_NOHIDESEL := 256
StringCaseSense, Locale

Loop 24
   text .= "Съешь же ещё этих мягких французских булок, да выпей чаю`r`n"

Gui, +hwndhGui
Gui, Add, Edit, hwndhEdit w400 h200 %ES_NOHIDESEL%, % text
PostMessage, EM_SETSEL, 0, 0,, ahk_id %hEdit%
Gui, Show
OnMessage(DllCall("RegisterWindowMessage", Str, "commdlg_FindReplace"), "FindTextDlg")
Return

GuiClose:
GuiEscape:
   ExitApp

#If WinActive("ahk_id" hGui)
^vk46::   ; Ctrl + F
   oFind := FindTextDlgInit(hGui)
   Return
   
F3::
   if oFind.hDlg
      Return
   
   if pDATA := oFind.pDATA
      flags := NumGet(pDATA + A_PtrSize*3, "UInt")
      , FindHandling(StrGet(NumGet(pDATA + A_PtrSize*4)), flags & FR_DOWN, flags & FR_MATCHCASE)
   else
      oFind := FindTextDlgInit(hGui)
   Return
   
FindTextDlgInit(hGui)
{
   static FINDREPLACE, FindWhat, FR_DOWN := 1, FR_HIDEWHOLEWORD := 0x10000

   if !FINDREPLACE  {
      FindWhatLen := A_IsUnicode ? 160 : 80
      VarSetCapacity(FINDREPLACE, SizeOfFR := A_PtrSize*10)
      VarSetCapacity(FindWhat, FindWhatLen)

      NumPut(SizeOfFR, FINDREPLACE, "UInt")
      NumPut(hGui, &FINDREPLACE + A_PtrSize)
      NumPut(FR_DOWN | FR_HIDEWHOLEWORD, &FINDREPLACE + A_PtrSize*3, "UInt")
      NumPut(&FindWhat, &FINDREPLACE + A_PtrSize*4)
      NumPut(FindWhatLen, &FINDREPLACE + A_PtrSize*6, "UShort")
   }
   Return {hDlg: DllCall("Comdlg32\FindText", Ptr, &FINDREPLACE, Ptr), pDATA: &FINDREPLACE}
}

FindTextDlg(wp, lp)
{
   global oFind
   static FR_FINDNEXT := 0x8, FR_DIALOGTERM := 0x40
   flags := NumGet(lp + A_PtrSize*3, "UInt")
   
   if flags & FR_FINDNEXT
      FindHandling(StrGet(NumGet(lp + A_PtrSize*4)), flags & FR_DOWN, flags & FR_MATCHCASE)
   
   if flags & FR_DIALOGTERM
      oFind.hDlg := 0
}

FindHandling(text, down, case)
{
   global hEdit, oFind
   static EM_GETSEL := 0xB0, EM_SCROLLCARET := 0xB7, MB_ICONINFORMATION := 0x40, MB_TASKMODAL := 0x2000
   
   WinExist("ahk_id" hEdit)
   ControlGetText, EditText
   SendMessage, EM_GETSEL
   start := ErrorLevel & 0xFFFF, end := ErrorLevel >> 16
   if ! pos := InStr(down ? EditText : SubStr(EditText, 1, start), text, case, down ? end + 1 : 0)
      Return DllCall("MessageBox", Ptr, (h := oFind.hDlg) ? h : hEdit
                                 , Str, "Не удаётся найти """ . text . """"
                                 , Str, "Find"
                                 , UInt, MB_ICONINFORMATION | MB_TASKMODAL)
   
   PostMessage, EM_SETSEL, pos - 1, pos - 1 + StrLen(text)
   PostMessage, EM_SCROLLCARET
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20 (изменено: YMP, 2015-01-06 08:43:07)

Re: AHK: Поиск и выделение текста в поле Edit

А почему EM_SETSEL и EM_SCROLLCARET через PostMessage посылаете? Есть какой-то скрытый смысл? В MSDN они с SendMessage описаны.

Точнее, нет, это я в документации к Windows SDK видел. А в MSDN, видимо, остаётся ориентироваться на слово send в описании.

You can send this message to either an edit control or a rich edit control.

Иначе там будет post.

Posted to the window with the focus when the user chooses a new input language,

21

Re: AHK: Поиск и выделение текста в поле Edit

Но в твоём коде один минус. При нажатии F3, если окно поиска уже вызывалось ранее, оно не должно появляться снова, а просто поиск и выделение продолжается по указанным прежде данным.

+ Ну это просто:

#SingleInstance Force
#NoEnv
StringCaseSense Locale

ES_NOHIDESEL := 256  ; показывает выделение текста в Edit при неактивном окне
EM_SETSEL := 0x00B1  ; установка выделения
EM_SCROLLCARET := 0xB7  ; сделать видимым выделенный текст
EM_GETSEL := 0xB0  ; извлечь позицию каретки ввода
VarSetCapacity(start, 4), VarSetCapacity(end, 4)

Loop 12
    Text .= "Как можно сделать поиск в поле Edit?`n"

Gui, -DPIScale +HWNDhGUIMain
Gui, Add, Edit, x0 y0 w500 h100 vMainEdit hwndhMainEdit %ES_NOHIDESEL%, %Text%
PostMessage, EM_SETSEL, 0, 0, , ahk_id %hMainEdit%
Gui, Show, w500 h300, Edit find

Gui, 2: +Owner1 -MaximizeBox -MinimizeBox -DPIScale +HWNDhGUIFind
Gui, 2: Add, Text, ym+5, Что:
Gui, 2: Add, Edit, x+25 yp-5 w284 vFind hwndhFind, Можно
Gui, 2: Add, Button, x+10 yp gGoSearch, Найти далее
Gui, 2: Add, Button, xp y+5 wp gCancel, Отмена
Gui, 2: Add, Checkbox, vSens y+0 xm, С учетом регистра
Gui, 2: Add, GroupBox, x+10 yp-25 h50, Направление
Gui, 2: Add, Radio, xp+10 yp+25 vDirectUp, Вверх
Gui, 2: Add, Radio, x+15 Checked, Вниз 

SearchEdit: 
    Gui, 2: Show, , Найти 
    Return
    
Cancel:
    Gui, 2: Hide
    Return

GoSearch:
    GuiControlGet, DirectUp, 2:
    GuiControlGet, Sens, 2:
    ControlGetText, MainEdit,, ahk_id %hMainEdit%
    ControlGetText, Find,, ahk_id %hFind%
    SendMessage, EM_GETSEL, &start, &end, , ahk_id %hMainEdit%
    If DirectUp
        f := (f := InStr(SubStr(MainEdit, 1, NumGet(start)), Find, Sens, 0)) ? f : InStr(MainEdit, Find, Sens, 0)
    Else
        f := (f := InStr(MainEdit, Find, Sens, NumGet(end)+1)) ? f : InStr(MainEdit, Find, Sens, 1)
    If !f
    {
        MsgBox, 8256, Edit find, Не удаётся найти "%Find%"
        Return
    }
    PostMessage, EM_SETSEL, f-1, f+StrLen(Find)-1, , ahk_id %hMainEdit%
    PostMessage, EM_SCROLLCARET,,,, ahk_id %hMainEdit%
    Return

#If WinActive("ahk_id" hGUIMain)
F3:: GoSub GoSearch
^vk46:: GoSub SearchEdit   ;  "Ctrl+F"
#If WinActive("ahk_id" hGUIFind)
Enter:: GoSub GoSearch
#If

GuiEscape:
GuiClose:
    ExitApp

Зато есть плюс, например зацикленный поиск.

Ради интереса сделал нативный вариант:

Очень любопытно, значит это окно из API.

YMP пишет:

А почему EM_SETSEL и EM_SCROLLCARET через PostMessage посылаете? Есть какой-то скрытый смысл?

Я отталкиваюсь от описания AutoHotkey, если ненужен код возврата, то использую PostMessage. На практике, в некоторых случаях существенно ускоряет выполнение.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

Re: AHK: Поиск и выделение текста в поле Edit

serzh82saratov пишет:

Я отталкиваюсь от описания AutoHotkey, если ненужен код возврата, то использую PostMessage. На практике, в некоторых случаях существенно ускоряет выполнение.

Думаю, что без явной нужды нарушать рекомендации разработчиков не стоит. А это всё-таки Microsoft, а не авторы AutoHotkey.

23

Re: AHK: Поиск и выделение текста в поле Edit

Не пойму где тут http://msdn.microsoft.com/en-us/library … s.85).aspx явные рекомендации разработчиков использовать именно SendMessage? Только во фразе - "You can send this message"? Как то неоднозначно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK: Поиск и выделение текста в поле Edit

Думаю, что можно на это ориентироваться. Это у нас одно слово "послать" используется, а у них два — send и post. Два варианта посылки сообщений. Отсюда и две функции.

Ну, а явное указание, как я уже говорил, в документации к Windows SDK.


To send this message, call the SendMessage function as follows. 

lResult = SendMessage(      // returns LRESULT in lResult
   (HWND) hWndControl,      // handle to destination control
   (UINT) EM_SETSEL,        // message ID
   (WPARAM) wParam,         // = (WPARAM) () wParam;
   (LPARAM) lParam          // = (LPARAM) () lParam; );  

25

Re: AHK: Поиск и выделение текста в поле Edit

serzh82saratov пишет:

Зато есть плюс, например зацикленный поиск.

Это плюс в том случае, если он нужен, а иногда требуется, например, найти последнее вхождение какого-либо слова. Изначально-то цель была повторить поведение виндосовского поиска, а там цикличности нет.

YMP пишет:

А почему EM_SETSEL и EM_SCROLLCARET через PostMessage посылаете? Есть какой-то скрытый смысл?

Более-менее понятно, почему разработчики Windows предлагают отправлять эти сообщения с помощью SendMessage: на их выполнение требуется какое-то время и окно не будет отзываться, пока они выполняются, и если предполагается, что за ними нужно обработать ещё много других сообщений, код может сильно «обогнать» окно. В данном же случае их всего два подряд, и проблем не возникает. Так что, думаю, без разницы.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

26

Re: AHK: Поиск и выделение текста в поле Edit

teadrinker пишет:

Так что, думаю, без разницы.

Тогда разумно сделать, как говорят разработчики. Я ведь об этом и написал: если нет явной нужды, то не стоит оригинальничать. Ведь любые наши рассуждения по большому счёту догадки.

27

Re: AHK: Поиск и выделение текста в поле Edit

Не имею ничего против. Теперь для Коллекции нужно привести к функциональному виду по возможности без глобальных переменных, чтобы достаточно было передать в качестве параметра хэндл edit-контрола. Ну и Find-Replace вариант туда присобачить было бы неплохо. У меня пока времени нет.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

28

Re: AHK: Поиск и выделение текста в поле Edit

Это плюс в том случае, если он нужен, а иногда требуется, например, найти последнее вхождение какого-либо слова. Изначально-то цель была повторить поведение виндосовского поиска, а там цикличности нет.

Сначала повторить, а потом найти возможности допилить каждому под себя, на цикличность можно и флажок добавить.

#SingleInstance Force
#NoEnv
StringCaseSense Locale

ES_NOHIDESEL := 256  ; показывает выделение текста в Edit при неактивном окне
EM_SETSEL := 0x00B1  ; установка выделения
EM_SCROLLCARET := 0xB7  ; сделать видимым выделенный текст
EM_GETSEL := 0xB0  ; извлечь позицию каретки ввода
VarSetCapacity(start, 4), VarSetCapacity(end, 4)

Loop 12
    Text .= "Как можно сделать поиск в поле Edit?`n"

Gui, -DPIScale +HWNDhGUIMain
Gui, Add, Edit, x0 y0 w500 h100 vMainEdit hwndhMainEdit %ES_NOHIDESEL%, %Text%
SendMessage, EM_SETSEL, 0, 0, , ahk_id %hMainEdit%
Gui, Show, w500 h300, Edit find

Gui, 2: +Owner1 -MaximizeBox -MinimizeBox -DPIScale +HWNDhGUIFind
Gui, 2: Add, Text, ym+5, Что:
Gui, 2: Add, Edit, x+25 yp-5 w284 vFind hwndhFind, Можно
Gui, 2: Add, Button, x+10 yp gGoSearch, Найти далее
Gui, 2: Add, Button, xp y+5 wp gCancel, Отмена
Gui, 2: Add, Checkbox, vLoop y+0 xm Checked, Зациклить поиск
Gui, 2: Add, Checkbox, vSens y+10 xp, С учетом регистра
Gui, 2: Add, GroupBox, x+10 yp-35 h55, Направление
Gui, 2: Add, Radio, xp+10 yp+25 vDirectUp, Вверх
Gui, 2: Add, Radio, x+15 Checked, Вниз 

SearchEdit: 
    Gui, 2: Show, , Найти 
    Return
    
Cancel:
    Gui, 2: Hide
    Return

GoSearch:
    GuiControlGet, DirectUp, 2:
    GuiControlGet, Sens, 2:
    GuiControlGet, Loop, 2:
    ControlGetText, MainEdit,, ahk_id %hMainEdit%
    ControlGetText, Find,, ahk_id %hFind%
    SendMessage, EM_GETSEL, &start, &end, , ahk_id %hMainEdit%
    If DirectUp
        f := (f := InStr(SubStr(MainEdit, 1, NumGet(start)), Find, Sens, 0)) ? f : (Loop ? InStr(MainEdit, Find, Sens, 0) : 0)
    Else
        f := (f := InStr(MainEdit, Find, Sens, NumGet(end)+1)) ? f : (Loop ? InStr(MainEdit, Find, Sens, 1) : 0)
    If !f
    {
        MsgBox, 8256, Edit find, Не удаётся найти "%Find%"
        Return
    }
    SendMessage, EM_SETSEL, f-1, f+StrLen(Find)-1, , ahk_id %hMainEdit%
    SendMessage, EM_SCROLLCARET,,,, ahk_id %hMainEdit%
    Return

#If WinActive("ahk_id" hGUIMain)
F3:: GoSub GoSearch
^vk46:: GoSub SearchEdit   ;  "Ctrl+F"
#If WinActive("ahk_id" hGUIFind)
Enter:: GoSub GoSearch
#If

GuiEscape:
GuiClose:
    ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

29

Re: AHK: Поиск и выделение текста в поле Edit

чтобы достаточно было передать в качестве параметра хэндл edit-контрола

А Gui как создавать? Имя ведь совпасть может с используемым в скрипте.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui