如何双击外部程序中treeview的某个节点
1-我现在要操纵一个外部程序中的TreeView控件.目前已经可以对它进行遍历,而且也能找到某一个特定的节点,但我现在想实现双击这个找到的节点,该怎么做?
2-ListView控件也是一样的问题。现在已经能够找到特定的行了,但是想双击特定的行,也就是双击ListView的Caption列该怎么实现?
我目前的做法是SendMessage(TreeViewHWD,WM_LBUTTONDBLCLK,0,0),这样似乎不行。
谢谢!
我帖上我现在的一些代码:
1-查找TreeView的代码
function TFrmMain.SearchInTreeView(ABeginItem:HTREEITEM;AName:PChar):HTREEITEM;
var
MainHWD:HWND;
TreeViewHWD:HWND;
ItemRec:TTVItem;
ItemPointer:PTVItem;
ItemText:PChar;
ItemBuf:PChar;
TextBuf:array[0..512] of char;
PID,WriteCount,ReadCount:DWord;
hProcess:HWND;
begin
result:=nil;
//查找主窗体句柄
MainHWD:=FindWindowEx(0,0,'TForm1','Form1');
//查找TreeView控件句柄
if MainHWD<>0 then
begin
TreeViewHWD:=FindWindowEx(MainHWD,0,'TTreeView',nil);
end;
GetWindowThreadProcessId(MainHWD,@PID);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
if hProcess=0 then
begin
Application.MessageBox('获取进程句柄操作失败!','提示',mb_ok+mb_iconinformation);
exit;
end;
ItemPointer:=PTVItem(VirtualAllocEx(hProcess,nil,sizeof(TTVItem),MEM_COMMIT,PAGE_READWRITE));
ItemText:=PChar(VirtualAllocEx(hProcess,nil,512,MEM_COMMIT, PAGE_READWRITE));
if (ItemPointer=nil)or(ItemText=nil) then
begin
Application.MessageBox('无法分配内存!','提示',mb_ok+mb_iconinformation);
exit;
end;
ItemRec.mask:=TVIF_TEXT;
ItemRec.cchTextMax:=512;
ItemRec.pszText:=ItemText;
ItemBuf:=TextBuf;
if ABeginItem<>nil then
begin
//从指定节点开始查找
ItemRec.hItem:=ABeginItem;
end else
begin
//得到根句柄
ItemRec.hItem:=HTreeItem(SendMessage(TreeViewHWD,TVM_GETNEXTITEM,TVGN_ROOT,$0));
//选中状态
SendMessage(TreeViewHWD,TVM_SELECTITEM,TVGN_CARET,LongInt(ItemRec.hItem));
//将设置好的结构插入目标进程
WriteProcessMemory(hProcess,ItemPointer,@ItemRec,sizeof(TTVItem),WriteCount);
//发送TVM_GETITEM消息
SendMessage(TreeViewHWD,TVM_GETITEM,0,LPARAM(ItemPointer));
//获取pszText
ReadProcessMemory(hProcess, ItemText,ItemBuf,512,ReadCount);
if StrComp(ItemBuf,AName)=0 then
begin
Result:=ItemRec.hItem;
SendMessage(TreeViewHWD,WM_LBUTTONDBLCLK,0,0);
VirtualFreeEx(hProcess,ItemPointer,0,MEM_RELEASE);
exit;
end;
end;
while LongInt(ItemRec.hItem)<>0 do
begin
//当此项目能展开时
while Boolean(SendMessage(TreeViewHWD,TVM_EXPAND,TVE_EXPAND,LongInt(ItemRec.hItem))) do
begin
ItemRec.hItem:=HTREEITEM(SendMessage(TreeViewHWD,TVM_GETNEXTITEM,TVGN_NEXTVISIBLE,LongInt(ItemRec.hItem)));
//选中状态
SendMessage(TreeViewHWD,TVM_SELECTITEM,TVGN_CARET,LongInt(ItemRec.hItem));
//将设置好的结构插入目标进程
WriteProcessMemory(hProcess,ItemPointer,@ItemRec,sizeof(TTVItem),WriteCount);
//发送TVM_GETITEM消息
SendMessage(TreeViewHWD,TVM_GETITEM,0,LPARAM(ItemPointer));
//获取pszText
ReadProcessMemory(hProcess, ItemText,ItemBuf,512,ReadCount);
if StrComp(ItemBuf,AName)=0 then
begin
SendMessage(TreeViewHWD,WM_LBUTTONDBLCLK,0,0);//这句实现不了双击找到的节点
Result:=ItemRec.hItem;
VirtualFreeEx(hProcess,ItemPointer,0,MEM_RELEASE);
exit;
end;
end;//如果能展开节点
ItemRec.hItem:=HTREEITEM(SendMessage(TreeViewHWD,TVM_GETNEXTITEM,TVGN_NEXTVISIBLE,LongInt(ItemRec.hItem)));
//选中状态
SendMessage(TreeViewHWD,TVM_SELECTITEM,TVGN_CARET,LongInt(ItemRec.hItem));
//将设置好的结构插入目标进程
WriteProcessMemory(hProcess,ItemPointer,@ItemRec,sizeof(TTVItem),WriteCount);
//发送TVM_GETITEM消息
SendMessage(TreeViewHWD,TVM_GETITEM,0,LPARAM(ItemPointer));
//获取pszText
ReadProcessMemory(hProcess, ItemText,ItemBuf,512,WriteCount);
if StrComp(ItemBuf,AName)=0 then
begin
SendMessage(TreeViewHWD,WM_LBUTTONDBLCLK,0,0);//这句实现不了双击找到的节点
Result:=ItemRec.hItem;
VirtualFreeEx(hProcess,ItemPointer,0,MEM_RELEASE);
exit;
end;
end;//如果有下个节点
end;
2-查找ListView的代码:
procedure TFrmMain.FindItem(AItemName: PChar);
var
Count:integer;
MainHWD:HWND;
ListViewHWD:HWND;
i:integer;
ItemRec:TLVItem;
ItemPointer:PLVItem;
ItemText:PChar;
ItemBuf:PChar;
TextBuf:array[0..512] of char;
PID,WriteCount,ReadCount:DWord;
hProcess:HWND;
begin
//查找主窗体句柄
MainHWD:=FindWindowEx(0,0,'TForm1','Form1');
//查找ListView控件句柄
if MainHWD<>0 then
begin
ListViewHWD:=FindWindowEx(MainHWD,0,'TListView',nil);
end;
//获得列表框控件的数目
Count:=SendMessage(ListViewHWD,LVM_GETITEMCOUNT,0,0);
GetWindowThreadProcessId(ListViewHWD,@PID);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
if hProcess=0 then
begin
Application.MessageBox('获取进程句柄操作失败!','提示',mb_ok+mb_iconinformation);
exit;
end;
ItemPointer:=PLVItem(VirtualAllocEx(hProcess,nil,SizeOf(TLVITEM),MEM_COMMIT,PAGE_READWRITE));
ItemText:=PChar(VirtualAllocEx(hProcess,nil,512,MEM_COMMIT,PAGE_READWRITE));
if (ItemPointer=nil)or(ItemText=nil) then
begin
Application.MessageBox('无法分配内存!','提示',mb_ok+mb_iconinformation);
exit;
end;
ItemRec.cchTextMax:=512;
ItemRec.pszText:=ItemText;
ItemRec.iSubItem:=0;
ItemBuf:=TextBuf;
//将设置好的结构插入目标进程
WriteProcessMemory(hProcess,ItemPointer,@ItemRec,sizeof(TLVItem)+8,WriteCount);
//遍历LISTVIEW查找指定的ITEM
for i:=0 to Count-1 do
begin
//发送TVM_GETITEM消息
SendMessage(ListViewHWD,LVM_GETITEMTEXT,WPARAM(i),LPARAM(ItemPointer));
//获取pszText
ReadProcessMemory(hProcess, ItemText,ItemBuf,512,ReadCount);
if StrComp(ItemBuf,AItemName)=0 then
begin
SendMessage(ListViewHWD,WM_LBUTTONDBLCLK,0,0);//这句实现不了双击找到的节点
VirtualFreeEx(hProcess,ItemPointer,0,MEM_RELEASE);
exit;
end;//如果找到
end;//for end
end;