|
发表于 2021-4-25 18:30:01
|
显示全部楼层
看你想怎么关。
如果是IE的,用上面的都行,
如果是其他的基于IE内核的,就需要换种方法。
但都有一个前提,你要得到那个窗口的HWND,不然,什么都不要说。
如果已经得到HWND,就什么事都好办了。
举例说,得到鼠标下面的窗体的HWND之后,判断是不是IE内核的HWND,
如果是,则处理之。
下面是我用在《资料收集库》中的一部分代码,你可以参靠一下。
[code=C/C++]
bool __fastcall TForm::FindHtmlParent(HWND hWnd)
{
//TODO: 查找看看HTML的父亲窗体是不是Docbook的或者是资源管理器的。
//是就返回true。否则就false
HWND hWndParent=NULL;
//找到Internet Explorer_Server的父窗体句柄
hWndParent=GetParent(hWnd);
if((hWndParent!=hWnd) && hWndParent!=NULL)
{
char bufClassName[255],bufClassCaption[255];
GetClassName(hWndParent,bufClassName,255);
if( (AnsiString(bufClassName).Pos("SHELLDLL_DefView")>0) //资源管理器。
||(AnsiString(bufClassName).Pos("Internet Explorer_TridentDlgFrame")>0) ) //IE对话框
return true;
if(AnsiString(bufClassName).Pos("Shell DocObject View")>0)
{
//如果是IE或者其它的浏览器的,就要判断是否docbook的浏览器。
int TextLength;
HWND hMainWndParent=GetParent(hWndParent);
GetClassName(hMainWndParent,bufClassName,255);
if(AnsiString(bufClassName).Pos("Shell Embedding")>0)
{
HWND hpMainWndParent=GetParent(hMainWndParent);
GetClassName(hpMainWndParent,bufClassName,255);
TextLength=SendMessage(hpMainWndParent,WM_GETTEXTLENGTH,0,0);
if(TextLength>256) TextLength=255;
if(TextLength>0)
{
SendMessage(hpMainWndParent,WM_GETTEXT,TextLength+1,(LPARAM)&bufClassCaption[0]);
if(AnsiString(bufClassCaption).Pos("DOCBOOK")) return true;
}
} // end of Shell Embedding
}//end of Shell DocObject View
} //end of NULL.
return false;
}
//---------------------------------------------------------------------------
void __fastcall TForm::OnGetDocInterface(HWND hWnd)
{
//TODO:取得相应的Web_IE_DOC
if(FindHtmlParent(hWnd)) return;
CoInitialize( NULL );
//OleInitialize(NULL);
//TODO:取得所得到的IE的内容。
// Explicitly load MSAA so we know if it's installed
wchar_t *szTitle=L"",*szUrl=L"";
IHTMLDocument2* WebDoc=NULL;
HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
if ( hInst != NULL )
{
if ( hWnd != NULL )
{
//CComPtr<IHTMLDocument2> spDoc;
System::DelphiInterface<IHTMLDocument2> spDoc;
LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
if ( pfObjectFromLresult != NULL )
{
HRESULT hr;
hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument, 0, (void**)&spDoc );
if ( SUCCEEDED(hr) )
{
System::DelphiInterface<IDispatch> spDisp;
System::DelphiInterface<IHTMLWindow2> spWin;
//CComPtr<IDispatch> spDisp;
//CComQIPtr<IHTMLWindow2> spWin;
spDoc->get_Script( &spDisp );
spWin = spDisp;
//spWin->get_document( &spDoc.p );
//WebDoc= (LPDISPATCH)spDoc;
spWin->get_document( &WebDoc );
//spDoc->get_title(&szTitle);
//spDoc->get_URL(&szUrl);
WebDoc->get_title(&szTitle);
WebDoc->get_URL(&szUrl);
}
}//end of if ( pfObjectFromLresult != NULL )
} // if ( hWnd != NULL )
::FreeLibrary( hInst );
} // else Active Accessibility is not installed
if(AnsiString(szUrl)=="")
{
return ;
}
CoUninitialize();
}
//---------------------------------------------------------------------------
//关闭代码。
hDestHwnd就是要关闭的
//关闭指定的窗口。
char bufClassName[256];
memset(bufClassName,0x00,sizeof(bufClassName));
GetClassName(hDestHwnd,bufClassName,255);
if(strcmp(bufClassName,"HH Child")!=0) //HH Child 的不关闭。
{
//傲游有毛病,竟然直接PostMessage关闭不行。
//只好通过窗体句柄取得EXE的完全路径来判断了。
//先取得程序的主窗体的句柄
HWND MaxthonRootHWND = GetAncestor(hDestHwnd,GA_ROOT);
DWORD lpdwProcessId;
HANDLE ExeHandle;
HMODULE hMods=NULL;
//再取得程序的EXE路径
GetWindowThreadProcessId(MaxthonRootHWND,&lpdwProcessId);
ExeHandle = OpenProcess(PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,
TRUE,lpdwProcessId) ;
if(ExeHandle)
{
memset(bufClassName,0x00,sizeof(bufClassName));
GetModuleFileNameEx(ExeHandle,hMods,bufClassName,sizeof(bufClassName));
if(AnsiString(bufClassName).UpperCase().Pos("MAXTHON.EXE"))
{
//hDestHwnd不是真正的窗口,应该还要往上。
hDestHwnd = GetParent(hDestHwnd);
}
}//end of if(ExeHandle)
PostMessage(hDestHwnd,WM_CLOSE,NULL,NULL);
}//end of if(strcmp(bufClassName,"HH Child")
[/code] |
|