修改其它进程中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参数所指向的串与一个固定串进行比较,如果是我想要修改的值,那么就进行替换修改.
因为刚开始学习这部分知识,因此上面的叙述可能不是很清晰,如有不详之处请大家发帖提示!
谢谢大家!
我现在能用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参数所指向的串与一个固定串进行比较,如果是我想要修改的值,那么就进行替换修改.
因为刚开始学习这部分知识,因此上面的叙述可能不是很清晰,如有不详之处请大家发帖提示!
谢谢大家!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货