【问题标题】:Broadcast message between two different users两个不同用户之间的广播消息
【发布时间】:2012-11-18 14:39:41
【问题描述】:

我正在尝试将自定义消息从提升的设置(在 Windows 7 上)发送到用 C# 编写的正在运行的应用程序。
不幸的是,在 C# 应用程序中从未收到此消息。
这是因为安装程序和应用程序在不同的用户下运行吗? 我该如何解决这个问题?

为了方便:

// --- C# code ---

    private const int WM_CUSTOM_CLOSE = 0x400 + 0x500;
    private const int CUSTOM_CLOSE_WPARAM = 0x1;
    private const int CUSTOM_CLOSE_LPARAM = 0x2;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_CUSTOM_CLOSE)
        {
            int wp = m.WParam.ToInt32();
            int lp = m.LParam.ToInt32();
            if (wp == CUSTOM_CLOSE_WPARAM && lp == CUSTOM_CLOSE_LPARAM)
            {
                Debug.WriteLine("Close application");
                Close();
            }
        }
        base.WndProc(ref m);
    }

// --- INNO SETUP code ---

    const 
      WM_USER = $400;
      WM_CUSTOM_CLOSE = WM_USER + $500;
      WM_CUSTOM_WPARAM = $1;
      WM_CUSTOM_LPARAM = $2;
    function InitializeSetup(): Boolean;
    begin
      SendNotifyMessage(HWND_BROADCAST, WM_CUSTOM_CLOSE, 
                        WM_CUSTOM_WPARAM, WM_CUSTOM_LPARAM);
    end;

【问题讨论】:

  • 我遇到了类似的问题...我的解决方法是:我已经打开了一个命名管道用于程序间通信,并在那里添加了一条控制消息以关闭我的应用程序...从 inno-setup 我用一个不会启动整个应用程序的参数调用我安装的 prog exe,但连接到命名管道并告诉另一个实例退出 ...
  • @DarkSquirrel42:你能举个例子吗? Inno Setup 下的命名管道对我来说是一场噩梦。谢谢
  • 我也想过使用在我的应用程序中创建并在设置中设置的手动重置事件,但我不知道如何在 InnoSetup 中使用 OpenEvent...
  • 我会尝试发送一个注册消息(RegisterWindowMessage 双方)。
  • 不要在 inno-setup 中尝试命名管道......在你正在运行的应用程序中,你监听命名管道......并且在同一个应用程序中,实现一个将绕过正常的启动参数应用程序启动,而是连接到正在侦听的正在运行的实例,并传输退出消息...从 inno 设置中,您所要做的就是启动正在运行的应用程序的新实例,但带有参数

标签: c# inno-setup broadcast sendmessage


【解决方案1】:

没有真正的“解决方案”,而是一种解决方法......

在运行程序中实现对特殊启动参数的处理

如果使用该参数启动,程序应该跳过所有正常启动并连接到正在运行的实例中等待的命名管道/手动重置事件,并通知该实例关闭

根据您的设置,您需要做的就是使用该特殊参数启动程序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多