给外部程序的Listview发送选中行的命令 如题,网上有c++取Listview内容的代码,也能取到,但是想对外部程序发送消息,使Listview自己选中第一条记录 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 uses CommCtrl;var Item: TLVItem;begin p := VirtualAllocEx...//在目标进程分配内存 Item.stateMask := LVIS_SELECTED; Item.state := LVIS_SELECTED; WriteProcessMemory...//将本进程Item数据拷贝到目标进程的p位置 SendMessage(hwndLV{目标ListView句柄}, LVM_SETITEMSTATE, 0{第1条记录}, Integer(p))end; 参考这个http://blog.csdn.net/xuplus/article/details/2294362 把http://blog.csdn.net/xuplus/article/details/2294362综合修改了下,用任务管理器测试通过uses Commctrl;// 查找窗口 SysListView32function MyFindWindow: THandle;const // 父窗口类名数组 A_szClassName: array[0..2] of PChar = ( '#32770', '#32770', 'SysListView32' ); // 父窗口标题数组 A_szWinName: array[0..2] of PChar = ( 'Windows 任务管理器', '', '任务' );var i: Integer; hLastWin: THandle;begin // 首先求得顶级父窗口 hLastWin := FindWindow(A_szClassName[0], A_szWinName[0]); // 逐次用FindWindowEx函数求出各级子窗口 for i := 1 to 2 do begin hLastWin := FindWindowEx(hLastWin, THandle(nil), A_szClassName[i], A_szWinName[i]); end; result := hLastWin;end;procedure TForm1.SetItemSelected(nItemIndex: Integer);var LVI_1: TLVItemA; pLVI_2: PLVItemA; nRet: LongBool; tagPId: DWORD; tagPHandle: THandle; tagHwnd: THandle; lpNumOfBytesW: Cardinal;begin tagPId := 0; tagPHandle := 0; tagHwnd := 0; lpNumOfBytesW := 0; tagHwnd := FindWindow('#32770', 'Windows 任务管理器'); if tagHwnd < 1 then Exit; try GetWindowThreadProcessId(tagHwnd, @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), '目标进程写入失败'); tagHwnd := MyFindWindow; if tagHwnd < 1 then Exit; SendMessage(tagHwnd, LVM_SETITEMSTATE, Integer(nItemIndex), Integer(pLVI_2)); except VirtualFreeEx(tagPHandle, nil, SizeOf(PLVItem), MEM_FREE); end; CloseHandle(tagPHandle); VirtualFreeEx(tagPHandle, nil, SizeOf(PLVItem), MEM_FREE);end;//用XP的任务管理器做测试procedure TForm1.btn1Click(Sender: TObject);begin // 选中任务管理器->应用程序 下的第2项, SetItemSelected(1);end; 你说的我能实现 现在是灰色的选中。而不是正常我们自己写的那种蓝色的选中 我不是想加高亮。当点击的时候会有一个edit框显示它的值,但是我用Sendmessage发送选中只是灰色的调而且Edit没有反应。 你说的我能实现 现在是灰色的选中。而不是正常我们自己写的那种蓝色的选中 我不是想加高亮。当点击的时候会有一个edit框显示它的值,但是我用Sendmessage发送选中只是灰色的调而且Edit没有反应。LVM_EDITLABEL 在dbgrid怎样实现按列名排序 Tdbgrid锁定列后无法显示标题?如何解决? 在Dephi中要实现以下功能这句怎么写? 如何设置DBNavigator控件垂直放在窗口上,或用第三方控件 确实搞不定了,sqloledb.dll,msado15.dll的问题 在DELPHI5.0里,怎样用TQuery组件,批量更新服务器上的数据? 想做一个程序员,真正的程序员,该怎么做??? 为什么query无法更新 是DELPHI的BUG吗? ADO的MaxRecords问题 处理窗口消息方面的问题,帮忙看看,谢谢! 奇怪的问题
Item: TLVItem;
begin
p := VirtualAllocEx...//在目标进程分配内存
Item.stateMask := LVIS_SELECTED;
Item.state := LVIS_SELECTED;
WriteProcessMemory...//将本进程Item数据拷贝到目标进程的p位置
SendMessage(hwndLV{目标ListView句柄}, LVM_SETITEMSTATE, 0{第1条记录}, Integer(p))
end;
http://blog.csdn.net/xuplus/article/details/2294362
用任务管理器测试通过
uses Commctrl;// 查找窗口 SysListView32function MyFindWindow: THandle;
const
// 父窗口类名数组
A_szClassName: array[0..2] of PChar = (
'#32770',
'#32770',
'SysListView32'
);
// 父窗口标题数组
A_szWinName: array[0..2] of PChar = (
'Windows 任务管理器',
'',
'任务'
);
var
i: Integer;
hLastWin: THandle;
begin
// 首先求得顶级父窗口
hLastWin := FindWindow(A_szClassName[0], A_szWinName[0]);
// 逐次用FindWindowEx函数求出各级子窗口
for i := 1 to 2 do
begin
hLastWin := FindWindowEx(hLastWin, THandle(nil),
A_szClassName[i], A_szWinName[i]);
end;
result := hLastWin;
end;procedure TForm1.SetItemSelected(nItemIndex: Integer);
var
LVI_1: TLVItemA;
pLVI_2: PLVItemA;
nRet: LongBool;
tagPId: DWORD;
tagPHandle: THandle;
tagHwnd: THandle;
lpNumOfBytesW: Cardinal;
begin
tagPId := 0;
tagPHandle := 0;
tagHwnd := 0;
lpNumOfBytesW := 0; tagHwnd := FindWindow('#32770', 'Windows 任务管理器');
if tagHwnd < 1 then
Exit; try
GetWindowThreadProcessId(tagHwnd, @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), '目标进程写入失败'); tagHwnd := MyFindWindow;
if tagHwnd < 1 then
Exit;
SendMessage(tagHwnd, LVM_SETITEMSTATE, Integer(nItemIndex),
Integer(pLVI_2));
except
VirtualFreeEx(tagPHandle, nil, SizeOf(PLVItem), MEM_FREE);
end; CloseHandle(tagPHandle);
VirtualFreeEx(tagPHandle, nil, SizeOf(PLVItem), MEM_FREE);
end;//用XP的任务管理器做测试
procedure TForm1.btn1Click(Sender: TObject);
begin
// 选中任务管理器->应用程序 下的第2项,
SetItemSelected(1);
end;