修改其它进程中TREEVIEW组件的NODE_TEXT.
我现在能用GETITEM + SETITEM(READPROCESSMEMORY + WRITEPROCESSMEMORY)的方式来修改其NODEITEM的TEXT了.源码如下:
function GetTreeSelectText(const TreeHand: HWND): String;
var
  hCurItem: HTREEITEM;
  lNodeText: String;
  ltvItem: TTVItem;
  h: HWND;
  C, i: integer;
  Buff: PChar;
  S: array[0..1024] of char;
  PID: THandle;
  PRC: THandle;
  R: Cardinal;
begin
  Result := '';  hCurItem := HTREEITEM(SendMessage( TreeHand, TVM_GETNEXTITEM, TVGN_CARET, 0 ));  if (hCurItem = nil) then Exit;  GetWindowThreadProcessId(TreeHand, @PID);
  PRC := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, PID);
  Buff := VirtualAllocEx(PRC, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);  FillChar(ltvItem, SizeOf(ltvItem), 0);
  with ltvItem do
  begin
    mask := TVIF_TEXT;
    hItem := hCurItem;
    cchTextMax := 2048;
    pszText := PChar(integer(Buff) + SizeOf(ltvItem) * 4);
  end;  WriteProcessMemory(PRC, Buff, @ltvItem, Sizeof(ltvItem), R);
  SendMessage(TreeHand, TVM_GETITEM, 0, LongInt(Buff));  ReadProcessMemory(PRC, Buff, @ltvItem, Sizeof(ltvItem), R);
  ReadProcessMemory(PRC, PChar(integer(Buff) + SizeOf(ltvItem) * 4), @S[0], SizeOf(S), R);
  Result := Trim(S);  VirtualFreeEx(PRC, Buff, 0, MEM_RELEASE);
  CloseHandle(PRC);
end;
其实也是从一高手的帖子上发现的,上面只给出了GETITEM部分的例子,SETITEM部分类似.我想用屏幕取词技术应该也可以实现,例如金山词霸就是利用这种技术取到其NODEITEM的TEXT,
而我应该在TEXTOUT的自定义钩子函数中,将LPSTR参数所指向的串与一个固定串进行比较,如果是我想要修改的值,那么就进行替换修改.
因为刚开始学习这部分知识,因此上面的叙述可能不是很清晰,如有不详之处请大家发帖提示!
谢谢大家!