RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 735949
Accepted
koshachok
koshachok
Asked:2020-10-26 05:14:30 +0000 UTC2020-10-26 05:14:30 +0000 UTC 2020-10-26 05:14:30 +0000 UTC

向另一个应用程序发送消息

  • 772

有 2 个具有几乎相同代码的独立应用程序。在其中一个中,我们生成一条消息(通过单击鼠标),并与该消息一起发送指向该结构的指针。

问题:如何从一个应用程序发送消息,并在没有蓝屏的情况下拦截另一个应用程序。

已经尝试过的:

//Высылаемая структура, есть глобальный объект структуры - ball
struct ballXY
{
    bool state;
    int azaz;
};
ballXY ball = {false, 666};
// а так же message для нашей структуры
const UINT ball_msg = RegisterWindowMessage((LPCWSTR)("ball"));

该函数CALLBACK看起来像这样:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    if (message == ball_msg)
    {
        ball = *(ballXY*)lParam;
        return 0;
    }
    switch (message)
    {
    case WM_PAINT:
        //рисуем тут
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_LBUTTONDOWN:
        if (!ball.state)
            ball.state = true;
        break;
    case WM_TIMER:
        if (ball.state) {
            SendMessage(HWND_BROADCAST, ball_msg, NULL, (LPARAM)&ball);
            ball.state = false;
        }
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }
    return 0;
}

底线:启动了 2 个应用程序后,我将鼠标右键合为一个 - 资源管理器被涂掉了,一些程序被关闭了。

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Arhadthedev
    2020-10-26T17:38:27Z2020-10-26T17:38:27Z

    对于处理器间数据传输,Windows API 提供了两种简单的方法:

    1. 命名管道。尽管我在对问题的评论中建议了这种方法,但它充满了一个致命的困难。如果传输应用程序崩溃,谁将关闭通道?既然频道是共享的,那么就没有人- 会有全球资源的泄漏。

    2. 发送窗口消息WM_COPYDATA。此消息是少数几个由具有特殊权限的窗口子系统处理的消息之一,因此其中指定的字节块将被小心地复制到接收者的地址空间中。

      使用这种方法,代码将如下所示:

      • 发送消息:

        struct BallXY
        {
            bool state;
            int azaz;
        };
        
        // =================
        
        void sendBallState(BallXY& ball, HWND hParent)
        {
            // Перебираем все окна-получатели и рассылаем им обновлённые данные
            HWND hDestWnd = NULL;
            bool continueIteration = true;
            while(continueIteration)
            {
                hDestWnd = FindWindowEx(
                    /* hwndParent      */ NULL,
                    /* hwndChildAfter  */ hDestWnd,
                    /* lpszClass       */ TEXT("оконный_класс_получателя"),
                    /* lpszWindow      */ NULL);
                if(hDestinationWnd)
                {
                    COPYDATASTRUCT cds;
                    cds.dwData = 0; // Любой идентификатор; передаётся получателю как есть
                    cds.cbData = sizeof(ball);
                    cds.lpData = &ball;
                    SendMessage(hDestWnd, WM_COPYDATA, (WPARAM)hParent, (LPARAM)&cds);
                }
                else
                    continueIteration = false;
            }
        }
        
      • 窗口程序:

        static void onCopyData(HWND hWnd, HWND hSourceWnd, PCOPYDATASTRUCT cds)
        {
            UNREFERENCED_PARAMETER(hWnd);
            // Проверяем по размеру данных, что они хотя бы примерно похожи на наши
            if(cds->cbData == sizeof(BallXY))
            {
                // Проверяем, что отправитель — подконтрольное нам окно
                TCHAR sourceClassName[256]; // Длина гарантирована MSDN
                GetClassName(hSourceWnd, sourceClassName, sizeof(sourceClassName));
                if(lstrcmp(sourceClassName, TEXT("оконный_класс_отправителя")) == 0)
                {
                    // Безопасно преобразуем типы, избегая неопределённого поведения
                    memcpy(&ball, cds->lpData, sizeof(ball));
                }
        }
        
        static void onTimerTick(HWND hWnd, UINT uTimerId)
        {
            UNREFERENCED_PARAMETER(uTimerId);
            if(ball.state)
            {
                sendBallState(ball, hWnd);
                ball.state = false;
            }
        }
        
        LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
        {
            // Забываем про развесистые switch-case и пользуемся вместо этого удобными
            // message crackers из windowsx.h
            switch(message)
            {
                HANDLE_MSG(hWnd, WM_COPYDATA, onCopyData);
                HANDLE_MSG(hWnd, WM_TIMER, onTimerTick);
                // ...
        
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        
    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5