如何判断当前焦点是否在TWebbrowser上?(200分)

W

www

Unregistered / Unconfirmed
GUEST, unregistred user!
如何判断当前焦点是否在TWebbrowser上?
 
if WebBrowser1.Focused then
begin
//
end;
 
to sky2008:
你试过吗?这样不行的.
 
或者这样想:
要是焦点在你的程序的话,如果其他所有可以获得焦点的控件都没有焦点,那么
焦点就在 它 上面。乱猜的:)

 
>要是焦点在你的程序的话,如果其他所有可以获得焦点的控件都没有焦点,那么
>焦点就在它上面。

倒~
 
好像可以用API获取当前焦点所在的控件(窗口),具体哪个API不知道。[^]
 
>要是焦点在你的程序的话,如果其他所有可以获得焦点的控件都没有焦点,那么
> 焦点就在 它 上面。乱猜的:)

难道我要全部检测一遍吗?

我在google搜过,其中有一个方法是Ihtmlwindow4(doc).hasfocused 但是IHtmlwindow4是在
哪里定义的呢?
 
它在新版本的MSHTML.h中,Delphi5带的MSHTML.pas版本较旧,没有定义(Delphi6,7带的
的不知道是否有定义,你可以找一找)。
下面是它的C语言定义。

#ifndef __IHTMLWindow4_FWD_DEFINED__
#define __IHTMLWindow4_FWD_DEFINED__
typedef interface IHTMLWindow4 IHTMLWindow4;
#endif /* __IHTMLWindow4_FWD_DEFINED__ */

EXTERN_C const IID IID_IHTMLWindow4;


MIDL_INTERFACE("3050f6cf-98b5-11cf-bb82-00aa00bdce0b")
IHTMLWindow4 : public IDispatch
{
public:
virtual /* [id] */ HRESULT STDMETHODCALLTYPE createPopup(
/* [in][optional] */ VARIANT *varArgIn,
/* [out][retval] */ IDispatch **ppPopup) = 0;

virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_frameElement(
/* [out][retval] */ IHTMLFrameBase **p) = 0;

};




/* [id] */ HRESULT STDMETHODCALLTYPE IHTMLWindow4_createPopup_Proxy(
IHTMLWindow4 * This,
/* [in][optional] */ VARIANT *varArgIn,
/* [out][retval] */ IDispatch **ppPopup);


void __RPC_STUB IHTMLWindow4_createPopup_Stub(
IRpcStubBuffer *This,
IRpcChannelBuffer *_pRpcChannelBuffer,
PRPC_MESSAGE _pRpcMessage,
DWORD *_pdwStubPhase);


/* [id][propget] */ HRESULT STDMETHODCALLTYPE IHTMLWindow4_get_frameElement_Proxy(
IHTMLWindow4 * This,
/* [out][retval] */ IHTMLFrameBase **p);


void __RPC_STUB IHTMLWindow4_get_frameElement_Stub(
IRpcStubBuffer *This,
IRpcChannelBuffer *_pRpcChannelBuffer,
PRPC_MESSAGE _pRpcMessage,
DWORD *_pdwStubPhase);
....
#endif /* __IHTMLWindow4_INTERFACE_DEFINED__ */


 
// 难道我要全部检测一遍吗?
要是最后找不到其他办法怎么办?打死也不用?用了丢脸?[:D]

 
而且好象必须是IE5.5以上版本才支持。
 
呵呵,试分析一个IE 5 的EVENTS
 
一个可行的方法是把新版的MSHTML.h译成Delphi的。

type
IHTMLWindow4 = interface;

IHTMLWindow4 = interface(IDispatch)
['{3050f6cf-98b5-11cf-bb82-00aa00bdce0b}']
//...
function HasFocus: WordBool
safecall;
end;
-------------------------------------
doc := WebBrowser1.Document as IHTMLDocument2;
if Ihtmlwindow4(IHTMLDocument2(doc).ParentWindow).hasfocus then beep;

不过在我这儿出错,我的IE是5.0而非5.5。:(
 
用消息试验一下
 
我觉得“Ihtmlwindow4(doc).hasfocused ”有误。

首先应该是HasFocus而不是HasFocused。
第二实际上Ihtmlwindow4并没有HasFocus方法,而IHTMLDocument4有。
所以应该是IHTMLDocument4(doc).HasFocus才对。

/* interface IHTMLDocument4 */
/* [object][uuid][dual][oleautomation] */


EXTERN_C const IID IID_IHTMLDocument4;


MIDL_INTERFACE("3050f69a-98b5-11cf-bb82-00aa00bdce0b")
IHTMLDocument4 : public IDispatch
{
public:
virtual /* [id] */ HRESULT STDMETHODCALLTYPE focus( void) = 0;

virtual /* [id] */ HRESULT STDMETHODCALLTYPE hasFocus(
/* [out][retval] */ VARIANT_BOOL *pfFocus) = 0;

virtual /* [bindable][displaybind][id][propput] */ HRESULT STDMETHODCALLTYPE put_onselectionchange(
/* [in] */ VARIANT v) = 0;

virtual /* [bindable][displaybind][id][propget] */ HRESULT STDMETHODCALLTYPE get_onselectionchange(
/* [out][retval] */ VARIANT *p) = 0;

virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_namespaces(
/* [out][retval] */ IDispatch **p) = 0;

virtual /* [id] */ HRESULT STDMETHODCALLTYPE createDocumentFromUrl(
/* [in] */ BSTR bstrUrl,
/* [in] */ BSTR bstrOptions,
/* [out][retval] */ IHTMLDocument2 **newDoc) = 0;

virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_media(
/* [in] */ BSTR v) = 0;

virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_media(
/* [out][retval] */ BSTR *p) = 0;

virtual /* [id] */ HRESULT STDMETHODCALLTYPE createEventObject(
/* [in][optional] */ VARIANT *pvarEventObject,
/* [out][retval] */ IHTMLEventObj **ppEventObj) = 0;

virtual /* [id] */ HRESULT STDMETHODCALLTYPE fireEvent(
/* [in] */ BSTR bstrEventName,
/* [in][optional] */ VARIANT *pvarEventObject,
/* [out][retval] */ VARIANT_BOOL *pfCancelled) = 0;

virtual /* [id] */ HRESULT STDMETHODCALLTYPE createRenderStyle(
/* [in] */ BSTR v,
/* [out][retval] */ IHTMLRenderStyle **ppIHTMLRenderStyle) = 0;

virtual /* [bindable][displaybind][id][propput] */ HRESULT STDMETHODCALLTYPE put_oncontrolselect(
/* [in] */ VARIANT v) = 0;

virtual /* [bindable][displaybind][id][propget] */ HRESULT STDMETHODCALLTYPE get_oncontrolselect(
/* [out][retval] */ VARIANT *p) = 0;

virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_URLUnencoded(
/* [out][retval] */ BSTR *p) = 0;

};
 
if self.ActiveOleControl = webbrowser1 then
showmessage('focused!');

保证行! :)
 
多人接受答案了。
 
顶部