从ie句柄中取得IHTMLDocument2,弹出窗口为什么不行啊大家帮顶啊多谢先
从ie句柄中取得IHTMLDocument2,弹出窗口为什么不行啊???大家帮顶啊,谢谢先
我采用如下函数:
Type
TObjectFromLResult = Function(LRESULT: lResult; Const IID: TIID; WPARAM: wParam; Out pObject): HRESULT; stdcall;
Function GetIEFromHWND(WHandle: HWND; Var IE: IWebbrowser2): HRESULT;
Var
hInst: HWND;
lRes: Cardinal;
MSG: Integer;
pDoc: IHTMLDocument2;
ObjectFromLresult: TObjectFromLresult;
Begin
hInst := LoadLibrary('Oleacc.dll');
@ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');
If @ObjectFromLresult <> Nil Then
Begin
Try
MSG := RegisterWindowMessage('WM_HTML_GETOBJECT');
SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
If Result = S_OK Then
(pDoc.parentWindow As IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);
Finally
FreeLibrary(hInst);
End;
End;
End;
先获取句柄。这里为了测试,我直接用spy++抓取的句柄手动赋给WndChild。正常网页没事,弹出窗口
GetIEFromHWnd(WndChild, IE);
获取的ie始终是nil啊。
来了兄弟都给帮顶啊。着急死了。
------解决方案--------------------
你断点调试一下,pDoc是接收到了IHTMLDocument2值,只是IE(IWebbrowser2)返回了nil。
------解决方案--------------------
不知道怎么取得正确的IWebbrowser2,但是你要的不是IHTMLDocument2吗?
------解决方案--------------------
。。。
Function GetIEFromHWND(WHandle: HWND; Var IE: IWebbrowser2; var Doc: IHTMLDocument2): HRESULT;
Var
hInst: HWND;
lRes: Cardinal;
MSG: Integer;
pDoc: IHTMLDocument2;
ObjectFromLresult: TObjectFromLresult;
Begin
hInst := LoadLibrary('Oleacc.dll');
@ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');
If @ObjectFromLresult <> Nil Then
Begin
Try
MSG := RegisterWindowMessage('WM_HTML_GETOBJECT');
SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
Doc := pDoc;
If Result = S_OK Then
(pDoc.parentWindow As IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);
Finally
FreeLibrary(hInst);
End;
End;
End;
调用会吧。。。
------解决方案--------------------
只有红色的地方是新添加的,够简单吧?
我采用如下函数:
Type
TObjectFromLResult = Function(LRESULT: lResult; Const IID: TIID; WPARAM: wParam; Out pObject): HRESULT; stdcall;
Function GetIEFromHWND(WHandle: HWND; Var IE: IWebbrowser2): HRESULT;
Var
hInst: HWND;
lRes: Cardinal;
MSG: Integer;
pDoc: IHTMLDocument2;
ObjectFromLresult: TObjectFromLresult;
Begin
hInst := LoadLibrary('Oleacc.dll');
@ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');
If @ObjectFromLresult <> Nil Then
Begin
Try
MSG := RegisterWindowMessage('WM_HTML_GETOBJECT');
SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
If Result = S_OK Then
(pDoc.parentWindow As IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);
Finally
FreeLibrary(hInst);
End;
End;
End;
先获取句柄。这里为了测试,我直接用spy++抓取的句柄手动赋给WndChild。正常网页没事,弹出窗口
GetIEFromHWnd(WndChild, IE);
获取的ie始终是nil啊。
来了兄弟都给帮顶啊。着急死了。
------解决方案--------------------
你断点调试一下,pDoc是接收到了IHTMLDocument2值,只是IE(IWebbrowser2)返回了nil。
------解决方案--------------------
不知道怎么取得正确的IWebbrowser2,但是你要的不是IHTMLDocument2吗?
------解决方案--------------------
。。。
Function GetIEFromHWND(WHandle: HWND; Var IE: IWebbrowser2; var Doc: IHTMLDocument2): HRESULT;
Var
hInst: HWND;
lRes: Cardinal;
MSG: Integer;
pDoc: IHTMLDocument2;
ObjectFromLresult: TObjectFromLresult;
Begin
hInst := LoadLibrary('Oleacc.dll');
@ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');
If @ObjectFromLresult <> Nil Then
Begin
Try
MSG := RegisterWindowMessage('WM_HTML_GETOBJECT');
SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
Doc := pDoc;
If Result = S_OK Then
(pDoc.parentWindow As IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);
Finally
FreeLibrary(hInst);
End;
End;
End;
调用会吧。。。
------解决方案--------------------
只有红色的地方是新添加的,够简单吧?