find text in listview Topic is solved

Get help with using AutoHotkey (v1.1 and older) and its commands and hotkeys
User avatar
Tomer
Posts: 366
Joined: 21 Aug 2016, 05:11

find text in listview

01 Jun 2022, 05:10

i try to find text in listview so its focus\select by in the order all the rows contains "mike" ,
each F1's click should find and focus\select the next row with "mike" letters included .
my sample only select the row with the exact name

I try to switch if (text == str) with (if text contains str) but its seems to not work well :(

Thaks for your help.. :)


p.s im using cyruz's lib (viewtopic.php?f=6&t=3513) since im using it for external listview, sample code below using built-in listview just so you can test it.

Code: Select all

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
#SingleInstance force
ListLines Off
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
SetBatchLines -1
#KeyHistory 0

LVwindowTitle := "Test" ; Adjust as needed

Gui, Font, s10
Gui, Add, ListView, r10, A|B
LV_Add("", "abc"  , "def")
LV_Add("", "ghi"  , "jkl")
LV_Add("", "abc"  , "def")
LV_Add("", "ghi"  , "jkl")
LV_Add("", "abc"  , "def")
LV_Add("", "ghi"  , "jkl")
LV_Add("", "abc"  , "def")
LV_Add("", "ghi"  , "jkl")
LV_Add("", "abc"  , "def")
LV_Add("", "ghi"  , "jkl")
LV_Add("", "mike"  , "jkl")
LV_Add("", "mikemike"  , "jkl")
LV_Add("", "mike123"  , "jkl")
LV_Add("", "mikegood"  , "jkl")
LV_Add("", "goodmike"  , "jkl")
LV_Add("", "123mike"  , "jkl")
LV_ModifyCol(1, 80), LV_ModifyCol(2, 50)
Gui, Show,, %LVwindowTitle%

objLV := ExtListView_Initialize(LVwindowTitle)

f1::
row:=ExtListView_findRowWithString(objLV, "mike")
if (row != -1) {
    ExtListView_EnsureVisible(objLV, row)
    ExtListView_ClickRow(objLV, row)
}

Return

ExtListView_findRowWithString(objLV, str, col:=0) {
    row:=0
    while (row < objLV.rows) {
        text:=ExtListView_GetItemText(objLV, row, col)
        if (text == str) { ;copy this function if you want case insensitive
            return row
        }
        row++
    }
    return -1
}

GuiClose:
GuiEscape:
ExitApp

f3::Exitapp

; https://www.autohotkey.com/boards/viewtopic.php?t=3513
; ----------------------------------------------------------------------------------------------------------------------
; Name .........: ExtListView library
; Description ..: Collection of functions dealing with the ListViews of external processes.
; AHK Version ..: AHK_L 1.1.13.01 x32/64 ANSI/Unicode
; Author .......: Cyruz - http://ciroprincipe.info
; License ......: WTFPL - http://www.wtfpl.net/txt/copying/
; Changelog ....: May  18, 2013 - v0.1 - First revision.
; ..............: Jun. 28, 2013 - v0.2 - Added resizable buffer option.
; ..............: Feb. 04, 2014 - v0.3 - Unicode and x64 compatibility.
; ..............: Apr. 10, 2014 - v1.0 - Code refactoring. Added encoding option and simple error management.
; ..............: May  04, 2014 - v1.1 - Detached the handles and memory allocation code.
; ..............: May  05, 2014 - v1.2 - Created ExtListView_GetAllItems and ExtListView_ToggleSelection functions.
; ..............: May  06, 2014 - v2.0 - Complete rewrite of the library. Code more modular and updateable. Separated
; ..............:                        code for De/Initialization, GetNextItem and GetItemText.
; ..............: Jul  24, 2017 - v2.1 - Fixed LVITEM size issue.
; ----------------------------------------------------------------------------------------------------------------------

; ----------------------------------------------------------------------------------------------------------------------
; Function .....: ExtListView_GetSingleItem
; Description ..: Get the first item with the desired state.
; Parameters ...: objLV  - External ListView initialized object.
; ..............: sState - Status of the searched item. Common statuses are:
; ..............:          LVNI_ALL         - 0x0000
; ..............:          LVNI_FOCUSED     - 0x0001 ;The item has the focus, so it is surrounded by a standard focus rectangle. Although more than one item may be selected, only one item can have the focus.
; ..............:          LVNI_SELECTED    - 0x0002 ;The item is selected. The appearance of a selected item depends on whether it has the focus and also on the system colors used for selection.
; ..............:          LVNI_CUT         - 0x0004 ;The item is marked for a cut-and-paste operation.
; ..............:          LVNI_DROPHILITED - 0x0008 ;The item is highlighted as a drag-and-drop target.
; ..............: nCol   - Column of the desired item (0-based index).
; Info .........: For more info on the sState parameter have a look at the MSDN docs for the LVM_GETNEXTITEM message:
; ..............: http://msdn.microsoft.com/en-us/library/windows/desktop/bb761057%28v=vs.85%29.aspx
; Return .......: Single item as a string.
; ----------------------------------------------------------------------------------------------------------------------
ExtListView_GetSingleItem(ByRef objLV, sState, nCol) {
    Try {

        If ( (nRow  := ExtListView_GetNextItem(objLV, -1, sState)) != -1 )
            sItem := ExtListView_GetItemText(objLV, nRow, nCol)

    } Catch e
      Throw e

    Return (sItem) ? sItem : 0
}

; ----------------------------------------------------------------------------------------------------------------------
; Function .....: ExtListView_GetAllItems
; Description ..: Get all items that share the same status on the target ListView.
; Parameters ...: objLV  - External ListView initialized object.
; ..............: sState - Status of the searched item. Common statuses are:
; ..............:          LVNI_ALL         - 0x0000
; ..............:          LVNI_FOCUSED     - 0x0001
; ..............:          LVNI_SELECTED    - 0x0002
; ..............:          LVNI_CUT         - 0x0004
; ..............:          LVNI_DROPHILITED - 0x0008
; Info .........: For more infor on the sState parameter have a look at the MSDN docs for the LVM_GETNEXTITEM message:
; ..............: http://msdn.microsoft.com/en-us/library/windows/desktop/bb761057%28v=vs.85%29.aspx
; Return .......: Multidimensional array containing ListView's items. Eg: array[row][column] := "SomeString".
; ----------------------------------------------------------------------------------------------------------------------
ExtListView_GetAllItems(ByRef objLV, sState:=0x0000) {
    Try {

        nRow := -1, objList := []
        Loop
        {
            If ( (nRow := ExtListView_GetNextItem(objLV, nRow, sState)) == -1 )
                Break
            x := A_Index, objList[x] := []
            Loop % objLV.cols
                objList[x][A_Index] := ExtListView_GetItemText(objLV, nRow, A_Index-1)
        }

    } Catch e
      Throw e

    Return ( objList.MaxIndex() ) ? objList : 0
}

; ----------------------------------------------------------------------------------------------------------------------
; Function .....: ExtListView_ToggleSelection
; Description ..: Select/deselect items in the target ListView.
; Parameters ...: objLV   - External ListView initialized object.
; ..............: bSelect - 1 for selection, 0 for deselection.
; ..............: nItem   - -1 for all items or "n" (0-based) for a specific ListView item.
; ----------------------------------------------------------------------------------------------------------------------
ExtListView_ToggleSelection(ByRef objLV, bSelect:=1, nItem:=-1) {
    VarSetCapacity( LVITEM, objLV.szwritebuf, 0 )
    NumPut( 0x0008,                      LVITEM, 0  ) ; mask = LVIF_STATE = 0x0008.
    NumPut( nItem,                       LVITEM, 4  ) ; iItem.
    NumPut( 0,                           LVITEM, 8  ) ; iSubItem.
    NumPut( (bSelect) ? 0x0002 : 0x0000, LVITEM, 12 ) ; state = LVIS_SELECTED = 0x0002 or 0x0000 (reset mask).
    NumPut( 0x0002,                      LVITEM, 16 ) ; stateMask = LVIS_SELECTED = 0x0002.

    If ( !DllCall( "WriteProcessMemory", "Ptr",objLV.hproc, "Ptr",objLV.pwritebuf, "Ptr",&LVITEM, UInt,20, UInt,0 ) )
        Throw Exception("objLV.pwritebuf: error writing memory", "WriteProcessMemory", "LastError: " A_LastError)
    SendMessage, 0x102B, % nItem, % objLV.pwritebuf,, % "ahk_id " objLV.hlv ;LVM_SETITEMSTATE
    ;#####, this works because it's reading from it's OWN MEMORY objLV.pwritebuf
}
ExtListView_ToggleFocusAndSelection(ByRef objLV, bSelect:=1, nItem:=-1) {
    VarSetCapacity( LVITEM, objLV.szwritebuf, 0 )
    NumPut( 0x0008,                      LVITEM, 0  ) ; mask = LVIF_STATE = 0x0008.
    NumPut( nItem,                       LVITEM, 4  ) ; iItem.
    NumPut( 0,                           LVITEM, 8  ) ; iSubItem.
    NumPut( (bSelect) ? 0x0003 : 0x0000, LVITEM, 12 ) ; state = LVIS_SELECTED =  0x0002 or 0x0000 (reset mask).
    NumPut( 0x0003,                      LVITEM, 16 ) ; stateMask = LVIS_SELECTED = 0x0002.

    If ( !DllCall( "WriteProcessMemory", Ptr,objLV.hproc, Ptr,objLV.pwritebuf, Ptr,&LVITEM, UInt,20, UInt,0 ) )
        Throw Exception("objLV.pwritebuf: error writing memory", "WriteProcessMemory", "LastError: " A_LastError)
    SendMessage, 0x102B, % nItem, % objLV.pwritebuf,, % "ahk_id " objLV.hlv
}
ExtListView_ToggleFocus(ByRef objLV, bSelect:=1, nItem:=-1) {
    VarSetCapacity( LVITEM, objLV.szwritebuf, 0 )
    NumPut( 0x0008,                      LVITEM, 0  ) ; mask = LVIF_STATE = 0x0008.
    NumPut( nItem,                       LVITEM, 4  ) ; iItem.
    NumPut( 0,                           LVITEM, 8  ) ; iSubItem.
    NumPut( (bSelect) ? 0x0001 : 0x0000, LVITEM, 12 ) ; state = LVIS_SELECTED =  0x0002 or 0x0000 (reset mask).
    NumPut( 0x0001,                      LVITEM, 16 ) ; stateMask = LVIS_SELECTED = 0x0002.

    If ( !DllCall( "WriteProcessMemory", Ptr,objLV.hproc, Ptr,objLV.pwritebuf, Ptr,&LVITEM, UInt,20, UInt,0 ) )
        Throw Exception("objLV.pwritebuf: error writing memory", "WriteProcessMemory", "LastError: " A_LastError)
    SendMessage, 0x102B, % nItem, % objLV.pwritebuf,, % "ahk_id " objLV.hlv
}
; ----------------------------------------------------------------------------------------------------------------------
; Function .....: ExtListView_GetNextItem
; Description ..: Get the next item in the target ListView.
; Parameters ...: objLV  - External ListView initialized object.
; ..............: nRow   - Row where to start the search for the next item (0-based index).
; ..............: lParam - Status of the searched item. Common statuses are:
; ..............:          LVNI_ALL         - 0x0000
; ..............:          LVNI_FOCUSED     - 0x0001
; ..............:          LVNI_SELECTED    - 0x0002
; ..............:          LVNI_CUT         - 0x0004
; ..............:          LVNI_DROPHILITED - 0x0008
; Info .........: LVM_GETNEXTITEM - http://msdn.microsoft.com/en-us/library/windows/desktop/bb761057%28v=vs.85%29.aspx
; Return .......: Item content as a string.
; ----------------------------------------------------------------------------------------------------------------------
ExtListView_GetNextItem(ByRef objLV, nRow:=-1, lParam:=0x0000) {
    ; LVM_GETNEXTITEM = LVM_FIRST (0x1000) + 12 = 0x100C.
    SendMessage, 0x100C, %nRow%, %lParam%,, % "ahk_id " objLV.hlv
    Return ErrorLevel << 32 >> 32
}

; ----------------------------------------------------------------------------------------------------------------------
; Function .....: ExtListView_GetItemText
; Description ..: Get the text of the desired item.
; Parameters ...: objLV - External ListView initialized object.
; ..............: nRow  - Row of the desired item (0-based index).
; ..............: nCol  - Column of the desired item (0-based index).
; Return .......: Item content as a string.
; ----------------------------------------------------------------------------------------------------------------------
ExtListView_GetItemText(ByRef objLV, nRow, nCol) {
    VarSetCapacity( LVITEM, objLV.szwritebuf, 0 )
    NumPut( 0x0001,          LVITEM, 0                          ) ; mask = LVIF_TEXT = 0x0001.
    NumPut( nRow,            LVITEM, 4                          ) ; iItem = Row to retrieve (0 = 1st row).
    NumPut( nCol,            LVITEM, 8                          ) ; iSubItem = The column index of the item to retrieve.
    NumPut( objLV.preadbuf,  LVITEM, 20 + (A_PtrSize - 4)       ) ; pszText = Pointer to item text string.
    NumPut( objLV.szreadbuf, LVITEM, 20 + ((A_PtrSize * 2) - 4) ) ; cchTextMax = Number of TCHARs in the buffer.

    If ( !DllCall( "WriteProcessMemory", Ptr,objLV.hproc, Ptr,objLV.pwritebuf, Ptr,&LVITEM, UInt,objLV.szwritebuf
                                       , UInt,0 ) )
        Throw Exception("objLV.pwritebuf: error writing memory", "WriteProcessMemory", "LastError: " A_LastError)

    ; LVM_GETITEMTEXTA = LVM_FIRST (0x1000) + 45  = 0x102D.
    ; LVM_GETITEMTEXTW = LVM_FIRST (0x1000) + 115 = 0x1073.
    LVM_GETITEMTEXT := (objLV.senc == "UTF-8" || objLV.senc == "UTF-16") ? 0x1073 : 0x102D
    SendMessage, %LVM_GETITEMTEXT%, %nRow%, % objLV.pwritebuf,, % "ahk_id " objLV.hlv

    VarSetCapacity(cRecvBuf, objLV.szreadbuf, 1)
    If ( !DllCall( "ReadProcessMemory", Ptr,objLV.hproc, Ptr,objLV.preadbuf, Ptr,&cRecvBuf, UInt,objLV.szreadbuf
                                      , Ptr,0 ) )
        Throw Exception("objLV.preadbuf: error reading memory", "ReadProcessMemory", "LastError: " A_LastError)

    Return StrGet(&cRecvBuf, objLV.szreadbuf, objLV.senc)
}

; ----------------------------------------------------------------------------------------------------------------------
; Function .....: ExtListView_Initialize
; Description ..: Initialize the object containing ListView's related data.
; Parameters ...: sWnd      - Title of the window containing the ListView.
; ..............: szReadBuf - Size of the buffer used for reading the target process memory. It must be capable enough
; ..............:             to hold the longest cell in the ListView.
; ..............: sEnc      - Target ListView's encoding. "CP0" for ANSI, "UTF-8" or "UTF-16" for Unicode.
; Return .......: objLV            - External ListView initialized object with the following keys:
; ..............: objLV.swnd       - Title of the window owning the ListView.
; ..............: objLV.hwnd       - Handle to the window owning the ListView.
; ..............: objLV.hproc      - Handle to the process owning the ListView.
; ..............: objLV.hlv        - Handle to the ListView.
; ..............: objLV.hhdr       - Handle to the header of the ListView.
; ..............: objLV.rows       - Number of rows in the ListView.
; ..............: objLV.cols       - Number of columns in the ListView.
; ..............: objLV.senc       - Encoding used by the process owning the ListView.
; ..............: objLV.pwritebuf  - Address to the buffer used to write the LVITEM message to the target ListView.
; ..............: objLV.szwritebuf - Size of the write buffer.
; ..............: objLV.preadbuf   - Address to the buffer used to read the answer to the message sent.
; ..............: objLV.szreadbuf  - Size of the read buffer.
; ----------------------------------------------------------------------------------------------------------------------
ExtListView_Initialize(sWnd, WHICHSysListView:="SysListView321", szReadBuf:=1024, sEnc:="CP0") {
    objLV            := Object()
    objLV.swnd       := sWnd
    objLV.hwnd       := WinExist(sWnd)
    objLV.szwritebuf := (A_OSVersion == "WIN_XP") ? 52 + (A_PtrSize-4)*5 : 60 + (A_PtrSize-4)*7 ; Size of LVITEM
    objLV.szreadbuf  := szReadBuf
    objLV.senc       := sEnc

    ControlGet, hLv, Hwnd,, % WHICHSysListView, % "ahk_id " objLV.hwnd
    objLV.hlv := hLv

    DllCall( "GetWindowThreadProcessId", Ptr,hLv, PtrP,dwProcessId )
    ; PROCESS_VM_OPERATION = 0x0008, PROCESS_VM_READ = 0x0010, PROCESS_VM_WRITE = 0x0020.
    If ( !(objLV.hproc := DllCall( "OpenProcess", UInt,0x0008|0x0010|0x0020, Int,0, UInt,dwProcessId )) )
        Throw Exception("objLV.hproc: error opening process", "OpenProcess", "LastError: " A_LastError)

    ; LVM_GETITEMCOUNT = LVM_FIRST (0x1000) + 4 = 0x1004.
    SendMessage, 0x1004, 0, 0,, % "ahk_id " objLV.hlv
    objLV.rows := ErrorLevel

    ; LVM_GETHEADER = LVM_FIRST (0x1000) + 31 = 0x101F.
    SendMessage, 0x101F, 0, 0,, % "ahk_id " objLV.hlv
    objLV.hhdr := ErrorLevel

    ; HDM_GETITEMCOUNT = HDM_FIRST (0x1200) + 0 = 0x1200.
    SendMessage, 0x1200, 0, 0,, % "ahk_id " objLV.hhdr
    objLV.cols := ErrorLevel

    ; Allocate memory on the target process before returning the object.
    If ( !__ExtListView_AllocateMemory(objLV) )
        Throw Exception("Error allocating memory", "__ExtListView_Initialize", "LastError: " A_LastError)

    Return objLV
}

; ----------------------------------------------------------------------------------------------------------------------
; Function .....: ExtListView_DeInitialize
; Description ..: DeInitialize the object.
; Parameters ...: objLV - External ListView initialized object.
; ----------------------------------------------------------------------------------------------------------------------
ExtListView_DeInitialize(ByRef objLV) {
    ; Free the previously allocated memory on the target process.
    If ( !__ExtListView_DeAllocateMemory(objLV) )
        Throw Exception("Error deallocating memory", "__ExtListView_DeInitialize", "LastError: " A_LastError)
    DllCall( "CloseHandle", Ptr,objLV.hproc )
    objLV := ""
}

; ----------------------------------------------------------------------------------------------------------------------
; Function .....: ExtListView_CheckInitObject
; Description ..: Check if the object is still referring to a valid ListView.
; Parameters ...: objLV - External ListView initialized object.
; Return .......: 0 if false, handle of the window containing the ListView if true.
; ----------------------------------------------------------------------------------------------------------------------
ExtListView_CheckInitObject(ByRef objLV) {
    Return WinExist("ahk_id " objLV.hwnd)
}

; ----------------------------------------------------------------------------------------------------------------------
; Function .....: __ExtListView_AllocateMemory
; Description ..: Allocates memory into the target process.
; Parameters ...: objLV - External ListView initialized object.
; ----------------------------------------------------------------------------------------------------------------------
__ExtListView_AllocateMemory(ByRef objLV) {
    ; MEM_COMMIT = 0x1000, PAGE_READWRITE = 0x4.
    ; hProcess:objLV.hproc
    ; lpAddress: NULL
    ; dwSize:UInt,objLV.szwritebuf
    ; flAllocationType:0x1000 ;MEM_RESET_UNDO ;https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualallocex#MEM_RESET_UNDO
    ; If the function succeeds, the return value is the base address of the allocated region of pages.
    If ( !(objLV.pwritebuf := DllCall( "VirtualAllocEx", Ptr,objLV.hproc, Ptr,0, UInt,objLV.szwritebuf, UInt,0x1000
                                                       , UInt,0x4 )) )
        Return 0
    If ( !(objLV.preadbuf  := DllCall( "VirtualAllocEx", Ptr,objLV.hproc, Ptr,0, UInt,objLV.szreadbuf,  UInt,0x1000
                                                       , UInt,0x4 )) )
        Return 0
    ; RECT is 16 bytes
    If ( !(objLV.rectbuf  := DllCall( "VirtualAllocEx", Ptr,objLV.hproc, Ptr,0, UInt,16,  UInt,0x1000
                                                       , UInt,0x4 )) )
        Return 0
    Return 1
}

; ----------------------------------------------------------------------------------------------------------------------
; Function .....: __ExtListView_DeAllocateMemory
; Description ..: Frees previously allocated memory.
; Parameters ...: objLV - External ListView initialized object.
; ----------------------------------------------------------------------------------------------------------------------
__ExtListView_DeAllocateMemory(ByRef objLV) {
    ; MEM_RELEASE = 0x8000.
    If ( !DllCall( "VirtualFreeEx", Ptr,objLV.hproc, Ptr,objLV.pwritebuf, UInt,0, UInt,0x8000 ) )
        Return 0
    objLV.Remove("pwritebuf")
    If ( !DllCall( "VirtualFreeEx", Ptr,objLV.hproc, Ptr,objLV.preadbuf, UInt,0, UInt,0x8000 ) )
        Return 0
    objLV.Remove("preadbuf")
    Return 1
}

/* EXAMPLE CODE:

OnExit, QUIT
WINTITLE = Active Directory Users and Computers ahk_class MMCMainFrame
objLV := ExtListView_Initialize(WINTITLE)
HotKey, IfWinActive, %WINTITLE%
HotKey, ^!g, TOGGLESEL
Return

TOGGLESEL:
( ExtListView_CheckInitObject(objLV) ) ? objLV := ExtListView_Initialize(WINTITLE)
ExtListView_ToggleSelection(objLV, 1, 0)
Return

QUIT:
ExtListView_DeInitialize(objLV)
ExitApp

*/

; Focus and clicks last focused row || first row
ExtListView_RestoreFocus(objLV) {
    focusedControl:=ExtListView_getFocusedControl(objLV)
    ;if not already focused
    if (focusedControl!=objLV.hlv+0) {
        FocusedRow:=ExtListView_GetNextItem(objLV,, 1)
        if (FocusedRow==-1) {
            ; default to first row if no row Focused
            FocusedRow:=0
        }
        ExtListView_EnsureVisible(objLV, FocusedRow)
        ExtListView_ClickRow(objLV, FocusedRow)
    }
}

ExtListView_ClickRow(objLV, Row) { ; just me -> https://www.autohotkey.com/board/topic/86490-click-listview-row/#entry550767
    HLV:=objLV.hlv
    rectbuf:=objLV.rectbuf
    ; HLV : ListView's HWND, Row : 0-based row number

    SendMessage, 0x100E, % Row, % rectbuf,, % "ahk_id " HLV ; LVM_GETITEMRECT
    VarSetCapacity(RECT, 16)
    If ( !DllCall( "ReadProcessMemory", "Ptr",objLV.hproc, "Ptr",objLV.rectbuf, "Ptr",&RECT, UInt,16, UInt,0 ) )
        Throw Exception("objLV.rectbuf: error reading memory", "ReadProcessMemory", "LastError: " A_LastError)

    short1:=NumGet(RECT, 0, "Short")
    short2:=NumGet(RECT, 4, "Short")
    POINT := short1 | (short2 << 16)

    PostMessage, 0x0201, 0, POINT,, % "ahk_id " HLV ; WM_LBUTTONDOWN
    PostMessage, 0x0202, 0, POINT,, % "ahk_id " HLV ; WM_LBUTTONUP
}

ExtListView_EnsureVisible(objLV, Row, fPartialOK:=false) { ; https://www.autohotkey.com/board/topic/8194-double-click-on-listview-selection/#post_id_51730
    ; fPartialOK - A value specifying whether the item must be entirely visible.
    ; If this parameter is TRUE, no scrolling occurs if the item is at least partially visible.
    HLV:=objLV.hlv
    ; PostMessage, 0x1013, Row, fPartialOK,, % "ahk_id " HLV ; LVM_ENSUREVISIBLE
    SendMessage, 0x1013, Row, fPartialOK,, % "ahk_id " HLV ; LVM_ENSUREVISIBLE
}

ExtListView_getFocusedControl(objLV) {
    ; https://www.autohotkey.com/boards/viewtopic.php?t=37120
    static vTIDAhk := DllCall("GetCurrentThreadId", "UInt")
    static GuiThreadInfo_Size:=24 + 6*A_PtrSize ;4 + 4 + 6*A_PtrSize + 16
    static offset_hwndFocus := 8 + 1*A_PtrSize
    ;   typedef struct tagGUITHREADINFO {
    ; DWORD cbSize; 0
    ; DWORD flags; 4
    ; HWND hwndActive;    8
    ; HWND hwndFocus;     8 + 1*A_PtrSize
    ; HWND hwndCapture;   8 + 2*A_PtrSize
    ; HWND hwndMenuOwner; 8 + 3*A_PtrSize
    ; HWND hwndMoveSize;  8 + 4*A_PtrSize
    ; HWND hwndCaret;     8 + 5*A_PtrSize
    ; RECT rcCaret;       8 + 6*A_PtrSize
    ;   }
    ; DWORD is Uint
    ; BOOL AttachThreadInput(
    ;   [in] DWORD idAttach,
    ;   [in] DWORD idAttachTo,
    ;   [in] BOOL  fAttach
    ; );
    ; BOOL -> Int
    vTID := DllCall("GetWindowThreadProcessId", "Ptr",objLV.hwnd, "Ptr",0, "UInt")


    VarSetCapacity(GuiThreadInfo, GuiThreadInfo_Size, 0)
	; GuiThreadInfo.cbSize = sizeof(GuiThreadInfo);
    NumPut(GuiThreadInfo_Size, GuiThreadInfo,0,"Uint")
    ; GetGuiThreadInfo(vTID, &GuiThreadInfo)
    DllCall("GetGUIThreadInfo", "Uint",vTID, "Ptr",&GuiThreadInfo)

    hwndFocus:=NumGet(GuiThreadInfo, offset_hwndFocus, "Ptr")

    return hwndFocus
}

User avatar
boiler
Posts: 17222
Joined: 21 Dec 2014, 02:44

Re: find text in listview

01 Jun 2022, 05:28

Tomer wrote: each F1's click should find and focus\select the next row with "mike" letters included .
my sample only select the row with the exact name

I try to switch if (text == str) with (if text contains str) but its seems to not work well :(
If str is a variable that contains "mike":

Code: Select all

if InStr(text, str)
or:

Code: Select all

if InStr(text, "mike")
User avatar
Tomer
Posts: 366
Joined: 21 Aug 2016, 05:11

Re: find text in listview

01 Jun 2022, 06:05

boiler wrote:
01 Jun 2022, 05:28
Tomer wrote: each F1's click should find and focus\select the next row with "mike" letters included .
my sample only select the row with the exact name

I try to switch if (text == str) with (if text contains str) but its seems to not work well :(
If str is a variable that contains "mike":

Code: Select all

if InStr(text, str)
or:

Code: Select all

if InStr(text, "mike")
Thanks,
in tryed both of your samples,
its selecting only one row: "mike" :(
i want it to select all rows contains "mike"
User avatar
boiler
Posts: 17222
Joined: 21 Dec 2014, 02:44

Re: find text in listview

01 Jun 2022, 06:37

You function returns after finding one row. You need to let it continue checking rows even after it finds a match and add the result to a list, such as a string separated by a delimiter character or an array. Then return the list after the loop concludes.
User avatar
Tomer
Posts: 366
Joined: 21 Aug 2016, 05:11

Re: find text in listview

12 Jun 2022, 03:03

@boiler i would like to have a help with that please ..
User avatar
boiler
Posts: 17222
Joined: 21 Dec 2014, 02:44

Re: find text in listview  Topic is solved

12 Jun 2022, 04:38

This is the function modified for two things: It checked for a match anywhere in the row, and it returns an array of all matching rows instead of just finding the first one.

Code: Select all

ExtListView_findRowWithString(objLV, str, col:=0) {
    row:=0
    matches := []
    while (row < objLV.rows) {
        text:=ExtListView_GetItemText(objLV, row, col)
        if InStr(text, str) ; this checks for the row containing the search term
            matches.Push(row) ; add found row to array
        row++
    }
    return matches
}

Here’s another version that also looks for the match anywhere in the row, but instead of returning an array, it returns the next row after the last one that was found when this function was called. This would probably be easier for you to use. When it doesn’t find another matching row, it returns -1. Then call it again and it starts over from the beginning.

Code: Select all

ExtListView_findRowWithString(objLV, str, col:=0) {
    static row := -1
    row++
    while (row < objLV.rows) {
        text:=ExtListView_GetItemText(objLV, row, col)
        if InStr(text, str) ; this checks for the row containing the search term
            return row
        row++
    }
    return row := -1
}
User avatar
Tomer
Posts: 366
Joined: 21 Aug 2016, 05:11

Re: find text in listview

12 Jun 2022, 08:32

@boiler thanks it works like a charm ! :bravo:
User avatar
Tomer
Posts: 366
Joined: 21 Aug 2016, 05:11

Re: find text in listview

20 Jun 2022, 08:21

@boiler
i managed to find text only for each column separately by changing col:

ExtListView_findRowWithString(objLV, str, col:=1)

0 = 1st column
1 = 2nd column

is it possible to find text on 1st and 2nd columns together ?
User avatar
boiler
Posts: 17222
Joined: 21 Dec 2014, 02:44

Re: find text in listview

20 Jun 2022, 09:12

You shouldn’t be changing the default value when you want to use it for different values, which is what you are doing when you change it to col:=1 in the function definition. That’s just the value it uses when you don’t pass anything to it. If you want to check more than one column, pass 0 to it when you call the function to get the data from the first column, then call it again but pass 1 to that parameter to get the data from the second column, or whatever columns you want. Basically, don’t change the function itself, change how you call the function.

Return to “Ask for Help (v1)”

Who is online

Users browsing this forum: DaveF, digidings, peter_ahk, wilkster and 170 guests