你是不是想要在用户的右键上增加一个操作菜单?这没必要HOOK。简单地修改注册表就可以搞定。如果你装过WinRar,看一下注册表的这个键值:
HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\WinRAR,默认是{B41DB860-8EE4-11D2-9906-E49FADC173CA}。把它删除试一下,看看你的右键菜单还有吗?
HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\WinRAR,默认是{B41DB860-8EE4-11D2-9906-E49FADC173CA}。把它删除试一下,看看你的右键菜单还有吗?
http://www.csdn.net/expert/topic/769/769730.xml?temp=.1638758
要用到Windows Shell Programming
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;
{
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;
}
取不到路径和文件名。
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;
谢谢.我是使用全局钩子的, WH_JOURNALRECORD 日志钩子是个很特别的钩子,它只有全局钩子一种,是键盘鼠标等输入设备的消息在系统消息队列被取出时发生的,而且系统中只能存在一个这样的日志钩子,更重要是,它不必用在动态链接库中
或者是用 ListView_GetItem(hLV,Item); 这句
都会报内存错 (98报非法操作...)
我是说你开始的那个bcb程序能否发给我, (包括exe和dll执行文件,因为我没有装bcb)虽然问题还没解决,但我已学到了不少, 我现在先把分给你.