你是不是想要在用户的右键上增加一个操作菜单?这没必要HOOK。简单地修改注册表就可以搞定。如果你装过WinRar,看一下注册表的这个键值:
HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\WinRAR,默认是{B41DB860-8EE4-11D2-9906-E49FADC173CA}。把它删除试一下,看看你的右键菜单还有吗?

解决方案 »

  1.   

    谢谢woshiwo(我是我)  , 但是不是这样, 在我的程序运行时, 需要随时获得从我的电脑或资源管理器中的选取的文件路径.就向屏幕取词一样,可能只能不能用hook来做.
      

  2.   

    去vcl.vclxx.org找找,有现成的控件。
      

  3.   

    到这个帖子去看一看:
    http://www.csdn.net/expert/topic/769/769730.xml?temp=.1638758
      

  4.   

    看看这里打过广告的HubDog的《Delphi 深度探索》。里面有讲
    要用到Windows Shell Programming
      

  5.   

    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;
      

  6.   

    下面是我的BCB代码,已经经过测试,能正确得到文件名并且没有任何异常,我用的也是Win2000LRESULT 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;
    }
      

  7.   

    还是不行, 每次取到的都是一个“!”
    取不到路径和文件名。
    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;
      

  8.   

    这倒邪了,为什么我这里又没有事?? 我看了你贴出的代码,有一个地方跟我不一样,先改一下再试一试:FName : PChar;改为FName: Array[0..63] of Char;GetMem(FName,64);//删掉这句----------------------另:在Delphi中也有AnsiString类型吗? 我怎么只对String有印象.
      

  9.   

    非常谢谢BCB_FANS(四大名捕之追杀令) 的解答, 稍后我将把分给你, 好象是我的钩子有问题,我没用DLL, 是用的SetwindowsHookEx(WH_JOURNALRECORD,HookProc,HInstance,0); 来做全局钩子,好象根本不出现wParam=WM_LBUTTONUP 现在问题还是没有解决, 正在查这方面的资料, 我在这方面不熟,希望能不吝持教.
      

  10.   

    老兄,你看SDK没有??????? 必须使用全局鼠标沟子!!!!!!!!!!!!!!!!!!!!!
      

  11.   

    To: BCB_FANS(四大名捕之追杀令) 能否请你把你的程序发给我(包括EXE). [email protected]  
    谢谢.我是使用全局钩子的, WH_JOURNALRECORD 日志钩子是个很特别的钩子,它只有全局钩子一种,是键盘鼠标等输入设备的消息在系统消息队列被取出时发生的,而且系统中只能存在一个这样的日志钩子,更重要是,它不必用在动态链接库中
      

  12.   

    真是很怪, count数, 和被选item 的 i 值都可以出来了, 但加上 ListView_GetItemText(hLV,i,0,FName,64); 这句
    或者是用 ListView_GetItem(hLV,Item);  这句
    都会报内存错 (98报非法操作...)
      

  13.   

    TO: BCB_FANS(四大名捕之追杀令)   
    我是说你开始的那个bcb程序能否发给我, (包括exe和dll执行文件,因为我没有装bcb)虽然问题还没解决,但我已学到了不少, 我现在先把分给你.