如何捕获外部程序LISTVIEW鼠标单击事件,获取该LISTVIEW当前选中行的某列的值

DeltaCat 2011-01-11 06:26:12
加精
现有一个外部程序,其界面上有个LISTVIEW控件,里面有若干行数据,我想通过自己的程序,捕获该外部程序中LISTVIEW的鼠标点击事件,同时获取其当前选中行的某列的值。

现在的初步思路是使用 SetWindowsHookEx 进行注入,但是不确定是使用 WH_MOUSE,还是 WH_CALLWNDPROC 来实现。

或者,我本身的思路就问题,请大家多指教,谢谢。
...全文
5279 50 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shawn Lane 2011-10-11
  • 打赏
  • 举报
回复

看不懂哦
liuypengway 2011-07-26
  • 打赏
  • 举报
回复
看不懂
  • 打赏
  • 举报
回复
竟然使用到了鼠标勾子了。
  • 打赏
  • 举报
回复
楼猪真是有钱人呀。
newfang 2011-02-23
  • 打赏
  • 举报
回复
那直接用鼠标钩子不就可以了吗?
pandashare 2011-02-10
  • 打赏
  • 举报
回复
14楼..学习~~
话说..22楼的看不懂- -!郁闷勒...
DeltaCat 2011-02-10
  • 打赏
  • 举报
回复
自己顶顶,没人关注了啊
DeltaCat 2011-01-25
  • 打赏
  • 举报
回复
看了大家的回复,很多都是取LISTVIEW的内容的,这个不是我要的,我要的是捕获外部LISTVIEW的鼠标双击事件,截获这个才是我需要的,谢谢大家,请继续
hejianzhong 2011-01-22
  • 打赏
  • 举报
回复
这个更简单,几句代码搞定

http://www.aau.cn/thread-58-1-1.html
huigezi123 2011-01-21
  • 打赏
  • 举报
回复
对了,以上是cb代码,你把它转成delphi就好了
huigezi123 2011-01-21
  • 打赏
  • 举报
回复
原来老妖有一个minispy想必你应该知道,能够捕获外部句柄,并能取出一些简单控件中的内容,源码可以从老妖网站下载。我曾因为需要作了个读取listview的内容地例子。
在狗狗图标的MouseMove事件里增加下面的代码:(一些名称可能需要替换)

//如果对象为ListView
if (edtName->Text.Pos("ListView")>0)
{
edtCaption->Text = "nocaption";
TLVItem *it = new TLVItem;
it->mask = LVIF_STATE;
it->state = LVIS_SELECTED + LVIS_FOCUSED + LVIS_ACTIVATING;
it->stateMask = DWord(-1);
int iItem;
iItem=SendMessage(hWindow,LVM_GETNEXTITEM,-1,LVNI_SELECTED);
if (iItem==-1)
MessageBox(NULL,"没有指定目标进程 !","错误!",NULL);
// char strCBStr[65535];
// SendMessage(hWindow, LVM_GETITEMTEXT, 0, (LPARAM)strCBStr);

String s;
GetLvItemText(hWindow, iItem, 1, s);
Memo1->Lines->Add(s );
}

其中GetLvItemText函数代码如下:
bool TForm3::GetLvItemText(HANDLE Lv, int Index, int SubItem, String& Text)
{
const int bufferLength = 4000;
bool result = false;
DWORD processId = NULL;
GetWindowThreadProcessId(Lv, &processId);
if (processId == NULL) return false;
HANDLE process = ::OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, FALSE, processId);
if (process == NULL) return false;
PVOID buffer = VirtualAllocEx(process, NULL, bufferLength, MEM_COMMIT, PAGE_READWRITE);
if (buffer != NULL)
{
LPLVITEM item = (LPLVITEM)new BYTE[bufferLength];
item->mask = LVIF_TEXT;
item->iSubItem = SubItem;
item->pszText = (LPTSTR)((PBYTE)buffer+sizeof(LVITEM));
item->cchTextMax = (bufferLength - sizeof(LVITEM)) / sizeof(TCHAR);
WriteProcessMemory(process, buffer, item, sizeof(LVITEM), NULL);
if (SendMessage(Lv, LVM_GETITEMTEXT, Index, (LPARAM)buffer) != 0)
{
ReadProcessMemory(process, buffer, item, 1024, NULL);
Text = (LPTSTR)((PBYTE)item+sizeof(LVITEM));
result = true;
}
delete item;
VirtualFreeEx(process, buffer, sizeof(LVITEM), MEM_DECOMMIT);
}
CloseHandle(process);
return result;
}
这样应该够你用了,根据自己的需要调整使用吧
lw19860412 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 huigezi123 的回复:]
对了,以上是cb代码,你把它转成delphi就好了
[/Quote]怎么转化?
无条件为你 2011-01-20
  • 打赏
  • 举报
回复
分确实不少,我可以给你提供完整代码,缺的是你的联系QQ。
我可以给你写无DLL的程序实现你的要求。
sx54605628 2011-01-14
  • 打赏
  • 举报
回复
这样的所谓“隐藏”,其实不过是掩耳盗铃,用其他工具还是比较容易看到的。
Hemingway_Brian 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kingstaron 的回复:]
引用 2 楼 zhangmeeno 的回复:
每天回帖即可获得10分可用分!小技巧

这种贴是要被封号的
[/Quote]
坏孩子龙少爷 2011-01-12
  • 打赏
  • 举报
回复
都是玩高科技的
weiym 2011-01-11
  • 打赏
  • 举报
回复
参考http://bbs.aisnote.com/viewtopic.php?f=2&t=14
weiym 2011-01-11
  • 打赏
  • 举报
回复
注入DLL, Subclass这个窗口就可以了
bdmh 2011-01-11
  • 打赏
  • 举报
回复
下面是钩子回调函数,在里面捕捉右键抬起,在外部程序的TListView上右键点击后,会被截住,并获得所点击的ListView组件,你可以将其数据传递给你自己的程序

function HookProc(code:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
var
MouseHookStruct: ^TMOUSEHOOKSTRUCT;
WC: TWinControl;
classname: array [0..99] of char;
i:Integer;
begin
Result := 0;
if code < 0 then
Result := CallNextHookEx(NextHook,code,wParam,lParam);
case wParam of
WM_LBUTTONDOWN:
begin

end;
WM_LBUTTONUP:
begin

end;
WM_LBUTTONDBLCLK:
begin

end;
WM_RBUTTONDOWN:
begin
MouseHookStruct := Pointer(LParam);
//MouseHookStruct.hwnd为所点击组件的句柄,通过它得到它的类名
GetClassName(MouseHookStruct.hwnd,classname,100);
//如果是TLitView
if StrPas(classname) = 'TListView' then
begin
//获取该组件
WC := TListView(PInteger(Integer(GetWindowLong(MouseHookStruct.hwnd, GWL_WNDPROC)) + 9)^);
//循环显示item的Caption
for i := 0 to TListView(WC).Items.Count - 1 do
begin
ShowMessage(TListView(WC).Items[i].Caption);
end;
end;
end;
WM_RBUTTONUP:
begin

end;
WM_NCMOUSEMOVE,WM_MOUSEMOVE:
begin
//给调用者发消息
SendMessage(CallHandle,MessageID,pMouseHookStruct(lParam)^.hwnd,Integer(@pMouseHookStruct(lParam)^));
end;
end;
end;
Edai9508 2011-01-11
  • 打赏
  • 举报
回复
WH_MOUSE,并判断点击的是否为TListView
加载更多回复(9)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧