高手们,请教一个关闭WebBrowser控件窗口的问题

caok 2011-08-04 11:14:21
通过CREATEWINDOW创建一个窗口,并显示一个网页,网页关闭了,窗口却关不了,各位有什么好办法吗

HWND hWnd=CreateWindow(szClassName,pszUrl,WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU ,
CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,g_hInstance,NULL);
CComQIPtr<IWebBrowser2> spWebBrowser;

//窗口居中开始
RECT rcDlg;
int cxDlg,cyDlg;
::GetWindowRect(hWnd,&rcDlg);
cxDlg=rcDlg.right-rcDlg.left;
cyDlg=rcDlg.bottom-rcDlg.top;
SetWindowPos(hWnd,HWND_TOP,GetSystemMetrics(SM_CXSCREEN)/2-cxDlg/2,GetSystemMetrics(SM_CYSCREEN)/2-cyDlg/2,0,0,SWP_NOSIZE);
//窗口居中结束

CAxWindow axWindow;
RECT rc;
GetClientRect(hWnd, &rc);
axWindow.Create(hWnd, rc, 0,WS_CHILD |WS_VISIBLE);
axWindow.CreateControl(OLESTR("shell.Explorer.2"));
axWindow.QueryControl(&spWebBrowser);
CComVariant varUrl(pszUrl);
spWebBrowser->Navigate2(&varUrl,0,0,0,0);



ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
axWindow.Detach();
...全文
170 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
caok 2011-08-07
  • 打赏
  • 举报
回复
已找到解决方案,在创建窗口时,监控窗口事件即可。

//监控窗口事件开始
MSG Msg;

while( GetMessage(&Msg,NULL,0,0)){
if(Msg.message==WM_QUIT)
{

DestroyWindow(hWnd);
// MessageBox(NULL,_T("收到WM_QUIT,即将跳出消息循环"),_T("注意了"),MB_OK);
break;
}
if(Msg.message==WM_CLOSE){
DestroyWindow(hWnd);
// MessageBox(NULL,_T("收到WM_CLOSE,即将跳出消息循环"),_T("注意了"),MB_OK);
break;
}
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return;
//结束
向立天 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 caok 的回复:]

楼上的老兄,如何拦呢,有示例否
[/Quote]
重载消息啊
caok 2011-08-05
  • 打赏
  • 举报
回复
楼上的老兄,如何拦呢,有示例否
向立天 2011-08-05
  • 打赏
  • 举报
回复
试试看在OnBeforeNavigate2里拦一下
如果发现网页关了就把窗口也关掉
caok 2011-08-05
  • 打赏
  • 举报
回复
window.parent.close();呀,就是关不了主窗口
caok 2011-08-05
  • 打赏
  • 举报
回复
网页是通过JAVASCRIPT关的呀
向立天 2011-08-05
  • 打赏
  • 举报
回复
什么叫网页关闭了窗口关不了
网页怎么关的?
如果你能控制所谓网页开关那同时给窗口发个WM_CLOSE消息不就好了
caok 2011-08-05
  • 打赏
  • 举报
回复
在哪里DestroyWindow里,我已经在回调函数里调用了
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_CLOSE:

DestroyWindow(hWnd);
break;
case WM_QUIT:

break;

default:

return (int)DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}
caok 2011-08-05
  • 打赏
  • 举报
回复
窗口过程是这个
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_CLOSE:

DestroyWindow(hWnd);
break;


default:

return (int)DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}
向立天 2011-08-05
  • 打赏
  • 举报
回复
动态创建的也应该有窗口过程啊
如果我说拦一下鼠标消息你知道怎么做么?
方法是一样的
caok 2011-08-05
  • 打赏
  • 举报
回复
我是在DLL中调用的,动态创建窗口。
oyljerry 2011-08-04
  • 打赏
  • 举报
回复
DestroyWindow()..
caok 2011-08-04
  • 打赏
  • 举报
回复
BOOL RegisterWindowClass()
{
WNDCLASS wc = {0};
wc.style=CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=(WNDPROC)WndProc;
wc.hInstance=g_hInstance;
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName=szClassName;
return !RegisterClass(&wc);
}

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧