如何双击外部程序中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;
相关推荐
C# 解决双击TreeView表里checkbox本身Bug问题
一个WinForm的TreeView,某node的CheckBox初始状态为false,当双击这个node的checkbox时,会出现很奇怪的情况: 第一次双击checkbox,checkbox显示的状态会切换两次状态,unchecked-> checked-> unchecked,而AfterCheck事件仅触发一次,在AfterCheck事件中获取到的checkbox状态为checked。在这里checkbox状态已经和显示状态不一致了 以后每次双击,checkbox显示的状态会出现一次切换,AfterCheck也会触发一次,并且checkbox显示的状态和值的状态仍然保持相反。 除上面这个问题外,还有一点,当双击treeview 的checkbox后,如果再去单击或双击该界面中除这个treeview外的任何部分,系统会忽略第一次点击事件。举例来说,一个窗口中,有一个treeview,还有一个ok按钮,当我双击这个treeview的一个checkbox后,再去点那个ok按钮,第一次点击是没有任何作用的,第二次以及以后的点击才会有效,包括点击最大化,最小化,以及关闭这种系统按钮。 为了解决以上问题,我重写了TreeView控件,在不影响其它地方的前提下,能很好的解决以上问题。我的环境:.Net framework4.0 + VS2005 + Win7 编译通过,并付执行程序。-
WPF TreeView1 双击新增节点 到TreeView2中,右键菜单删除TreeView2子节点
WPF TreeView1 双击新增节点 到TreeView2中,选中TreeView2子节点 右键删除子节点
TreeView添加、删除、修改节点的实现
treeView实现添加、删除、修改节点。
TreeView(实现树的节点增加、删除、拖拽、修改节点名等)
实现树的节点增加、删除、拖拽、修改节点名等
qt中的treeView的右击事件和双击事件
实现qt中的treeView中的右键的菜单栏的功能和双击效应,还必须大于50字,说了就这么多呀,还是不够,见谅,为了凑字


Windows SDK/API

