标签: postmessage

MFC数据通过PostMessage转发到主线程

我有一个C++/MFC应用程序,我需要重组.该应用程序用于处理大部分在主线程中的数据,从而阻断输入,现在我想改变它的话,所有的GUI更新是通过PostMessage的完成.

不幸的是,我似乎找不到如何实现这一目标的良好来源.

现在我正在考虑创建一个优先级队列,使用临界区保护,一个处理此队列的工作线程(while(true)),以及将数据指针发送到主线程的PostMessage机制.

使用这种方法让我害怕的是PostMessage根本不能保证到达主线程,所以,如果我理解正确,就有可能发生内存泄漏.

第二个问题是另一个应用程序可以向我的应用程序发送自定义消息,我的应用程序可能会尝试取消引用WPARAM或LPARAM作为指针,从而导致AV.

有谁知道这些任务的最佳实践是什么?

数据可以是用于Web控件的HTML内容,也可以是列表框,下拉列表等的其他内容.

c++ mfc postmessage visual-studio-2010

5
推荐指数
1
解决办法
9395
查看次数

如何在HTML5中控制另一个窗口?

我试图在HTML5中控制另一个窗口.我喜欢它,所以当我打开一个我登录的窗口,然后我登录的另一个窗口,然后从一个窗口我可以单击一个按钮,其他窗口中会发生一些事情.我不知道从哪里开始; 有人能指出我正确的方向吗?

javascript html5 postmessage

5
推荐指数
1
解决办法
8131
查看次数

CORS优于跨域消息传递

CORS和跨域消息传递对我来说看起来是一样的:它们允许跨域通信.

是否有任何理由使用一个与另一个?

javascript postmessage cross-domain cors

5
推荐指数
1
解决办法
4843
查看次数

我可以与window.postMessage进行同步跨域通信吗?

我正在考虑直接使用window.postMessage进行跨域通信.

如果我做:

  1. postMessage() 来自父框架
  2. 加载iframe
  3. window.addEventListener("message", callback, false); 来自孩子的iframe

我在加载iframe之前发布的消息何时会被执行?他们保证会被执行吗?有定时保证吗?

我想从顶部框架传递一个影响子框架初始化的参数.

javascript html5 postmessage cross-domain

5
推荐指数
1
解决办法
6512
查看次数

在同一域上的不同窗口之间进行通信

我正在构建一个执行大量客户端数据下载和处理的应用程序.通过在驻留在子域上的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尚不存在,则会将其作为窗口打开.即使它立即关闭,也会导致闪烁并导致"弹出窗口被阻止"消息,使其无法使用.

javascript postmessage

5
推荐指数
1
解决办法
1749
查看次数

Delphi:如何从PostMessage接收自定义Windows消息?

我有两个应用程序需要通过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及早宣布.

也许是因为这是星期五下午,但我错过了什么?

delphi winapi postmessage

5
推荐指数
1
解决办法
3829
查看次数

使用PostMessage在Chrome-app和主页之间进行通信

我需要能够将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)

javascript postmessage webview google-chrome-app

5
推荐指数
1
解决办法
3675
查看次数

在onmessage事件处理程序中是否有标准的方法来识别自己的postMessage?

我有一个基于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)

javascript postmessage

5
推荐指数
1
解决办法
183
查看次数

为什么使用'*'作为postOessin的postOessin存在安全风险?

当使用通配符作为postMessage()方法的targetOrigin时,我很难理解安全问题.你调用postMessage()的窗口是否已经有我们发送数据的原点?怎么会有人干涉?使用window.location.origin?将targetOrigin设置为窗口的原点是不是很糟糕?

我明白检查在接收端的事件起源(如图所示的重要性在这里),但我似乎无法换我的头周围为什么它是坏的发送端使用通配符作为targetOrigin当窗口已经有特定的起源.

javascript security xss postmessage cross-domain

5
推荐指数
1
解决办法
1671
查看次数

就源策略而言,postMessage()和dispatchEvent()之间有什么区别?

我有此代码,已将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, "*"),它会起作用。

javascript postmessage dispatchevent

5
推荐指数
1
解决办法
2205
查看次数