- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在我的 C++ 程序中嵌入一个网页。我遇到的问题是,在嵌入式页面的 javascript 中,我可以捕获 onkeypress,但不会触发 onkeydown 和 onkeyup。
如果我在非嵌入式 IE(或 Chrome)窗口中查看测试 HTML,那么它可以完美运行。只有在将它嵌入到 IE 控件中使用时才会出现问题。
如果我为 IE 窗口挂接 WndProc(或使用 Spy++),WM_KEYDOWN、WM_CHAR 和 WM_KEYUP 消息肯定会进入窗口。
我试图使示例代码尽可能少——删除了很多错误检查、清理等。
在准备 IE 控件时是否缺少某些设置?或者这只是使用 IE 嵌入式时的方式?我会认为,如果缺少设置,我将无法获得任何输入。
这是 HTML 测试文件:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<script type="text/javascript" language="javascript">
var n = 0;
document.onkeydown = function()
{
var output=document.getElementById("output");
output.innerHTML = n++ + " onkeydown<br>" + output.innerHTML;
return true;
};
document.onkeypress = function()
{
var output=document.getElementById("output");
output.innerHTML = n++ + " onkeypress<br>" + output.innerHTML;
return true;
};
document.onkeyup = function()
{
var output=document.getElementById("output");
output.innerHTML = n++ + " onkeyup<br>" + output.innerHTML;
return true;
};
</script>
</head>
<body>
This is some testing text.
<input/>
<br>
<div id="output" style="border-style:solid; border-width:1; "></div>
</body>
</html>
以及嵌入文件的 C++ 代码:
#include <stdio.h>
#include <Windows.h>
#include <string>
#include <atlbase.h> // for CComPtr<>
#include <Exdisp.h>
#include <comdef.h> // for variant_t
namespace
{
const int MAIN_WINDOW_WIDTH = 800;
const int MAIN_WINDOW_HEIGHT = 600;
const int HTML_WINDOW_WIDTH = 640;
const int HTML_WINDOW_HEIGHT = 480;
}
//------------------------------------------------------------------------------
void FatalError(std::string _report)
{
::MessageBox(nullptr, _report.c_str(), "Error", MB_OK);
::ExitProcess(1);
}
//------------------------------------------------------------------------------
class EmbeddedBrowser :
public IOleClientSite,
public IOleInPlaceSite,
public IStorage
{
public:
EmbeddedBrowser(HWND _mainWindow)
{
m_comRefCount = 0;
::SetRect(&m_objectRect, -300, -300, 300, 300);
m_mainWindow = _mainWindow;
CreateBrowserObject();
::ShowWindow(GetControlWindow(), SW_SHOW);
variant_t flags((UINT)0);
m_webBrowser->Navigate(L"about:blank",
&flags, nullptr, nullptr, nullptr);
}
void CreateBrowserObject()
{
HRESULT hr = ::OleCreate(CLSID_WebBrowser,
IID_IOleObject, OLERENDER_DRAW, 0, this, this, (void**)&m_oleObject);
if(FAILED(hr))
FatalError("OleCreate() failed");
hr = m_oleObject->SetClientSite(this);
hr = OleSetContainedObject(m_oleObject, TRUE);
RECT posRect;
::SetRect(&posRect, -300, -300, 300, 300);
hr = m_oleObject->DoVerb(OLEIVERB_INPLACEACTIVATE,
NULL, this, -1, m_mainWindow, &posRect);
if(FAILED(hr))
FatalError("DoVerb(OLEIVERB_INPLACEACTIVATE) failed");
hr = m_oleObject.QueryInterface(&m_webBrowser);
if(FAILED(hr))
FatalError("QueryInterface(IWebBrowser) failed");
}
virtual void Navigate(std::wstring _url)
{
bstr_t url(_url.c_str());
variant_t flags(0x02u); // navNoHistory;
HRESULT hr = m_webBrowser->Navigate(url,
&flags, nullptr, nullptr, nullptr);
}
RECT PixelToHiMetric(const RECT& _rc)
{
static bool s_initialized = false;
static int s_pixelsPerInchX, s_pixelsPerInchY;
if(!s_initialized)
{
HDC hdc = ::GetDC(nullptr);
s_pixelsPerInchX = ::GetDeviceCaps(hdc, LOGPIXELSX);
s_pixelsPerInchY = ::GetDeviceCaps(hdc, LOGPIXELSY);
::ReleaseDC(nullptr, hdc);
s_initialized = true;
}
RECT rc;
rc.left = MulDiv(2540, _rc.left, s_pixelsPerInchX);
rc.top = MulDiv(2540, _rc.top, s_pixelsPerInchY);
rc.right = MulDiv(2540, _rc.right, s_pixelsPerInchX);
rc.bottom = MulDiv(2540, _rc.bottom, s_pixelsPerInchY);
return rc;
}
virtual void SetRect(const RECT& _rc)
{
m_objectRect = _rc;
{
RECT hiMetricRect = PixelToHiMetric(m_objectRect);
SIZEL sz;
sz.cx = hiMetricRect.right - hiMetricRect.left;
sz.cy = hiMetricRect.bottom - hiMetricRect.top;
m_oleObject->SetExtent(DVASPECT_CONTENT, &sz);
}
if(m_oleInPlaceObject != nullptr)
{
m_oleInPlaceObject->SetObjectRects(&m_objectRect, &m_objectRect);
}
}
// ----- IUnknown -----
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void**ppvObject) override
{
if(riid == __uuidof(IUnknown))
{ (*ppvObject) = static_cast<IOleClientSite*>(this); }
else if(riid == __uuidof(IOleInPlaceSite))
{ (*ppvObject) = static_cast<IOleInPlaceSite*>(this); }
else
{
return E_NOINTERFACE;
}
AddRef(); // implicit AddRef()
return S_OK;
}
virtual ULONG STDMETHODCALLTYPE AddRef( void) override
{
m_comRefCount++;
return m_comRefCount;
}
virtual ULONG STDMETHODCALLTYPE Release( void) override
{
m_comRefCount--;
return m_comRefCount;
}
// ---------- IOleWindow ----------
virtual /* [input_sync] */ HRESULT STDMETHODCALLTYPE GetWindow(
/* [out] */ __RPC__deref_out_opt HWND *phwnd) override
{
(*phwnd) = m_mainWindow;
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(
/* [in] */ BOOL fEnterMode) override
{
return E_NOTIMPL;
}
// ---------- IOleInPlaceSite ----------
virtual HRESULT STDMETHODCALLTYPE CanInPlaceActivate( void) override
{
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE OnInPlaceActivate( void) override
{
OleLockRunning(m_oleObject, TRUE, FALSE);
m_oleObject.QueryInterface(&m_oleInPlaceObject);
m_oleInPlaceObject->SetObjectRects(&m_objectRect, &m_objectRect);
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE OnUIActivate( void) override
{
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE GetWindowContext(
/* [out] */ __RPC__deref_out_opt IOleInPlaceFrame **ppFrame,
/* [out] */ __RPC__deref_out_opt IOleInPlaceUIWindow **ppDoc,
/* [out] */ __RPC__out LPRECT lprcPosRect,
/* [out] */ __RPC__out LPRECT lprcClipRect,
/* [out][in] */ __RPC__inout LPOLEINPLACEFRAMEINFO lpFrameInfo) override
{
HWND hwnd = m_mainWindow;
(*ppFrame) = NULL;
(*ppDoc) = NULL;
(*lprcPosRect).left = m_objectRect.left;
(*lprcPosRect).top = m_objectRect.top;
(*lprcPosRect).right = m_objectRect.right;
(*lprcPosRect).bottom = m_objectRect.bottom;
*lprcClipRect = *lprcPosRect;
lpFrameInfo->fMDIApp = false;
lpFrameInfo->hwndFrame = hwnd;
lpFrameInfo->haccel = NULL;
lpFrameInfo->cAccelEntries = 0;
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE Scroll(
/* [in] */ SIZE scrollExtant) override
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE OnUIDeactivate(
/* [in] */ BOOL fUndoable) override
{
return S_OK;
}
virtual HWND GetControlWindow()
{
if(m_controlWindow != nullptr)
return m_controlWindow;
if(m_oleInPlaceObject == nullptr)
return nullptr;
m_oleInPlaceObject->GetWindow(&m_controlWindow);
return m_controlWindow;
}
virtual HRESULT STDMETHODCALLTYPE OnInPlaceDeactivate( void) override
{
m_controlWindow = nullptr;
m_oleInPlaceObject = nullptr;
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE DiscardUndoState( void) override
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE DeactivateAndUndo( void) override
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE OnPosRectChange(
/* [in] */ __RPC__in LPCRECT lprcPosRect) override
{
return E_NOTIMPL;
}
// ---------- IOleClientSite ----------
virtual HRESULT STDMETHODCALLTYPE SaveObject( void) override
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE GetMoniker(
/* [in] */ DWORD dwAssign,
/* [in] */ DWORD dwWhichMoniker,
/* [out] */ __RPC__deref_out_opt IMoniker **ppmk) override
{
if((dwAssign == OLEGETMONIKER_ONLYIFTHERE) &&
(dwWhichMoniker == OLEWHICHMK_CONTAINER))
return E_FAIL;
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE GetContainer(
/* [out] */ __RPC__deref_out_opt IOleContainer **ppContainer) override
{
return E_NOINTERFACE;
}
virtual HRESULT STDMETHODCALLTYPE ShowObject( void) override
{
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE OnShowWindow(
/* [in] */ BOOL fShow) override
{
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE RequestNewObjectLayout( void) override
{
return E_NOTIMPL;
}
// ----- IStorage -----
virtual HRESULT STDMETHODCALLTYPE CreateStream(
/* [string][in] */ __RPC__in_string const OLECHAR *pwcsName,
/* [in] */ DWORD grfMode,
/* [in] */ DWORD reserved1,
/* [in] */ DWORD reserved2,
/* [out] */ __RPC__deref_out_opt IStream **ppstm) override
{
return E_NOTIMPL;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE OpenStream(
/* [string][in] */ const OLECHAR *pwcsName,
/* [unique][in] */ void *reserved1,
/* [in] */ DWORD grfMode,
/* [in] */ DWORD reserved2,
/* [out] */ IStream **ppstm) override
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE CreateStorage(
/* [string][in] */ __RPC__in_string const OLECHAR *pwcsName,
/* [in] */ DWORD grfMode,
/* [in] */ DWORD reserved1,
/* [in] */ DWORD reserved2,
/* [out] */ __RPC__deref_out_opt IStorage **ppstg) override
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE OpenStorage(
/* [string][unique][in] */ __RPC__in_opt_string const OLECHAR *pwcsName,
/* [unique][in] */ __RPC__in_opt IStorage *pstgPriority,
/* [in] */ DWORD grfMode,
/* [unique][in] */ __RPC__deref_opt_in_opt SNB snbExclude,
/* [in] */ DWORD reserved,
/* [out] */ __RPC__deref_out_opt IStorage **ppstg) override
{
return E_NOTIMPL;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE CopyTo(
/* [in] */ DWORD ciidExclude,
/* [size_is][unique][in] */ const IID *rgiidExclude,
/* [annotation][unique][in] */
__RPC__in_opt SNB snbExclude,
/* [unique][in] */ IStorage *pstgDest) override
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE MoveElementTo(
/* [string][in] */ __RPC__in_string const OLECHAR *pwcsName,
/* [unique][in] */ __RPC__in_opt IStorage *pstgDest,
/* [string][in] */ __RPC__in_string const OLECHAR *pwcsNewName,
/* [in] */ DWORD grfFlags) override
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE Commit(
/* [in] */ DWORD grfCommitFlags) override
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE Revert( void) override
{
return E_NOTIMPL;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE EnumElements(
/* [in] */ DWORD reserved1,
/* [size_is][unique][in] */ void *reserved2,
/* [in] */ DWORD reserved3,
/* [out] */ IEnumSTATSTG **ppenum) override
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE DestroyElement(
/* [string][in] */ __RPC__in_string const OLECHAR *pwcsName) override
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE RenameElement(
/* [string][in] */ __RPC__in_string const OLECHAR *pwcsOldName,
/* [string][in] */ __RPC__in_string const OLECHAR *pwcsNewName) override
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE SetElementTimes(
/* [string][unique][in] */ __RPC__in_opt_string const OLECHAR *pwcsName,
/* [unique][in] */ __RPC__in_opt const FILETIME *pctime,
/* [unique][in] */ __RPC__in_opt const FILETIME *patime,
/* [unique][in] */ __RPC__in_opt const FILETIME *pmtime) override
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE SetClass(
/* [in] */ __RPC__in REFCLSID clsid) override
{
return S_OK;
//return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE SetStateBits(
/* [in] */ DWORD grfStateBits,
/* [in] */ DWORD grfMask) override
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE Stat(
/* [out] */ __RPC__out STATSTG *pstatstg,
/* [in] */ DWORD grfStatFlag) override
{
return E_NOTIMPL;
}
private:
protected:
CComPtr<IOleObject> m_oleObject;
LONG m_comRefCount;
HWND m_mainWindow;
RECT m_objectRect;
CComPtr<IWebBrowser2> m_webBrowser;
CComPtr<IOleInPlaceObject> m_oleInPlaceObject;
HWND m_controlWindow;
};
//------------------------------------------------------------------------------
void EventLoop(HWND _mainWindow)
{
while(IsWindow(_mainWindow))
{
MSG msg;
if(GetMessage(&msg, nullptr, 0, 0) <= 0)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
int main(int argc, char* argv[])
{
OleInitialize(nullptr);
WNDCLASS wc;
memset(&wc, 0, sizeof(wc));
wc.lpszClassName = "MyWindowClass";
wc.lpfnWndProc = DefWindowProc;
wc.hCursor = ::LoadCursor(nullptr, IDC_ARROW);
RegisterClass(&wc);
HWND mainWindow = CreateWindow("MyWindowClass",
"My Window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT,
CW_USEDEFAULT, MAIN_WINDOW_WIDTH, MAIN_WINDOW_HEIGHT, nullptr,
nullptr, nullptr, nullptr);
RECT rc;
rc.left = (MAIN_WINDOW_WIDTH - HTML_WINDOW_WIDTH) / 2;
rc.top = (MAIN_WINDOW_HEIGHT - HTML_WINDOW_HEIGHT) / 2;
rc.right = rc.left + HTML_WINDOW_WIDTH;
rc.bottom = rc.top + HTML_WINDOW_HEIGHT;
wchar_t navUrl[MAX_PATH];
::GetCurrentDirectoryW(MAX_PATH, navUrl);
wcscat_s(navUrl, L"\\test.html");
EmbeddedBrowser* browser = new EmbeddedBrowser(mainWindow);
browser->SetRect(rc);
browser->Navigate(navUrl);
EventLoop(mainWindow);
ExitProcess(0);
return 0;
}
最佳答案
我知道这是一个相当古老的话题,但我遇到了完全相同的问题。
在我的例子中,错误是我在我的 Dialog 类中覆盖了 PreTranslateMessage(),但我没有调用 CDialog::PretranslateMessage(),而是从那里调用了 CWnd::PretranslateMessage()。
关于c++ - 嵌入式 web 控件 (IWebBrowser2),嵌入式 javascript 的 onkeydown 和 onkeyup 不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5904176/
我有一个几乎可以构建的Maven / Grails应用,但在web.xml上找不到[my-app]\webapp\WEB-INF\web.xml。但是目录结构像往常一样包含web-app文件夹,而不是
正如我在标题中提到的:我想知道 web-service 和 web-socket 之间的区别?我们什么时候使用每一个? 谢谢! 最佳答案 一个web service是一个响应客户端 SOAP/REST
让我们看一个示例场景: 客户端打开一个网站并找到他从文本框中输入的两个数字的总和。然后单击“添加”按钮。两个参数通过 HTTP GET 发送到服务器,在服务器上写入 PHP 代码以添加数字,结果为回声
我知道这是一个老问题,肯定已经被回答了数百次,但我还无法找到令人满意的答案。 我正在创建一个应用程序,其他应用程序(移动/网络)将使用该应用程序来获取数据。现在我有两个选择: 将我的应用程序创建为简单
通过 Web 作业部署新功能有 3 种方法: 创建一个新的 Web 应用,并部署一个包含该函数的 Web 作业。 向现有 Web 作业添加一项新函数(这样您现在在一个 Web 作业中就拥有了多个函数)
我收到来自网络场景的通知,上面写着“问题”和“确定”。我想在问题发生时包含网络响应的内容。我不担心标题值,只担心网页的内容. 这是我可以在通知设置中引用的变量吗? 最佳答案 不幸的是 zabbix 不
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
嗨,这是一个理论问题,但我真的无法弄清楚 Web 应用程序、基于 Web 的应用程序和基于云的应用程序之间的区别。这个你能帮我吗。 最佳答案 @Matt 是对的 - 这真的无关紧要,但是,为了清楚起见
我正在尝试使用多个 Web 服务,这些服务在它们的 wsdl 中重新定义了一些相同的公共(public)类。我目前在网站中引用了它们,但我想转换为 Web 应用程序。 由于一些相同的类是从多个 Web
一个。我必须考虑哪些事项?b.当前应用程序正在执行多个存储过程。如果我创建等效的方法来执行这些过程,会有什么风险或挑战。 最佳答案 在架构上,将网络应用程序转换为网络服务时必须考虑的一件事是,对方法和
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 5年前关闭。 Improve thi
网络 API 和网络服务之间有什么区别吗?或者它们是同一个吗? 最佳答案 网络服务通常提供 WSDL您可以从中自动创建客户端 stub 。 Web 服务基于 SOAP protocol 。ASP.NE
我已经获得了我需要的所有资源。我将 Web 服务放入应用程序服务环境中,然后将 NSG 连接到应用程序服务环境使用的子网。然后,我允许 VNET 内的应用程序与 Web 服务进行通信,但它无法正常工作
我已经获得了我需要的所有资源。我将 Web 服务放入应用程序服务环境中,然后将 NSG 连接到应用程序服务环境使用的子网。然后,我允许 VNET 内的应用程序与 Web 服务进行通信,但它无法正常工作
我正在使用 stub 将我的网络服务相关测试与实际网络服务隔离开来。 你/我应该如何合并测试以确保我制作的响应与实际的网络服务匹配(我无法控制它)? 我不想知道怎么做,而是何时何地? 我应该为测试数据
我在互联网上搜索了很多,但我仍然没有得到网络服务和网络 API 之间的明显区别?我在某处读到所有 Web 服务都是 API,但所有 API 都不是 Web 服务。如何? 我所知道的是两者都允许利用其他
假设我已经完成了使用 JavaEE 制作的 Web 应用程序。这个 Web 应用程序包含登录系统,但最后它是非常基本的 Web 应用程序。我使用的是 GlassFish 3.1.2.2。 我想知道一旦
我希望设计者能够打开与我相同的解决方案文件。这可以通过 Expressions Web 实现吗? 最佳答案 简短的回答是“不”;但这是一个非常常见的请求,我知道很多人都希望下一个版本(无论何时)对此有
我正在尝试在 CF10 中创建一个 Web 服务对象。我已验证它在 SoapUI 中按预期工作。但是,当我在 CF 中运行它时,我得到一个错误,它无法找到在 WSDL 的导入语句中导入的 XSD。这是
我的要求是开发一个 Web 服务,充当外部 Web 服务和客户端之间的中间人。 我知道,我可以为我的服务设计一个wsdl,然后将外部wsdl映射到代码中我的wsdl。我的问题是有一个开源 api/工具
我是一名优秀的程序员,十分优秀!