我的应用启动后,希望能够捕获第三方应用的windows窗体事件(消息->创建、销毁、隐藏)。
比如启动个Notepad,我的应用 收到notepad主窗体创建的消息(WM_Create),并获得句柄。
或者 不是windows标准消息 能够有个什么标志也可以。
附件条件(explorer.exe已被干掉)我尝试了一些方案:
1.override WndProc :
explorer被干掉后 这个方法就无效了。2.RegisterWindowMessage+RegisterShellHookWindow+SetWindowLong:
与WndProc 一样 explorer被干掉后,这个方案也瞎了。3.windows api -》EnumWindows、EnumDesktopWindows 枚举所有窗体。
这个可以得到所有的窗体句柄。但是轮询+枚举显然不靠谱...
而且枚举出500+的窗口句柄 也很难判断出,哪个是我真正需要的。4.钩子
自己试着用键盘钩子改了个WH_CBT钩子 demo 没有成功
google了一圈 发现C#+全局钩子(WH_CBT) 完全没希望。希望各位高手能提供个思路或者例子,帮忙解决一下。
非常感谢。P.S;我发现QQ 等一些在系统托盘的应用,他们的窗体是隐藏 而不是走一般的窗体的 创建和销毁,所以在有explorer的时候 也时常抓不到他们,不知道 这个原理有懂的吗?C#消息windows

解决方案 »

  1.   

    用hook,借助c++写一个全局dll挂钩和做c#的代理
    http://www.codeproject.com/Articles/18638/Using-Window-Messages-to-Implement-Global-System-H
      

  2.   

    参考:http://www.cnblogs.com/walkingmu/archive/2008/01/10/1033405.html
      

  3.   

    这个MessageFilter,我记得只能截获当前应用的消息。
    我需要截获第三方应用消息。
      

  4.   

    这个Demo 我其实试验过。基本能满足需求。
    但是 就和我补充说明的一样。
    对于 QQ 和其他一些特别的应用 截获不到主界面的消息。
    (也许是因为界面生成来自dll 或者是因为在系统托盘)。我的原始需求是 干掉explorer后 自己仿一个任务栏,所以我是从截获窗口消息这条路思考的。
    不知道 有没有更简单(优雅?)的办法直接替代windows的任务栏的部分功能,
    比如能在我的界面上,针对第三方应用 自动完成“任务栏式”图标创建。
      

  5.   

    用spy++看可以截到qq的窗口消息啊
      

  6.   

    是的 我用ViewWizard 和spy++ 都能抓到 QQ的窗口、查看句柄,但是通过消息截获 却没有QQ主窗体的 创建、销毁、隐藏一类的消息。
      

  7.   

    通过CBT 或者SHELL钩子 钩不到QQ的窗体消息
      

  8.   

    那不是要实时 获取窗体 情况么。  用SLEEP 或者 委托 调用API 获取进程窗口FINDWINDOW 不可以么? 
      

  9.   

    是实时。但我并没有具体的窗口目标,而是需要 窗口出现后,我自动捕获。另外 轮询肯定是不行。委托 也没有找到 合适的API。
      

  10.   

    不是你理解的问题。
    这个问题,我也还没有找到最好的解决思路,所以对于方式方法的选择,也还有些问题。
    目前 我是从 委托api(or钩子)抓消息这个思路在思考的。我想要达到的:
    第三方应用 创建(打开)一个窗口时,在我的的应用窗口,能及时创建出一个与windows任务栏中,该窗口相似的图标。(包含系统托盘处的应用)
      

  11.   

    怎么没有qq的消息啊,就用自带的GlobalHookTest:
      

  12.   

    to jshi123:
    感谢你的提醒,确实是我的问题。
    demo下载后 我在x64下 用vs 运行的项目。GlobalCbtHook 重新编译后,找不到QQ 主窗体了。
    改用他项目中自带的dll,现在可以了。
    这个钩子 解决了我需求(#11)中的一部分问题,不过 我还需要继续试试。
      

  13.   

    结贴:未找到合适的方案。 
    钩子在64位系统中,截获不到32位应用的消息。
    根据MSDN的说法,只能编两个版本dll。