我想实现的就像360这样的警告功能,我现在在BHO中已经取得地址栏文本框的句柄,用SetWindowText(editHandle, _T("TEST!"));
已经可以改变地址栏的文字了,可是用
CDC *pDc = CDC::FromHandle( ::GetDC( editHandle ) );
pDc->SetBkColor(GetSysColor(COLOR_BACKGROUND));这些都无法设置背景颜色,
请问该如何改变呢?并且弹出气泡提示框呢?谢谢~~~
已经可以改变地址栏的文字了,可是用
CDC *pDc = CDC::FromHandle( ::GetDC( editHandle ) );
pDc->SetBkColor(GetSysColor(COLOR_BACKGROUND));这些都无法设置背景颜色,
请问该如何改变呢?并且弹出气泡提示框呢?谢谢~~~
comboboxHandle = FindWindowEx(handle, NULL, L"ComboBox", NULL);
editHandle = FindWindowEx(comboboxHandle, NULL, L"Edit", NULL);我是这样拿到句柄的,用SetWindowText(editHandle, _T("TEST!"));
已经可以改变地址栏的文字,而且一直保持修改的文字
不知道问题出在哪里了,取到的pDc
怎么设定都会一瞬间成功,马上就被还原回设置前的颜色了,郁闷~~~
2.响应WM_CTLCOLORSTATIC消息
不好意思,我很久没写C++程序了,不太明白如何
先子类化ComboBox再响应WM_CTLCOLORSTATIC消息,
不知道哪里有例子给我参考一下吗?还有,我刚才用
SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, NULL, GetCurrentThreadId());HOOK了CallWndProc,拦截到了WM_SHOWWINDOW,
却没有拦截到WM_CTLCOLORSTATIC消息哦
我用spy++发现可能是WM_CTLCOLOREDIT这个事件把颜色又设回去了,
我现在想HOOK住WM_CTLCOLOREDIT,
可是用WH_CALLWNDPROC和WH_GETMESSAGE都无法截获这个消息,
不知道如何是好,
请高手再帮我解答一下吧,谢谢了
我的代码是这样的安装钩子
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网盾的做法应该不会这么复杂吧
我hook的是
hhookSysMsg = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, NULL, GetCurrentThreadId());
问题是
if(((PMSG)lParam)->message==WM_CTLCOLOREDIT) 这个判断都进不去,
不好意思,问了这么多,实在不行,我只好放弃了,
去弄一些简单的实现了,唉~~~
简单的话直接子类化就行了,前面和你说过的
然后子类化,通过SetWindowLongPtr
也就是替换它的窗口过程为你自己的!懂子类化了不??
然后在你的窗口过程里面对这个消息进行处理就OK 了!
我有点明白了,是否是处理
WndProc里的
WM_CTLCOLOREDIT
消息,
重新将ComboBox的背景色画成红色呢?
处理了子类化后的WM_CTLCOLOREDIT,
终于可以保持住背景色了,多谢各位高手,结贴了~~~