I found another solution.
I just make normal window and put the html control into the windown and hide it, which solves all the problems that I mentioned above.
In the ControlSite I implemented IOleWindow::GetWindow() to put control like following code (mWindow is just my Basic window class), just return this normal window's handle.
HRESULT STDMETHODCALLTYPE GetWindow(/* [out] */ HWND __RPC_FAR* theWindow)
{
*theWindow = mWindow.GetHandle();
return S_OK;
}