function TForm1.GetTreeViewText(mHandle: THandle; Str: String): String; function TreeNodeGetNext(mHandle: THandle; mTreeItem: HTreeItem): HTreeItem; var vParentID: HTreeItem; begin Result := nil; if (mHandle <> 0) and (mTreeItem <> nil) then begin Result := TreeView_GetChild(mHandle, mTreeItem); if Result = nil then Result := TreeView_GetNextSibling(mHandle, mTreeItem); vParentID := mTreeItem; while (Result = nil) and (vParentID <> nil) do begin vParentID := TreeView_GetParent(mHandle, vParentID); Result := TreeView_GetNextSibling(mHandle, vParentID); end; end; end; var
vItemCount: Integer; vBuffer: array[0..255] of Char; vProcessId: DWORD; vProcess: THandle; vPointer: Pointer; vNumberOfBytesRead: Cardinal; i: Integer; vItem: TTVItem; vTreeItem: HTreeItem; tmp, tmp1: string; begin Result := ''; tmp:=UpperCase(Trim(Str)); if tmp='' then Exit; GetWindowThreadProcessId(mHandle, @vProcessId); vProcess:= OpenProcess(PROCESS_ALL_ACCESS,False,vProcessId); vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE); try vItemCount := TreeView_GetCount(mHandle); vTreeItem := TreeView_GetRoot(mHandle); for i := 0 to vItemCount - 1 do begin with vItem do begin mask := TVIF_TEXT; cchTextMax := SizeOf(vBuffer); pszText := Pointer(Cardinal(vPointer) + SizeOf(vItem)); hItem := vTreeItem; end; WriteProcessMemory(vProcess, vPointer, @vItem, SizeOf(vItem), vNumberOfBytesRead); SendMessage(mHandle, TVM_GETITEM, 0, lparam(vPointer)); ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)), @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead); tmp1 := UpperCase(string(vBuffer)); if AnsiPos(tmp,tmp1)>0 then begin Result := tmp1; Break; end; vTreeItem := TreeNodeGetNext(mHandle, vTreeItem); end; finally VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE); CloseHandle(vProcess); end; end; |
|
來自: 昵稱29079058 > 《DELPHI》