怎样选中其他程序中的listview控件中的第一行项目?

juziling 2004-11-11 08:47:56
程序中需要控制其他程序的某些功能.我获得的该listview空间的句柄.想动态选中listview控件的第一个项目.然后点击该程序的一个按钮完成一个功能.
怎么选择我没搞明白.请大虾指点一二.
这个事情很急人的...55555555:(
分不够我开帖送之......
...全文
288 12 打赏 收藏 举报
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
hottey 2004-11-11
  • 打赏
  • 举报
回复
也许改成这样的,你看得更清楚,老大的代码肯定是对的,哈哈!
try
vItem.stateMask := LVIS_DROPHILITED;  //有个小框框
vItem.state := LVIS_DROPHILITED; //
WriteProcessMemory(vProcess, vPointer, @vItem,
SizeOf(TLVItem), vNumberOfBytesRead);
SendMessage(mHandle, LVM_SETITEMSTATE, mIndex, lparam(vPointer));
....

你跟踪至CommCtrl的ListView_SetItemState函数就知道怎么回事了^_^
王集鹄 2004-11-11
  • 打赏
  • 举报
回复
-_-!!!!!!!!

to juziling:你到底测试过没?其他进程一样获取~~

SetListViewIndex(换成你取得的句柄, 0);

你还必须确定这个句柄是ListView的句柄~~

我回答问题是经过测试的~~
juziling 2004-11-11
  • 打赏
  • 举报
回复
zswang(伴水清清)(专家门诊清洁工) 你的程序在同进程中是有效的 , 但我要控制别的程序中的控件阿:( 能有什么好方法么?
王集鹄 2004-11-11
  • 打赏
  • 举报
回复
//参考如下代码~~
//原理:可以通过消息LVM_SETITEMSTATE设置各项的状态,lparam参数是一个局部指针,所以需要把数据填写在该进程空间里~~
uses CommCtrl;

procedure SetListViewIndex(mHandle: THandle; mIndex: Integer);
var
vProcessId: DWORD;
vProcess: THandle;
vPointer: Pointer;
vNumberOfBytesRead: Cardinal;
vItem: TLVItem;
begin
GetWindowThreadProcessId(mHandle, @vProcessId);
vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
PROCESS_VM_WRITE, False, vProcessId);
vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT,
PAGE_READWRITE);
try
vItem.stateMask := LVIS_FOCUSED;
vItem.state := LVIS_FOCUSED;
WriteProcessMemory(vProcess, vPointer, @vItem,
SizeOf(TLVItem), vNumberOfBytesRead);
SendMessage(mHandle, LVM_SETITEMSTATE, mIndex, lparam(vPointer));

vItem.stateMask := LVIS_SELECTED;
vItem.state := LVIS_SELECTED;
WriteProcessMemory(vProcess, vPointer, @vItem,
SizeOf(TLVItem), vNumberOfBytesRead);
SendMessage(mHandle, LVM_SETITEMSTATE, mIndex, lparam(vPointer));
finally
VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
CloseHandle(vProcess);
end;
end; { SetListViewIndex }

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
SetListViewIndex(ListView1.Handle, 0);
end;
BigAngell 2004-11-11
  • 打赏
  • 举报
回复
学习...
beyondtkl 2004-11-11
  • 打赏
  • 举报
回复
LVM_REDRAWITEMS


LVM_SCROLL


LVM_SETBKCOLOR


LVM_SETBKIMAGE


LVM_SETCALLBACKMASK


LVM_SETCOLUMN


LVM_SETCOLUMNORDERARRAY


LVM_SETCOLUMNWIDTH


LVM_SETEXTENDEDLISTVIEWSTYLE


LVM_SETHOTCURSOR


LVM_SETHOTITEM


LVM_SETHOVERTIME


LVM_SETICONSPACING


LVM_SETIMAGELIST


LVM_SETITEM


LVM_SETITEMCOUNT


LVM_SETITEMPOSITION


LVM_SETITEMPOSITION32


LVM_SETITEMSTATE


LVM_SETITEMTEXT


LVM_SETSELECTIONMARK


LVM_SETTEXTBKCOLOR


LVM_SETTEXTCOLOR


LVM_SETTOOLTIPS


LVM_SETUNICODEFORMAT


LVM_SETWORKAREAS


LVM_SORTITEMS


LVM_SUBITEMHITTEST


// 好像刷新后 listview默认就是指向第一项的。。。
beyondtkl 2004-11-11
  • 打赏
  • 举报
回复
你先去查一下 listview的相关操作,还有对应的消息。。。
zdq801104 2004-11-11
  • 打赏
  • 举报
回复
谢谢beyondtkl(大龙驹<弱水三K, 我取1bit>)
beyondtkl 2004-11-11
  • 打赏
  • 举报
回复
这些消息是WINDOWS定义的呀 windows or message.pas里面有。。

你就像伴水老大那样写就OK了。。。
zdq801104 2004-11-11
  • 打赏
  • 举报
回复
TO beyondtkl(大龙驹<弱水三K, 我取1bit>),大哥, 要使用你列出的消息怎么用?
王集鹄 2004-11-11
  • 打赏
  • 举报
回复
Windows的Exporer.exe是什么编写的?不是Delphi吧,我测试怎么可以?~~

你确定获取Handle是TListView(SysListView32)?~~

实在不行,就模拟按键Ctrl+Home(自己找吧)~~
juziling 2004-11-11
  • 打赏
  • 举报
回复
zswang(伴水清清)(专家门诊清洁工) 请不要生气好么 :)

你的程序在如何被控制的软件是用Delphi编写的就没问题.如果是其他语言编写的就无效了.
相关推荐
发帖
Windows SDK/API

1177

社区成员

Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
帖子事件
创建了帖子
2004-11-11 08:47
社区公告
暂无公告