标签: sendmessage

为什么这个程序有时会崩溃,有时候不会崩溃?

以下程序关闭显示器.它有时会在我运行时崩溃,有时则不然.反汇编只是指向一个随机位置0x00011000,并且没有真实的信息.

如果我重新编译程序并运行它,重新编译的版本运行正常,而我正在测试它.但是下次我真的需要使用它时,它会再次崩溃,我需要重新编译它...让我后悔做这件事.

我不知道如何一致地重现错误.(也就是说,除了在最迫切需要它并且看着它崩溃时运行它.)

什么可能导致该程序中的随机崩溃?

#include <Windows.h>
#include <tchar.h>

int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    return SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Windows 7 x64,并将其编译为32位程序.我相信我已经尝试了64位同样的东西,并得到了相同的结果,虽然我不是100%肯定.


编辑1:

  • 如果有人真的复制了这个,请发表评论让我知道,我很好奇其他人是否可以重现这一点.

  • 我目前正在测试一个稍微修剪一下的版本(它不依赖于C运行时):

    #include <Windows.h>
    #pragma comment(linker, "/NoDefaultLib")
    #pragma comment(linker, "/Entry:mainCRTStartup")
    #pragma comment(linker, "/Subsystem:Windows")
    
    int mainCRTStartup()
    {
        return SendMessageW(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
    }
    
    /*
    Base64 version of this program, in case you want to use it:
    TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAAABkN3fRfGzjEXxs4xF8bOMhv7ujEbxs4xF8bKMRPGzjIb+0IxE8bOMhv7pjETxs4xSaWNoRfGzjAAAAAAAAAAAUEUAAEwBAQBYIgROAAAAAAAAAADgAA8BCwEHCgACAAAAAAAAAAAAAAgQAAAAEAAAACAAAAAAQAAAEAAAAAIAAAQAAAAAAAAABAAAAAAAAAAAIAAAAAIAAAAAAAACAAAEAAAQAAAQAAAAABAAABAAAAAAAAAQAAAAAAAAAAAAAAAoEAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAudGV4dAAAAHQAAAAAEAAAAAIAAAACAAAAAAAAAAAAAAAAAAAgAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYEAAAAAAAAGoCaHDxAABoEgEAAGj//wAA/xUAEEAA99gbwPfYw8zMUBAAAAAAAAAAAAAAaBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgQAAAAAAAAQgJTZW5kTWVzc2FnZVcAAFVTRVIzMi5kbGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
    */
    
    Run Code Online (Sandbox Code Playgroud)

    目前,这个版本有效...但是,当我重新编译它时,前一个版本也是如此.如果事实证明这个没有崩溃,我会在这里发布.

  • 如果您想重现这一点,我的建议是:编译程序,让它腌制一两天.:)当您使用计算机一段时间后,尝试运行该程序几次...当我尝试时,我通常会收到错误,直到我重新编译程序.


编辑2:

出于某种原因,每当你想向人们展示问题时,它就会神奇地得到解决.在这里同样的情况.我将继续尝试重现错误,但此刻,似乎工作正常.:\(我怀疑它可能是因为安装了Windows 7 SP1,但我真的很怀疑......如果我发现我会发布在这里.)

对不起这个人... …

winapi sendmessage

6
推荐指数
1
解决办法
856
查看次数

在 Chrome 扩展中使用 sendMessage 时丢失了 webkitMediaStream 对象类型

所以我试图从选项卡中捕获网络音频并将其传递到另一个与页面上的 DOM 元素一起使用的脚本中。

扩展脚本

在 中background.js,我使用以下脚本:

    chrome.tabCapture.capture(constraints, function(stream) {
        console.log("\ngot stream");
        console.log(stream);

        chrome.tabs.sendMessage(tabID, {
            "message": "stream",
            "stream": stream
        });
    });
Run Code Online (Sandbox Code Playgroud)

Developer Toolkit 向我展示了创建的对象确实是一个 MediaStream 对象。(我想要并且似乎工作正常)。

扩展控制台:

MediaStream {onremovetrack: null, onaddtrack: null, onended: null, ended: false, id: "c0jm4lYJus3XCwQgesUGT9lpyPQiWlGKHb7q"…}

内容脚本

我在页面本身上使用内容脚本(注入),然后将 JSON 序列化对象拉回:

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.message === "stream") {
    var thisStream = request.stream;
    console.log(thisStream);
    if (!thisStream) {
      console.log("stream is null");
      return;
    }    
    loadStream(thisStream);
  }
  else if (request.message === "statusChanged") {
    console.log("statusChanged");
  }
});
Run Code Online (Sandbox Code Playgroud)

页面控制台

不幸的是,由于 JSON 序列化,对象类型丢失了: …

javascript json casting sendmessage google-chrome-extension

6
推荐指数
1
解决办法
1855
查看次数

如何在控制台应用程序中注册 WndProc

当我创建一个新的 Win32 应用程序时,我注意到了这个函数:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
Run Code Online (Sandbox Code Playgroud)

当某处调用函数PostMessage或 SendMessage时会收到消息,我注意到函数 WndProc 可以接收消息,因为有一个函数注册它:

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SCREENCAPTURE));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_SCREENCAPTURE);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex);
}
Run Code Online (Sandbox Code Playgroud)

注意: wcex.lpfnWndProc = WndProc;

我想了解 PostMessage() 的机制以及如何接收它,所以我创建了一个 C++ 控制台应用程序,看看我是否可以注册函数 WndProc,这是我的尝试代码:

LRESULT …
Run Code Online (Sandbox Code Playgroud)

c++ windows postmessage console-application sendmessage

6
推荐指数
1
解决办法
4112
查看次数

多次触发 Chrome 扩展程序消息

我正在制作我的第一个 chrome 扩展,并注意到从我的 popup.html 页面发送的消息在我的 content.js 消息事件侦听器中被复制。我在每条消息发送之前控制台记录了“发送消息”,在每条消息之前记录了“消息接收”,我不明白这些消息是如何被复制的。我还检查了sendMessageonMessage的 chrome 开发文档,它指定 onMessage 侦听器应该只在每个 sendMessage 事件触发一次。

任何帮助,将不胜感激。

弹出窗口.html

<!DOCTYPE html>
<html>
<head>
    <title>Messaging Practice</title>
</head>
<body>
    <h1>Messaging Practice</h1>

    <input type="button" id="send-message" value="Button">
    <script src="popup.js"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

内容.js

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
        console.log('message received')
        console.log(request);
    }
);
Run Code Online (Sandbox Code Playgroud)

弹出窗口.js

var messageButton = document.querySelector("#send-message");

messageButton.onclick = function() {
    chrome.tabs.query({currentWindow: true, active: true},
    function(tabs) {
        chrome.tabs.executeScript(
            tabs[0].id, {file: "content.js"}
        )
        console.log("sending message")
        chrome.tabs.sendMessage(tabs[0].id, "string message")
    });
}
Run Code Online (Sandbox Code Playgroud)

背景.js

chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
  chrome.declarativeContent.onPageChanged.addRules([{ …
Run Code Online (Sandbox Code Playgroud)

javascript google-chrome sendmessage google-chrome-extension

6
推荐指数
1
解决办法
1623
查看次数

某些机器人的电报sendMessage太慢了

我有两个电报机器人,上次我注意到,第二个机器人变慢了.

我的研究表明,sendMessage调用有两个不同的时间.

curl "https://api.telegram.org/bot123456789:AAAAAAAAABBBBBBBBCCCCCCC/sendMessage?chat_id=987654321&text=HI"
Run Code Online (Sandbox Code Playgroud)

这是两个不同机器人的输出:

拨打第一个(快速)

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   224  100   224    0     0    491      0 --:--:-- --:--:-- --:--:--   492
Run Code Online (Sandbox Code Playgroud)

呼叫第二个机器人(慢)

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   227  100   227    0     0     43      0  0:00:05  0:00:05 --:--:--    59
Run Code Online (Sandbox Code Playgroud)

第一个sendMessage立即运行.

第二个时间花费= 5秒!

它总是2-6秒.有谁知道原因?

对不起我的英语不好.

curl sendmessage telegram telegram-bot

6
推荐指数
1
解决办法
863
查看次数

Qt中MFC等效的SendMessage

在QT中移植VS2010项目.

我想,我对之前的帖子不太清楚,所以我在这里再解释一下.

问题是..我有很多子Qdialog窗口,当用户点击生成一些消息.我希望这些消息在我的主应用程序窗口的QTablewidget上.
现在正如一些成员所建议的,我应该看看VS2010中的事情是如何完成的,并尝试在QT中复制相同内容.所以这是我的设计..请让我知道你的建议/批评.

1)vs 2010 - >在主应用程序窗口中

MESSAGE_MAP
Run Code Online (Sandbox Code Playgroud)

我们有

ON_MESSAGE( WM_NOTICE, OnAddMessage )
Run Code Online (Sandbox Code Playgroud)
  • WM_NOTICE = WM_USER + 1;

在QT中做同样的事情我需要信号和插槽.所以有点像

connect( sender , SIGNAL(QtSingleApplication::messageReceived ( const QString &message )  ) , this , SLOT ( on_add_message( const QString & message ) );
Run Code Online (Sandbox Code Playgroud)

现在我该替换什么呢

  • '发件人'?在我的情况下谁将成为发件人?
  • SIGNAL(QtSingleApplication :: messageReceived)是对的吗?
  • 插槽 - 这里没有问题..我可以实现该代码,我将在排序顺序中将消息放在QTable widegt中.

2)现在,如果我查看在VC++中开发的现有项目的内部QDialog窗口源代码,它们就像是

void Message_information::add( const SMS& message )
{
//SMS is a  structure  and fields are SYSTEMTIME, Enum , CString
 CCriticalSection critical_section;
CSingleLock   lock( &critical_section, true );
messages_.insert( message ); …
Run Code Online (Sandbox Code Playgroud)

qt mfc sendmessage

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

chrome 扩展: chrome.tabs.sendmessage 正在向所有选项卡发送消息,即使指定了 tabId

我实现这个的方式有错误吗?我正在打开一个新选项卡,然后向该选项卡发送消息,但是所有其他具有侦听器的选项卡也会收到该消息。

在 background.js 中:

chrome.tabs.create({url:chrome.extension.getURL("placement.html")},function(tab){
    chrome.tabs.sendMessage(tab.id, {
        "name":"name",
        "payload":payload
    });
});
Run Code Online (Sandbox Code Playgroud)

在placement.js 中(在加载placement.html 时运行):

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    if (request.name == "name") {
        payload = request.payload;
    }
});
Run Code Online (Sandbox Code Playgroud)

我看到每当创建一个新选项卡时,有效负载都会发送到所有具有此 onMessage 侦听器的选项卡。这段代码相对较旧,所以我不确定最近是否有什么变化影响了 chrome.tabs.sendMessage 解释“tab.id”的方式。任何帮助表示赞赏!

javascript tabs google-chrome sendmessage google-chrome-extension

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

跨进程PostMessage、UIPI限制和UIAccess=”true”

出于安全原因,我的应用程序的 UI 模块以high 强制完整性级别运行。除了一件事之外,其中的所有内容都运行良好。为了与旧版本兼容,我需要能够让用户向 UI 模块发出命令行调用。

目前该机制的工作原理如下:

  1. Windows 资源管理器中的快捷方式调用我的模块,如下所示:

    path-to-module\module.exe -op="a, s, r"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 当进程解析此命令行时,它会使用FindWindow通过其唯一的类名来module.exe定位正在运行的 UI 模块副本(或自身的另一个副本) 。然后,它使用PostMessage API 向其发送注册消息

  3. 然后,正在运行的 UI 模块(具有high完整性级别)在收到消息时会相应地对其进行处理。

问题在于,由于UI模块的运行副本具有high完整性级别,因此它无法接收来自较低完整性级别的消息,或者当Windows资源管理器运行该模块的副本以解析快捷方式命令时,它无法接收来自较低完整性级别的消息,这使得它以medium完整性级别运行等级。

为了解决这个问题,我找到了这个UIAccess标志(请参阅此处,然后向下滚动到“ UIAccess for UI Automation applications ”。)

所以我的假设是,如果我设置此标志并对我的 UI 模块进行代码签名:

在此输入图像描述

它将能够绕过我上面描述的 UIPI 限制。

它运行得很好:

在此输入图像描述

但我看到的是,PostMessage当我从以完整性级别运行的模块调用它时,我上面描述的算法中的 API 仍然失败,并显示 ERROR_ACCESS_DENIED medium

我在那里错过了什么?

c++ windows winapi sendmessage uipi

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

获取RegisterWindowMessage注册的消息名称

我正在调试一个旧的应用程序,其中 WndProc 被覆盖。我收到一条 ID=0xC1B0 的消息,这意味着根据这篇msdn 文章,这是一条系统范围内的唯一消息。

正如 microsoft 所描述的RegisterWindowMessage(...),相同的字符串参数会产生相同的消息 ID。因此,message-id 和参数之间存在唯一的链接。

我现在的问题是:如果我有消息 ID,是否有可能获取参数?如果是,这可能会帮助我找到消息的来源。

sendmessage windows-messages

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

有时无法访问配对手表模拟器上的 WatchConnectivity 会话

我有一个 iOS 应用程序,可以使用 WatchConnectivity 与配对的手表进行通信。在大多数情况下,它在模拟器和设备上都可以正常运行。

问题:

在模拟器的开发过程中,当我尝试使用以下命令从 iOS 向 watchOS 发送直接消息时,时不时会出现以下通信错误WCSession.default.sendMessage(_:replyHandler:errorHandler:)

Error Domain=WCErrorDomain Code=7007  
"WatchConnectivity session on paired device is not reachable."
Run Code Online (Sandbox Code Playgroud)

我已经阅读了这篇相关文章,但它不适用于我的情况,因为我的应用程序可以正常工作。

我的问题:

当应用程序在 iOS 模拟器上运行时,手表模拟器怎么会变得无法访问?过一段时间
重试有意义吗? 有什么解决方法吗?sendMessage

sendmessage reachability ios watchos watchconnectivity

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