Listview通过消息控制ITEM求助
低调的猪猪 2014-11-07 03:04:10 我想通过消息选中LISTView的某行,然后发出双击消息,现在选中已经可以了,就是后面的双击事件无效。请高手帮忙分析下哪里出错了。由于对API不怎么熟悉,代码网上找的。
procedure TForm1.SetItemSelected(nItemIndex: Integer;LstID,Wid:Thandle);//LstID是Listview handle Wid是Window Handle
var
LVI_1: TLVItemA;
pLVI_2: PLVItemA;
nRet: LongBool;
tagPId: DWORD;
tagPHandle: THandle;
tagHwnd: THandle;
lpNumOfBytesW: Cardinal;
pdr:pNMHDR;
myNMHDR:NMHDR;
begin
tagPId := 0;
tagPHandle := 0;
tagHwnd := 0;
lpNumOfBytesW := 0;
try
GetWindowThreadProcessId(Wid, @tagPId); // 取进程ID
tagPHandle := OpenProcess(
PROCESS_ALL_ACCESS, False, tagPId); // 获取进程句柄
except
CloseHandle(tagPHandle);
end;
try
// 向目标远程目标进程申请内存空间
pLVI_2 := VirtualAllocEx(
tagPHandle, nil, SizeOf(TLVItemA), MEM_COMMIT, PAGE_READWRITE);
Assert((pLVI_2 <> nil), '远程内存申请失败');
LVI_1.mask := LVIF_STATE;
LVI_1.iSubItem := 0;
LVI_1.state := LVIS_SELECTED or LVIS_FOCUSED;
LVI_1.stateMask := LVIS_SELECTED or LVIS_FOCUSED;
nRet := WriteProcessMemory(// 将本地进程中的结构写入到目标进程
tagPHandle, pLVI_2, @LVI_1, SizeOf(TLVItemA), lpNumOfBytesW);
Assert((nRet), '目标进程写入失败');
SendMessage(LstID, LVM_SETITEMSTATE, Integer(nItemIndex),
Integer(pLVI_2));//这上面的已经Ok了。。能成功选择自己设定的ITEM
lpNumOfBytesW:=0;
pdr := VirtualAllocEx(
tagPHandle, nil, SizeOf(myNMHDR), MEM_COMMIT, PAGE_READWRITE);
myNMHDR.code := NM_DBLCLK;
myNMHDR.hwndFrom :=Lstid;
myNMHDR.idfrom := GetWindowLong(LstID, GWL_ID);
VirtualProtectEx(tagPHandle, pdr, sizeof(myNMHDR), PAGE_READWRITE,lpNumOfBytesW);
nRet:=WriteProcessMemory(tagPHandle,pdr, @myNMHDR, SizeOF(myNMHDR),lpNumOfBytesW);//写入内存
Assert((nRet), '目标进程写入失败');
PostMessage(Wid, WM_NOTIFY, myNMHDR.idfrom, Integer(pdr));
except
VirtualFreeEx(tagPHandle, nil, SizeOf(PLVItem), MEM_FREE);
end;
CloseHandle(tagPHandle);
VirtualFreeEx(tagPHandle, nil, SizeOf(PLVItem), MEM_FREE);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SetItemSelected(2,listview1.Handle,form1.Handle);
end;