我有一个C++/MFC应用程序,我需要重组.该应用程序用于处理大部分在主线程中的数据,从而阻断输入,现在我想改变它的话,所有的GUI更新是通过PostMessage的完成.
不幸的是,我似乎找不到如何实现这一目标的良好来源.
现在我正在考虑创建一个优先级队列,使用临界区保护,一个处理此队列的工作线程(while(true)),以及将数据指针发送到主线程的PostMessage机制.
使用这种方法让我害怕的是PostMessage根本不能保证到达主线程,所以,如果我理解正确,就有可能发生内存泄漏.
第二个问题是另一个应用程序可以向我的应用程序发送自定义消息,我的应用程序可能会尝试取消引用WPARAM或LPARAM作为指针,从而导致AV.
有谁知道这些任务的最佳实践是什么?
数据可以是用于Web控件的HTML内容,也可以是列表框,下拉列表等的其他内容.
我试图在HTML5中控制另一个窗口.我喜欢它,所以当我打开一个我登录的窗口,然后我登录的另一个窗口,然后从一个窗口我可以单击一个按钮,其他窗口中会发生一些事情.我不知道从哪里开始; 有人能指出我正确的方向吗?
CORS和跨域消息传递对我来说看起来是一样的:它们允许跨域通信.
是否有任何理由使用一个与另一个?
我正在考虑直接使用window.postMessage进行跨域通信.
如果我做:
postMessage() 来自父框架window.addEventListener("message", callback, false); 来自孩子的iframe我在加载iframe之前发布的消息何时会被执行?他们保证会被执行吗?有定时保证吗?
我想从顶部框架传递一个影响子框架初始化的参数.
我正在构建一个执行大量客户端数据下载和处理的应用程序.通过在驻留在子域上的iframe中处理,数据处理与主应用程序隔离.这是iframe下载数据.通过postMessage进行通信.
一切都很好,除了它可能会更好.
如果用户打开额外的选项卡/窗口,应用程序当前会重新加载所有数据,甚至可能会执行重复的处理工作,这不是一个问题,除了它减慢了所有内容并且页面加载时间更长.
我想要做的是让每个顶级选项卡/窗口只与一个处理iframe通信,如果原始窗口关闭,可以恢复.问题是,这些不是通过javascript打开,而是通过普通的浏览器方法打开标签中的链接,所以我无法获得发送消息所需的iframe的引用.
无论如何我可以将iframe的窗口引用传递给其他选项卡,以便它们可以通过postMessage与它通信吗?这可以通过共享工作者实现吗?
我意识到我可以将共享工作者用于整个处理任务,但这会产生问题,因为数据来自第三方域,无法从工作人员中访问.
只需要与所有主流浏览器的最新版本兼容.
编辑:我刚刚发现在Firefox中尚未实现SharedWorker,所以我想这不会起作用.我可以通过其他方式实现这一目标吗
编辑2:我发现你可以使用:
var win = window.open('', 'my_window_name');
Run Code Online (Sandbox Code Playgroud)
从任何其他窗口捕获对iframe的引用.但是,如果iframe尚不存在,则会将其作为窗口打开.即使它立即关闭,也会导致闪烁并导致"弹出窗口被阻止"消息,使其无法使用.
我有两个应用程序需要通过PostMessage进行通信(排除了SendMessage,因为我需要让第二个应用程序能够在被调用时输出到Excel.
到目前为止,应用程序1调用应用程序2,确保它是打开的,当它被启用时,应用程序1被设置为禁用.
当用户与完成应用2我需要将消息发送回给Applciation 1,以允许其解锁.
我在每个应用程序中注册了相同的Windows消息:
const
MyMessage = 'My-Message';
var
MyMessageID: cardinal;
procedure TMF.FormCreate(Sender: TObject);
begin
MyMessageID := RegisterWindowMessage(MyMessage);
end;
Run Code Online (Sandbox Code Playgroud)
在应用程序2中,我可以使用以下命令将消息发布到应用程序1
targetHandle := FindWindow(Pchar('TMF'), Pchar('Send Test'));
...
if PostMessage(targetHandle, (MyMessageID), 0, 0) then
...
Run Code Online (Sandbox Code Playgroud)
我不明白的是我如何在应用程序1中声明消息处理程序.
如果我使用标准的Windows消息,例如WM_COPYDATA,我会声明一个过程
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
Run Code Online (Sandbox Code Playgroud)
但这种情况有所下降,因为我无法MyMessageID及早宣布.
也许是因为这是星期五下午,但我错过了什么?
我需要能够将Chrome应用程序中的postMessage通过webview发送到主页并返回.
我已经将Chrome应用程序中的PostMessage建立到主页,并且主页也捕获了PostMessage,并且发回了新的PostMessage,但Chrome应用程序未捕获此PostMessage回复.
我可以看到Chrome-App API上有可能:
访客将能够通过在收到的消息事件上向event.source发送消息来向嵌入者发送回复.
所以问题是我无法让Chrome应用程序从主页上收到回复,即使我使用event.source.postMessage('',event.origin)发送回复.是window.addEventListener('message',messageHandler,false); 在background.js结尾错了?
我在下面包含了我的代码:
background.js(初始化Chrome应用):
var myAppWin = null;
var webview = null;
chrome.app.runtime.onLaunched.addListener(function() {
// Center window on screen.
var screenWidth = screen.availWidth/2;
var screenHeight = screen.availHeight;
var chromeWindow = chrome.app.window.create('webview-embed.html', {
id: "helloWorldID",
bounds: {
width: screenWidth,
height: screenHeight,
}
}, function(win) {
myAppWin = win;
myAppWin.contentWindow.addEventListener('DOMContentLoaded', function() {
webview = myAppWin.contentWindow.document.getElementById('webview');
try{
webview.addEventListener("contentload", function () {
console.log("webview content is now loaded");
try{
console.log("Trying to post message");
webview.contentWindow.postMessage("Message from Chrome APP!", "*");
}catch(error){ …Run Code Online (Sandbox Code Playgroud) 我有一个基于iframe的小部件,它使用postMessage与父级进行通信.这意味着即我从iframe发送消息以请求调整其自身的大小.数据是json,目前正在干扰父页面上其他小部件/脚本发送的消息.
所以我需要一种方法来区分我自己的消息和其他消息.
现在我正在考虑简单地添加一个{ app: 'Poules.com', [...] }参数并在处理消息之前检查该参数.
但在此之前:是否已经有任何已建立的合同?
发送代码:
parent.postMessage( JSON.stringify(data), page.widgetOrigin );
Run Code Online (Sandbox Code Playgroud)
接收结束:
poules.sdk.receiveMessage = function(event)
{
var data = JSON.parse( event.data );
switch ( data.message )
{
case 'requestResize': poules.sdk.requestResize( data ); break;
case 'loginSuccess': poules.sdk.triggerLoginEvent( data ); break;
default: throw "poules.sdk: can't parse message: " + event.data;
};
}
Run Code Online (Sandbox Code Playgroud) 当使用通配符作为postMessage()方法的targetOrigin时,我很难理解安全问题.你调用postMessage()的窗口是否已经有我们发送数据的原点?怎么会有人干涉?使用window.location.origin?将targetOrigin设置为窗口的原点是不是很糟糕?
我明白检查在接收端的事件起源(如图所示的重要性在这里),但我似乎无法换我的头周围为什么它是坏的发送端使用通配符作为targetOrigin当窗口已经有特定的起源.
我有此代码,已将MessageEvent的原点设置为*,但控制台仍提示阻止原点为“ AAAA”的框架访问原点为“ BBBB”的框架。协议,域和端口必须匹配。有人知道为什么吗?
var size = {
width: document.body.scrollWidth,
height: document.body.scrollHeight
}
var evt = new MessageEvent("dimensionMessage",{
"data": size,
"origin":"*"
});
window.parent.dispatchEvent(evt);
Run Code Online (Sandbox Code Playgroud)
但是,如果使用window.parent.postMessage(size, "*"),它会起作用。
postmessage ×10
javascript ×8
cross-domain ×3
html5 ×2
c++ ×1
cors ×1
delphi ×1
mfc ×1
security ×1
webview ×1
winapi ×1
xss ×1