能否采用hook实时获得用户在我的电脑或资源管理器中选取的文件及路径?

kingstone 2002-06-26 09:32:38
我对hook技术不熟, 现在有一个很急的问题,一直没能想到办法, 请教hook高手:
能否采用hook实时获得用户在我的电脑或资源管理器中选取的文件及路径?
即用户在我的电脑用鼠标或键盘选中某文件时,我的程序得到通知.
...全文
163 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingstone 2002-06-29
  • 打赏
  • 举报
回复
非常谢谢BCB_FANS(四大名捕之追杀令) 的解答, 稍后我将把分给你, 好象是我的钩子有问题,我没用DLL, 是用的SetwindowsHookEx(WH_JOURNALRECORD,HookProc,HInstance,0); 来做全局钩子,好象根本不出现wParam=WM_LBUTTONUP 现在问题还是没有解决, 正在查这方面的资料, 我在这方面不熟,希望能不吝持教.
kingstone 2002-06-29
  • 打赏
  • 举报
回复
TO: BCB_FANS(四大名捕之追杀令)
我是说你开始的那个bcb程序能否发给我, (包括exe和dll执行文件,因为我没有装bcb)

虽然问题还没解决,但我已学到了不少, 我现在先把分给你.
bcb_fans 2002-06-29
  • 打赏
  • 举报
回复
我没有使用过那种沟子,无法给你指点.
kingstone 2002-06-29
  • 打赏
  • 举报
回复
真是很怪, count数, 和被选item 的 i 值都可以出来了,

但加上 ListView_GetItemText(hLV,i,0,FName,64); 这句
或者是用 ListView_GetItem(hLV,Item); 这句
都会报内存错 (98报非法操作...)
kingstone 2002-06-29
  • 打赏
  • 举报
回复
To: BCB_FANS(四大名捕之追杀令)

能否请你把你的程序发给我(包括EXE). SunnyBird@371.net
谢谢.

我是使用全局钩子的, WH_JOURNALRECORD 日志钩子是个很特别的钩子,它只有全局钩子一种,是键盘鼠标等输入设备的消息在系统消息队列被取出时发生的,而且系统中只能存在一个这样的日志钩子,更重要是,它不必用在动态链接库中
bcb_fans 2002-06-29
  • 打赏
  • 举报
回复
老兄,你看SDK没有??????? 必须使用全局鼠标沟子!!!!!!!!!!!!!!!!!!!!!
kingstone 2002-06-28
  • 打赏
  • 举报
回复
To: BCB_FANS(四大名捕之追杀令)

我看了你回答的贴子, 并写了如下取文件名函数, 但是不知为何取不到文件名, Result :=AnsiString(Item.pszText)根本不执行,
frmMain.Lb2.Caption :=IntToStr(ItemCount);鼠标在管理器内时能取到count数,但移到某文件上时就取到0 后来发现是Wnd变了(我使用 pMouse := PMOUSEHOOKSTRUCT(lParam);mPoint := pMouse.pt;cWnd := WindowFromPoint(mPoint);得到cWnd),怎么会这样呢? 不知道为什么
而且有时会报xxxxx 内存不能为读的错误. 我用的是win2000professional

function GetFile(Wnd:HWnd):String;
var
ItemCount:Integer;
Item: LV_ITEM;
i: Integer;
begin
Result:='unknown';
ItemCount:=ListView_GetItemCount(Wnd);
frmMain.Lb2.Caption :=IntToStr(ItemCount);
for i:=0 to ItemCount-1 do
begin
Item.iItem:=i;
ListView_GetItem(Wnd,Item);
if Item.state= LVIS_SELECTED then
Result :=AnsiString(Item.pszText);
end ;
end;
bcb_fans 2002-06-28
  • 打赏
  • 举报
回复
这倒邪了,为什么我这里又没有事?? 我看了你贴出的代码,有一个地方跟我不一样,先改一下再试一试:

FName : PChar;

改为

FName: Array[0..63] of Char;

GetMem(FName,64);//删掉这句

----------------------

另:在Delphi中也有AnsiString类型吗? 我怎么只对String有印象.
kingstone 2002-06-28
  • 打赏
  • 举报
回复
还是不行, 每次取到的都是一个“!”
取不到路径和文件名。
function GetFile(hLV:HWnd):String;
var
ItemCount,i:Integer;
ClsName,FName:PChar;
begin
GetMem(ClsName,64);
GetClassName(hLV,ClsName,64);
frmMain.Lb2.Caption :=ClsName;
if ClsName = 'SysListView32' then
begin
GetMem(FName,64);
ItemCount := ListView_GetItemCount(hLV);
frmMain.Lb3.Caption :=inttostr(ItemCount);
if ItemCount > 0 then
begin
for i:=0 to ItemCount-1 do
begin
if ListView_GetItemState(hLV,i,LVIS_FOCUSED) <> LVIS_FOCUSED then Continue;
ListView_GetItemText(hLV,i,0,FName,64);
Result:=AnsiString(FName);
end;
end;
FreeMem(FName);
end;
FreeMem(ClsName);
end;
bcb_fans 2002-06-28
  • 打赏
  • 举报
回复
下面是我的BCB代码,已经经过测试,能正确得到文件名并且没有任何异常,我用的也是Win2000

LRESULT CALLBACK MouseHook(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode<0) return CallNextHookEx(MouseHookID,nCode,wParam,lParam);

//查找主窗口
if(HookWindowHandle==NULL)
{
HookWindowHandle=FindWindow(HookClassName.c_str(),NULL);
AppWindow=GetWindow(HookWindowHandle,GW_OWNER);
}

if((int)wParam != WM_LBUTTONUP) return 0;

MOUSEHOOKSTRUCT *mst=(MOUSEHOOKSTRUCT*)lParam;

HWND hLV;
TPoint P;
char Buf[64];

P.x = mst->pt.x;
P.y = mst->pt.y;

hLV = WindowFromPoint(P);

ZeroMemory(Buf,64);
GetClassName(hLV,Buf,64);

if(AnsiString(Buf) == "SysListView32")
{
int ItemCount;
char SelFileNameBuf[64];

ZeroMemory(SelFileNameBuf,64);

ItemCount = ListView_GetItemCount(hLV);

if(ItemCount > 0)
{
for(int i=0; i < ItemCount; i++)
{
if(ListView_GetItemState(hLV,i,LVIS_FOCUSED) != LVIS_FOCUSED)
continue;

ListView_GetItemText(hLV,i,0,SelFileNameBuf,64);
SendMessage(HookWindowHandle,WM_SETTEXT,0,(LPARAM)AnsiString("Index="+IntToStr(i)+" Select Filename="+AnsiString(SelFileNameBuf)).c_str());

break;//立即推出循环
}
}
}
return 0;
}
debussy 2002-06-27
  • 打赏
  • 举报
回复
看看这里打过广告的HubDog的《Delphi 深度探索》。里面有讲
要用到Windows Shell Programming
bcb_fans 2002-06-27
  • 打赏
  • 举报
回复
到这个帖子去看一看:
http://www.csdn.net/expert/topic/769/769730.xml?temp=.1638758
smartrich 2002-06-27
  • 打赏
  • 举报
回复
去vcl.vclxx.org找找,有现成的控件。
kingstone 2002-06-27
  • 打赏
  • 举报
回复
有人知道吗?
kingstone 2002-06-26
  • 打赏
  • 举报
回复
谢谢woshiwo(我是我) , 但是不是这样, 在我的程序运行时, 需要随时获得从我的电脑或资源管理器中的选取的文件路径.就向屏幕取词一样,可能只能不能用hook来做.
woshiwo 2002-06-26
  • 打赏
  • 举报
回复
你是不是想要在用户的右键上增加一个操作菜单?这没必要HOOK。简单地修改注册表就可以搞定。如果你装过WinRar,看一下注册表的这个键值:
HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\WinRAR,默认是{B41DB860-8EE4-11D2-9906-E49FADC173CA}。把它删除试一下,看看你的右键菜单还有吗?

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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