小弟用  hCurWnd = ::FindWindow("CabinetWClass", NULL);
       hCurWnd = ::FindWindow("ExploreWClass", NULL);
    
    或者 GetTopWindow(); GetNextWindow();搜寻所有 explorer 和“我的电脑”,在XP下都OK,vista下失效了。问各位英雄,有没有方法解决?

解决方案 »

  1.   

    ::FindWindowW(L"CabinetWClass", NULL)试试
      

  2.   

    明白你的意思了,在vista上,所有service都运行在session 0上面,用户窗口运行在session 1[2/3...]上面,用户进程想访问session 0的窗口时会被Session 0 Isolation屏蔽,导致无法得到窗口句柄,也不能发送消息。唯一的方法是通过管道或者其它通信方式来沟通信息。因为资源管理器窗口是service窗口,没有管道提供给你,建议的方案:设计一个运行在资源管理器下的BHO,创建一个命名管道;在用户进程里打开这个管道,请求BHO传递资源管理器的句柄(不过这个句柄你已经没有多大作用了,因为无法发送消息给它),最好把要操作的指令通过管道传递给BHO,由BHO来代替执行。
      

  3.   

    作為抵禦惡意軟體的新增防禦層,Windows Vista 可讓不同的 UI 應用程式以三層不同的 UI 特殊權限來執行。應用程式可以任意地與相同和較低權限的其他應用程式互動,但是不能與較高權限的應用程式進行修改或交談。大部份的應用程式將以中權限來執行,需要系統管理員特殊權限的應用程式會以較高模式來執行,而像是低權限 Internet Explorer 之類的受限處理程序則使用最低特殊權限模式。更明確地說,較低特殊權限模式中的應用程式一般不能傳送訊息給較高特殊權限的應用程式,除非較高特殊權限的應用程式透過呼叫 ChangeWindowMessageFilter(),明確地允許該訊息。同樣地,較低特殊權限的應用程式可以讀取,但是不能修改較高特殊權限應用程式所擁有的 HWND。基於相容性理由,SendMessage 和其他的 API 將傳回成功,即使 API 因為特殊權限問題而被封鎖。同樣地,在相容性影響高、安全性風險低的地方,有時候低特殊權限的應用程式允許傳送不請自來的訊息給高特殊權限的應用程式。http://chuiwenchiu.spaces.live.com/blog/cns!CA5D9227DF9E78E8!1326.entry
    这个网站看对你有帮助没?
      

  4.   

    楼上两位方法小弟记下了,谢谢。
    我确实是 要向 explorer 和 "我的电脑" 发送 refresh 消息。目前感觉没什么途径。jameshooo(胡柏华)方法复杂啊 ...
      

  5.   

    没办法,vista限制了,只能使用复杂的方法
      

  6.   

    为什么 SPY++ 可以看到 CabinetWClass?同道英雄们给点提示。
      

  7.   

    嘿嘿!NtQuerySystemInformation可以得到explorer进程信息
    OpenProcess打开explorer进程句柄ZwQueryObject得到该句柄的相关信息
    其中也许有哪个东西就是explorer的HWND
      

  8.   

    不知道vista下还是否允许这么干?
      

  9.   

    spy++使用的是hook技术。你别忘了一个前提,spy++仅仅是读取消息,是否能发送消息你可以自己试试
      

  10.   

    HOOK技术跟插件技术类似,都是在目标进程中加载自己的DLL,当然能获得窗口句柄和消息
      

  11.   

    这轮仔细追代码。发现偶的东西是 NTService,用 FindWindow类似的方法也找不到 explorer。(包括XP)如果改为普通ap,XP下是可行的。....我的目的是刷新 盘符,只需要刷新 G:\ ...,使得其icon和label发生预定的变化。有没有思路?
      

  12.   

    explorer都是自动刷新内容的,为何要手动刷新?这个跟文档-视图模型类似,只要数据有变化,所有view都跟随变化。当然explorer用的不是文档-视图,内部是COM,但是都能响应文件夹内容变化的通知,这是通过连接点实现的。
      

  13.   

    目前问题感觉 AP行,Service 不行,望高手指点一二。
      

  14.   

    对于资源管理器来说,刷新是自动的,你只需要调用SHChangeNotify发个通知,所有打开的资源管理器(包括打开文件对话框)都能收到通知并自动更新本窗口的内容,这是COM中最常见的连接点应用。
    不过这种方式适用于桌面程序,只有桌面才有Shell。至于是否适用于服务,我也不清楚。
      

  15.   

    恩,楼上我在 service 中发这个消息不起去作用。看Service中似乎后参数可以交互,但注册又不成功。努力...Debug...
      

  16.   

    Driver 策略成功,谢谢几位。Bow~