我想实现的就像360这样的警告功能,我现在在BHO中已经取得地址栏文本框的句柄,用SetWindowText(editHandle, _T("TEST!"));
已经可以改变地址栏的文字了,可是用
CDC *pDc = CDC::FromHandle( ::GetDC( editHandle ) );
pDc->SetBkColor(GetSysColor(COLOR_BACKGROUND));这些都无法设置背景颜色,
请问该如何改变呢?并且弹出气泡提示框呢?谢谢~~~

解决方案 »

  1.   

    本帖最后由 tttyd 于 2010-01-05 15:01:01 编辑
      

  2.   


    comboboxHandle = FindWindowEx(handle, NULL, L"ComboBox", NULL);
    editHandle = FindWindowEx(comboboxHandle, NULL, L"Edit", NULL);我是这样拿到句柄的,用SetWindowText(editHandle, _T("TEST!"));
    已经可以改变地址栏的文字,而且一直保持修改的文字
    不知道问题出在哪里了,取到的pDc
    怎么设定都会一瞬间成功,马上就被还原回设置前的颜色了,郁闷~~~
      

  3.   

    本帖最后由 tttyd 于 2010-01-05 15:32:11 编辑
      

  4.   

    1.子类化Edit控件的父窗口(ComboBox)
    2.响应WM_CTLCOLORSTATIC消息
      

  5.   


    不好意思,我很久没写C++程序了,不太明白如何
    先子类化ComboBox再响应WM_CTLCOLORSTATIC消息,
    不知道哪里有例子给我参考一下吗?还有,我刚才用
    SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, NULL, GetCurrentThreadId());HOOK了CallWndProc,拦截到了WM_SHOWWINDOW,
    却没有拦截到WM_CTLCOLORSTATIC消息哦
      

  6.   


    我用spy++发现可能是WM_CTLCOLOREDIT这个事件把颜色又设回去了,
    我现在想HOOK住WM_CTLCOLOREDIT,
    可是用WH_CALLWNDPROC和WH_GETMESSAGE都无法截获这个消息,
    不知道如何是好,
    请高手再帮我解答一下吧,谢谢了
      

  7.   

    刚测试了一下Edit控件能接收到WM_CTLCOLOREDIT消息你可以截获这个消息设置地址栏的背景颜色
      

  8.   

    补充一下,你需要拦截Edit的父窗口也就是ComboBOx控件的消息才行
      

  9.   


    我的代码是这样的安装钩子
    hhookSysMsg = SetWindowsHookEx(WH_CALLWNDPROCRET, CallWndProc, NULL, GetCurrentThreadId());
    //hhookSysMsg = SetWindowsHookEx(WH_GETMESSAGE, CallWndProc, NULL, GetCurrentThreadId());
    处理钩子:
            if(((PMSG)lParam)->message==WM_CTLCOLOREDIT)
    {
    ::GetClassName(((PMSG)lParam)->hwnd, strClassName.GetBufferSetLength(128), 128);
    if (0 == strClassName.CompareNoCase(_T("Internet Explorer_Server"))) 
    {
                        //找到Edit设置成红色
    }
    }if语句进不去,
    WM_PAINT等消息都可以截获,
    就WM_CTLCOLOREDIT这个消息拦截不到
    不过感觉360网盾的做法应该不会这么复杂吧
      

  10.   

    本帖最后由 tttyd 于 2010-01-06 13:59:54 编辑
      

  11.   


    我hook的是
    hhookSysMsg = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, NULL, GetCurrentThreadId());
    问题是
    if(((PMSG)lParam)->message==WM_CTLCOLOREDIT) 这个判断都进不去,
    不好意思,问了这么多,实在不行,我只好放弃了,
    去弄一些简单的实现了,唉~~~
      

  12.   

    HOOK的办法是有些麻烦
    简单的话直接子类化就行了,前面和你说过的
      

  13.   

    先通过钩子注入到浏览器里面,就是SetWindowHookEx 
    然后子类化,通过SetWindowLongPtr
    也就是替换它的窗口过程为你自己的!懂子类化了不??
    然后在你的窗口过程里面对这个消息进行处理就OK 了!
      

  14.   

    为什么要用钩子啊?直接 GetWindowLong 获取 WndProc 然后替换不就好了吗?p.s: combobox 里面还有一个edit , 注意区别到底替换哪一个窗口的WndProc话说,我做过类似 chrome 的 address bar. 也是子类化系统comboBox
      

  15.   


    我有点明白了,是否是处理
    WndProc里的
    WM_CTLCOLOREDIT
    消息,
    重新将ComboBox的背景色画成红色呢?
      

  16.   

    OK,搞定了,
    处理了子类化后的WM_CTLCOLOREDIT,
    终于可以保持住背景色了,多谢各位高手,结贴了~~~