在Cmd窗口之间切换焦点,强制对焦(保持程序运行的1个瞬间)

时间:2009-08-03 08:32:26

标签: c++ winapi cmd mutex

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

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

现在我正在尝试使用

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

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

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

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

3 个答案:

答案 0 :(得分:1)

以下是关于此主题的优秀文章http://delphi.about.com/od/windowsshellapi/l/aa100703c.htm

  

控制应用程序实例的数量

     Zarko Gajic的

- Delphi编程指南

     

在本文中,您将学习如何使用   “run-once enable”一个Delphi   可以检查它的应用程序   上一个(运行)实例。沿   这个过程,几种技巧   实施这样的检查将是   讨论;以及如何带来   你已经在运行的应用程序   前景,如果用户试图   再“运行一次”。到了最后   你要复印的文章   代码来控制你的行为   应用程序的多个实例:   可以选择限制数量   正在运行实例。

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

答案 1 :(得分:1)

当您不知道确切的窗口名称(部分匹配)时,

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);

答案 2 :(得分:1)

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