我住包子山

this->blog.MoveTo("blog.baozishan.in")

向Vista学习,实现XP下重命名文件忽略选取扩展名

image   这两天对于HOOK的技术有了一个入门的学习,用过vista的同学会发现vista重命名一个文件比如vista.exe,他会自动选中vista忽略掉扩展名,带来比较方便的用户体验,学了一些hook我也想试试xp下能不能做这样的事情。于是参考一些文章,勉强实现了,有一点儿缺陷(请看最后)。

   经过观察我发现重命名时,资源管理器会向他的子窗口listview发送一个LVM_EDITLABELA的控制消息,所以我使用了WH_CALLWNDPROCRET类型的全局挂钩,这个挂钩可以在sendmessage结束以后处理传送和返回的数据。发送了LVM_EDITLABELA消息后,会在lParam得到一个编辑窗口的句柄,只需之后对这个窗口发送EM_SETSEL控制消息就能够改变重命名时候的高亮区域。hook回调函数如下:

   1: static LRESULT CALLBACK msghook(UINT nCode, WPARAM wParam, LPARAM lParam)
   2: {
   3:     if(nCode < 0)
   4:     {
   5:         CallNextHookEx(hook,nCode,wParam,lParam);
   6:         return 0;
   7:     }
   8:     LPCWPRETSTRUCT msg = (LPCWPRETSTRUCT) lParam;
   9:     if(msg->message == LVM_EDITLABELA || msg->message == LVM_EDITLABELW)
  10:     {
  11:         GetClassName(msg->hwnd,className,255);
  12:         GetWindowText(msg->hwnd,wndName,255);
  13:         if(0==_tcscmp(className,_TEXT("SysListView32")))
  14:         {
  15:             if(0==_tcscmp(wndName,_TEXT("FolderView")))
  16:             {
  17:                 hEditWnd = (HWND)msg->lResult;
  18:                 GetWindowText(hEditWnd,className,255);//暂时放入className
  19:                 SendMessage(hEditWnd,EM_SETSEL,0,findDot(className));
  20:             }
  21:         }
  22:     }
  23:     return CallNextHookEx(hook,nCode,wParam,lParam);
  24: }

 

className与wndName是两个TCHAR数组,从hwnd获取信息存在那里进行判断是否为Shell中的listview,避免在其它使用listview的应用程序里会进行之后的处理。

   工程文件下载,点这里

   程序下载,点这里

   使用方法,编译以后直接运行GRnamer就可以,如果不想用了,从任务管理器把它关闭,没有做trayicon之类的东西,因为只是个demo。

image   最后说一下缺陷,缺陷就是这样做没有办法判断文件与文件夹的区别,所以会有如图的效果,我自己没有想到解决的方法,请达人们指点。:)

 

   参考的文章:

msdn Hooks hook的全部参考

codeproject Hooks and DLLs 我的hook dll都是照着它写的。

posted on 2008-05-17 02:05 Gohan 阅读(2995) 评论(17)  编辑 收藏 引用 所属分类: C++MFC/SDK

Feedback

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名[未登录] 2008-05-17 10:34 Rich

学习了。  回复  更多评论   

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名 2008-05-17 10:41 blankyao

学习一下~  回复  更多评论   

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名 2008-05-17 10:42 Leewings

这么麻烦....
ubuntu自动实现了..哈哈.~  回复  更多评论   

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名 2008-05-17 10:50 Gohan

@Leewings
呵呵,是有点麻烦:)  回复  更多评论   

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名 2008-05-17 11:27 陈梓瀚(vczh)

读文件的attribute是可以知道这东西是文件还是文件夹的。至于路径,去hack资源管理器的那个下拉列表应该看得到的吧?这个我没干过,不知道行不行。  回复  更多评论   

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名 2008-05-17 12:09 Gohan

@陈梓瀚(vczh)
恩,这样应该能得到路径,不过可能对于桌面上的文件就不支持了,还有问题是如果没有显示地址工具栏是找不到那个combolbox的。以后等学好了shell 扩展可能能更完善的解决。  回复  更多评论   

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名 2008-05-18 23:29 闲耘

Win2k3下无反应。  回复  更多评论   

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名 2008-05-19 12:42 Gohan

@闲耘
哦?可能是2003加强了安全吧,我没有用过2003,这个demo只在xp下试用通过  回复  更多评论   

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名 2008-05-19 17:07 多多

@Gohan

桌面上也可以得到路径。用

%USERPROFILE%\桌面

即可~  回复  更多评论   

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名 2008-05-19 19:08 Gohan

@多多
是的,谢谢,对了,桌面好像可以也可通过一个shell相关的函数返回pidl来得到。等以后练习练习  回复  更多评论   

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名 2008-05-19 19:11 多多

@Gohan

这个我也有印象,因为桌面就是Explorer的一个窗口,可以获得他的句柄。  回复  更多评论   

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名 2008-05-20 21:33 Gohan

@多多
好的,多多交流  回复  更多评论   

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名 2009-02-22 15:41 einheria

有一个缺点,F2和右键重命名都可以实现,慢双击发起的重命名还是高亮选取全部

LZ这个程序很好,我已经设为开机自动运行了,希望可以改进!  回复  更多评论   

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名 2009-02-26 11:46 Gohan

@einheria
谢谢你的支持,这个小程序只是一个小练手,不知道啥时候能够再改改了。高档的软件有很多,QTTabbar也附有这个功能。  回复  更多评论   

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名 2010-04-08 12:19

多谢!!!  回复  更多评论   

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名 2011-05-26 16:07 free keylogger download

win7 下怎么不能正确判断呢?
情楼主帮忙看一下,多谢  回复  更多评论   

# re: 向Vista学习,实现XP下重命名文件忽略选取扩展名 2011-05-26 16:09 free auto bulk mail sender download

多谢分享,非常实用的一个feature!  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理