【问题标题】:Switch Focus between Cmd windows, Force focus (keep 1 instant of program running)在 Cmd 窗口之间切换焦点,强制焦点(保持程序运行 1 瞬间)
【发布时间】:2009-08-03 08:32:25
【问题描述】:

我正在创建一个简单的 windows cmd 程序,并且我试图确保它只运行一次(如果你双击 exe 文件,只会显示一个实例.. 所以在我的代码中..我添加了一个命名互斥锁(名称是 GUID)..如果程序的第二个实例已启动,它会显示消息告诉您,您已经有一个实例正在运行..

我想做的是升级代码。因此,它不会向您显示消息,而是会自动找到已经运行的进程(窗口),将焦点切换到它,然后自行关闭。

现在我正在尝试使用

 FindWindow(NULL,window_name);
 SetForegroundWindow(window);

但是,当我(从任务管理器)传递窗口名称时,它没有找到它! 错误说:未使用:S 这很奇怪, 我什至尝试使用任务管理器名称来代替..它仍然找不到它!

所以有人可以指出我,我哪里出错了? :) 另外,如果你能想到任何其他方法来完成这样的任务,请告诉我..

注意:工作中的一些朋友告诉我使用 enumwindows,这是一个不错的选择(我目前正在阅读它)... 非常感谢!

【问题讨论】:

    标签: c++ winapi cmd mutex


    【解决方案1】:

    这是一篇关于这个主题的优秀文章http://delphi.about.com/od/windowsshellapi/l/aa100703c.htm

    控制应用实例的数量

    Zarko Gajic - About.com Delphi 编程指南

    在本文中,您将学习如何 “一次性启用”一个 Delphi 可以检查其的应用程序 前一个(正在运行的)实例。沿着 这个过程,几种技术 实施这样的检查将是 讨论过;以及如何携带 您已经运行的应用程序 前台,如果用户尝试 运行它“再一次”。到年底 这篇文章你将有一个复制到去 代码来控制你的行为 应用程序的多个实例: 可以选择限制数量 运行实例。

    提供的解决方案是用 Delphi 编写的,但代码很容易理解,应该很容易翻译成 C++。

    【讨论】:

    • 我之前已经找到了那个教程,一点帮助都没有/跨度>
    • 嗯,这正是文章所说的 FindWindow 方法的可靠性。在许多情况下,您最终可能不会检查窗口标题上显示的非常准确的文本。所以,这篇文章提出了几个替代方案,你看过了吗?
    【解决方案2】:

    您需要的是一个单例应用程序。这方面的例子很多。多年前,我的一个朋友在另一个网站上写了一篇文章。现在可能有更好的方法可以做到,但here是他的文章

    【讨论】:

      【解决方案3】:

      EnumWindows 在您不知道确切的窗口名称(部分匹配)时很有用。

      我不确定“来自任务管理器的名称”是什么意思,但 FindWindow 函数的第二个参数应该与您的窗口标题匹配。

      一个使用EnumWindows的例子:

      BOOL CALLBACK WorkerProc(HWND hwnd, LPARAM lParam) {
          static TCHAR buffer[50];
      
          GetWindowText(hwnd, buffer, 50);
          if(_tcsstr(buffer, "window name goes here")) {
              // do something with hwnd here
              return FALSE;
          }
      
          return TRUE;
      }
      

      然后这样称呼它:

      EnumWindows(WorkerProc, NULL);
      

      【讨论】:

      • @arul:Enumwindows 要求我在我的应用程序中实现回调乐趣。我不知道该怎么做,更不用说在 enumwindows 枚举我的窗口后该怎么做:S .. 我尝试同时使用窗口的标题和进程名称,都失败了:S ...
      猜你喜欢
      • 2021-10-24
      • 1970-01-01
      • 2019-04-17
      • 2020-09-15
      • 2011-09-11
      • 1970-01-01
      • 2014-10-24
      • 2019-01-31
      • 1970-01-01
      相关资源
      最近更新 更多