【问题标题】:How to activate already opened application when user tries to run it for the second time?当用户第二次尝试运行已打开的应用程序时,如何激活它?
【发布时间】:2016-08-20 19:12:06
【问题描述】:

我正在使用 Mutex 将我的应用程序限制为一个实例。这是代码:

HANDLE hMutex;
hMutex = CreateMutex(NULL, FALSE, "MyTestApp");

if(hMutex == NULL)
    ShowMessage(GetLastError());
else
    if(GetLastError() == ERROR_ALREADY_EXISTS)  {
        ShowMessage("Application already running!");
        // activate already running instance ?!
     return -1;
    }

我想扩展它以激活已经运行的实例。怎么做?谢谢。

【问题讨论】:

  • “激活”是什么意思?如果它已经在运行,它不是已经激活了吗?
  • 也许得到一个 HWND 和SetForegroundWindow?在这种情况下,您可以使用EnumWindows
  • @Galik 通过“激活”我的意思是已经运行的实例显示在屏幕上,即使它可能被最小化等等。
  • @user9000 我想到了,但是新的和已经运行的实例具有相同的标题,这在枚举时可能会出现问题。
  • @Tracer 那么你可以比较 HWND 吗?

标签: c++ c++builder vcl


【解决方案1】:

假设它是 Win32 应用程序: 1) 将FindWindow 函数与您的窗口名称及其提供的类名称一起使用。 2) 使用 SetForegroundWindow 并返回 HWND FindWindow

【讨论】:

  • 新的和已经运行的实例具有相同的标题,这是枚举窗口时的问题。
  • 每次运行新实例时,检查是否已经存在同名的实例。如果是这样,请使其与众不同,例如在字符串中添加一个数字,表示窗口/窗口类的名称。 (std 的 stoi 可能很有用)。
  • 只是一个想法,在我看来不是很理性的方式。
  • 其实在注册课之前,它怎么会有名字呢?
  • 让新实例在创建其 UI 之前进行枚举,然后枚举将找不到重复的窗口标题。
【解决方案2】:

一旦您确定没有其他应用程序实例正在运行,请重载主窗体的 WndProc 处理唯一消息(例如 const unsigned int myMsgId = WM_USER + 100;),或者您可以使用 RegisterWindowMessage。当应用程序的第二个实例启动时,在创建主窗体之前使用该消息标识符PostMessage(NULL, myMsgId, 0, 0) 广播一条消息并退出。应用程序的第一个实例可以对其做出反应,并使用BringWindowToTop 将其自身带到前台(如果可能,由于明显的原因,vista 及更高版本不允许这样做)。如果不允许将应用置于前台,则应用的状态栏图标将开始闪烁以引起用户的注意。

山姆

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    相关资源
    最近更新 更多